@dainamite/cpq 0.2.2
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/CHANGELOG.md +70 -0
- package/LICENSE +21 -0
- package/MIGRATION.md +236 -0
- package/README.md +108 -0
- package/dist/modules/cpq/acl.js +30 -0
- package/dist/modules/cpq/acl.js.map +7 -0
- package/dist/modules/cpq/api/_helpers/handleArcError.js +37 -0
- package/dist/modules/cpq/api/_helpers/handleArcError.js.map +7 -0
- package/dist/modules/cpq/api/attribute-options/route.js +47 -0
- package/dist/modules/cpq/api/attribute-options/route.js.map +7 -0
- package/dist/modules/cpq/api/bundle-slots/route.js +101 -0
- package/dist/modules/cpq/api/bundle-slots/route.js.map +7 -0
- package/dist/modules/cpq/api/bundle-tree/route.js +28 -0
- package/dist/modules/cpq/api/bundle-tree/route.js.map +7 -0
- package/dist/modules/cpq/api/context.js +29 -0
- package/dist/modules/cpq/api/context.js.map +7 -0
- package/dist/modules/cpq/api/inventory/assets/route.js +113 -0
- package/dist/modules/cpq/api/inventory/assets/route.js.map +7 -0
- package/dist/modules/cpq/api/inventory/assets/status/route.js +35 -0
- package/dist/modules/cpq/api/inventory/assets/status/route.js.map +7 -0
- package/dist/modules/cpq/api/inventory/customer/[customerId]/parent-items/route.js +30 -0
- package/dist/modules/cpq/api/inventory/customer/[customerId]/parent-items/route.js.map +7 -0
- package/dist/modules/cpq/api/inventory/customer/[customerId]/route.js +31 -0
- package/dist/modules/cpq/api/inventory/customer/[customerId]/route.js.map +7 -0
- package/dist/modules/cpq/api/inventory/subscription-items/route.js +99 -0
- package/dist/modules/cpq/api/inventory/subscription-items/route.js.map +7 -0
- package/dist/modules/cpq/api/inventory/subscriptions/[subscriptionId]/change-log/route.js +57 -0
- package/dist/modules/cpq/api/inventory/subscriptions/[subscriptionId]/change-log/route.js.map +7 -0
- package/dist/modules/cpq/api/inventory/subscriptions/expiring/route.js +62 -0
- package/dist/modules/cpq/api/inventory/subscriptions/expiring/route.js.map +7 -0
- package/dist/modules/cpq/api/inventory/subscriptions/route.js +116 -0
- package/dist/modules/cpq/api/inventory/subscriptions/route.js.map +7 -0
- package/dist/modules/cpq/api/inventory/subscriptions/status/route.js +35 -0
- package/dist/modules/cpq/api/inventory/subscriptions/status/route.js.map +7 -0
- package/dist/modules/cpq/api/offering-components/route.js +91 -0
- package/dist/modules/cpq/api/offering-components/route.js.map +7 -0
- package/dist/modules/cpq/api/orders/[orderId]/activate/route.js +39 -0
- package/dist/modules/cpq/api/orders/[orderId]/activate/route.js.map +7 -0
- package/dist/modules/cpq/api/orders/[orderId]/route.js +28 -0
- package/dist/modules/cpq/api/orders/[orderId]/route.js.map +7 -0
- package/dist/modules/cpq/api/orders/[orderId]/status/route.js +38 -0
- package/dist/modules/cpq/api/orders/[orderId]/status/route.js.map +7 -0
- package/dist/modules/cpq/api/orders/route.js +71 -0
- package/dist/modules/cpq/api/orders/route.js.map +7 -0
- package/dist/modules/cpq/api/price-rules/route.js +180 -0
- package/dist/modules/cpq/api/price-rules/route.js.map +7 -0
- package/dist/modules/cpq/api/pricing-table-entries/route.js +142 -0
- package/dist/modules/cpq/api/pricing-table-entries/route.js.map +7 -0
- package/dist/modules/cpq/api/pricing-tables/route.js +179 -0
- package/dist/modules/cpq/api/pricing-tables/route.js.map +7 -0
- package/dist/modules/cpq/api/product-attributes/route.js +160 -0
- package/dist/modules/cpq/api/product-attributes/route.js.map +7 -0
- package/dist/modules/cpq/api/product-charges/route.js +166 -0
- package/dist/modules/cpq/api/product-charges/route.js.map +7 -0
- package/dist/modules/cpq/api/product-offerings/route.js +294 -0
- package/dist/modules/cpq/api/product-offerings/route.js.map +7 -0
- package/dist/modules/cpq/api/product-relationships/route.js +144 -0
- package/dist/modules/cpq/api/product-relationships/route.js.map +7 -0
- package/dist/modules/cpq/api/product-specifications/route.js +292 -0
- package/dist/modules/cpq/api/product-specifications/route.js.map +7 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/cancel-meta/route.js +71 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/cancel-meta/route.js.map +7 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/clone/route.js +29 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/clone/route.js.map +7 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/items/[lineId]/route.js +54 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/items/[lineId]/route.js.map +7 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/items/route.js +27 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/items/route.js.map +7 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/merge-meta/route.js +72 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/merge-meta/route.js.map +7 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/recalculate/route.js +35 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/recalculate/route.js.map +7 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/route.js +102 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/route.js.map +7 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/status/route.js +27 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/status/route.js.map +7 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/target-subscriptions/[targetId]/route.js +79 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/target-subscriptions/[targetId]/route.js.map +7 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/target-subscriptions/route.js +95 -0
- package/dist/modules/cpq/api/quotes/[quoteId]/target-subscriptions/route.js.map +7 -0
- package/dist/modules/cpq/api/quotes/attributes/route.js +52 -0
- package/dist/modules/cpq/api/quotes/attributes/route.js.map +7 -0
- package/dist/modules/cpq/api/quotes/from-subscription/route.js +72 -0
- package/dist/modules/cpq/api/quotes/from-subscription/route.js.map +7 -0
- package/dist/modules/cpq/api/quotes/price/route.js +69 -0
- package/dist/modules/cpq/api/quotes/price/route.js.map +7 -0
- package/dist/modules/cpq/api/quotes/route.js +97 -0
- package/dist/modules/cpq/api/quotes/route.js.map +7 -0
- package/dist/modules/cpq/api/quotes/validate-relationships/route.js +86 -0
- package/dist/modules/cpq/api/quotes/validate-relationships/route.js.map +7 -0
- package/dist/modules/cpq/api/resolveQuotingService.js +7 -0
- package/dist/modules/cpq/api/resolveQuotingService.js.map +7 -0
- package/dist/modules/cpq/api/wizards/resolve/route.js +38 -0
- package/dist/modules/cpq/api/wizards/resolve/route.js.map +7 -0
- package/dist/modules/cpq/api/wizards/route.js +111 -0
- package/dist/modules/cpq/api/wizards/route.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/inventory/AssetsTable.js +136 -0
- package/dist/modules/cpq/backend/cpq/inventory/AssetsTable.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/inventory/SubscriptionsTable.js +185 -0
- package/dist/modules/cpq/backend/cpq/inventory/SubscriptionsTable.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/inventory/assets/[id]/page.js +343 -0
- package/dist/modules/cpq/backend/cpq/inventory/assets/[id]/page.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/inventory/assets/[id]/page.meta.js +13 -0
- package/dist/modules/cpq/backend/cpq/inventory/assets/[id]/page.meta.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/inventory/page.js +35 -0
- package/dist/modules/cpq/backend/cpq/inventory/page.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/inventory/page.meta.js +18 -0
- package/dist/modules/cpq/backend/cpq/inventory/page.meta.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/inventory/shared.js +20 -0
- package/dist/modules/cpq/backend/cpq/inventory/shared.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.js +794 -0
- package/dist/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.meta.js +13 -0
- package/dist/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.meta.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/offerings/[id]/page.js +917 -0
- package/dist/modules/cpq/backend/cpq/offerings/[id]/page.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/offerings/page.js +405 -0
- package/dist/modules/cpq/backend/cpq/offerings/page.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/offerings/page.meta.js +18 -0
- package/dist/modules/cpq/backend/cpq/offerings/page.meta.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/orders/[id]/page.js +677 -0
- package/dist/modules/cpq/backend/cpq/orders/[id]/page.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/orders/page.js +134 -0
- package/dist/modules/cpq/backend/cpq/orders/page.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/orders/page.meta.js +18 -0
- package/dist/modules/cpq/backend/cpq/orders/page.meta.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/price-rules/PriceRuleForm.js +272 -0
- package/dist/modules/cpq/backend/cpq/price-rules/PriceRuleForm.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/price-rules/[id]/page.js +407 -0
- package/dist/modules/cpq/backend/cpq/price-rules/[id]/page.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/price-rules/[id]/page.meta.js +13 -0
- package/dist/modules/cpq/backend/cpq/price-rules/[id]/page.meta.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/price-rules/page.js +211 -0
- package/dist/modules/cpq/backend/cpq/price-rules/page.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/price-rules/page.meta.js +18 -0
- package/dist/modules/cpq/backend/cpq/price-rules/page.meta.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/pricing/[id]/EntriesEditor.js +275 -0
- package/dist/modules/cpq/backend/cpq/pricing/[id]/EntriesEditor.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/pricing/[id]/ImportPreview.js +112 -0
- package/dist/modules/cpq/backend/cpq/pricing/[id]/ImportPreview.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/pricing/[id]/page.js +492 -0
- package/dist/modules/cpq/backend/cpq/pricing/[id]/page.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/pricing/[id]/xlsxExport.js +50 -0
- package/dist/modules/cpq/backend/cpq/pricing/[id]/xlsxExport.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/pricing/[id]/xlsxImport.js +249 -0
- package/dist/modules/cpq/backend/cpq/pricing/[id]/xlsxImport.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/pricing/page.js +87 -0
- package/dist/modules/cpq/backend/cpq/pricing/page.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/pricing/page.meta.js +18 -0
- package/dist/modules/cpq/backend/cpq/pricing/page.meta.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/quotes/[id]/_components/ArcQuoteConfigurator.js +652 -0
- package/dist/modules/cpq/backend/cpq/quotes/[id]/_components/ArcQuoteConfigurator.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/quotes/[id]/page.js +1289 -0
- package/dist/modules/cpq/backend/cpq/quotes/[id]/page.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/quotes/page.js +283 -0
- package/dist/modules/cpq/backend/cpq/quotes/page.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/quotes/page.meta.js +18 -0
- package/dist/modules/cpq/backend/cpq/quotes/page.meta.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/specifications/[id]/DependsOnRulesEditor.js +214 -0
- package/dist/modules/cpq/backend/cpq/specifications/[id]/DependsOnRulesEditor.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/specifications/[id]/page.js +1399 -0
- package/dist/modules/cpq/backend/cpq/specifications/[id]/page.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/specifications/page.js +148 -0
- package/dist/modules/cpq/backend/cpq/specifications/page.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/specifications/page.meta.js +18 -0
- package/dist/modules/cpq/backend/cpq/specifications/page.meta.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/wizards/[definitionCode]/detail/page.js +204 -0
- package/dist/modules/cpq/backend/cpq/wizards/[definitionCode]/detail/page.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/wizards/[definitionCode]/page.js +191 -0
- package/dist/modules/cpq/backend/cpq/wizards/[definitionCode]/page.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/wizards/page.js +119 -0
- package/dist/modules/cpq/backend/cpq/wizards/page.js.map +7 -0
- package/dist/modules/cpq/backend/cpq/wizards/page.meta.js +18 -0
- package/dist/modules/cpq/backend/cpq/wizards/page.meta.js.map +7 -0
- package/dist/modules/cpq/ce.js +151 -0
- package/dist/modules/cpq/ce.js.map +7 -0
- package/dist/modules/cpq/cli.js +11 -0
- package/dist/modules/cpq/cli.js.map +7 -0
- package/dist/modules/cpq/components/CpqListView.js +265 -0
- package/dist/modules/cpq/components/CpqListView.js.map +7 -0
- package/dist/modules/cpq/components/NumberInput.js +95 -0
- package/dist/modules/cpq/components/NumberInput.js.map +7 -0
- package/dist/modules/cpq/components/StatusPath.js +60 -0
- package/dist/modules/cpq/components/StatusPath.js.map +7 -0
- package/dist/modules/cpq/components/statusMaps.js +66 -0
- package/dist/modules/cpq/components/statusMaps.js.map +7 -0
- package/dist/modules/cpq/components/useCpqRowActions.js +125 -0
- package/dist/modules/cpq/components/useCpqRowActions.js.map +7 -0
- package/dist/modules/cpq/data/entities.js +1556 -0
- package/dist/modules/cpq/data/entities.js.map +7 -0
- package/dist/modules/cpq/data/validators.js +575 -0
- package/dist/modules/cpq/data/validators.js.map +7 -0
- package/dist/modules/cpq/di.js +57 -0
- package/dist/modules/cpq/di.js.map +7 -0
- package/dist/modules/cpq/events.js +50 -0
- package/dist/modules/cpq/events.js.map +7 -0
- package/dist/modules/cpq/index.js +16 -0
- package/dist/modules/cpq/index.js.map +7 -0
- package/dist/modules/cpq/lib/seeds/api.js +32 -0
- package/dist/modules/cpq/lib/seeds/api.js.map +7 -0
- package/dist/modules/cpq/lib/seeds/tenant-provisioning.js +158 -0
- package/dist/modules/cpq/lib/seeds/tenant-provisioning.js.map +7 -0
- package/dist/modules/cpq/lib/seeds.js +6 -0
- package/dist/modules/cpq/lib/seeds.js.map +7 -0
- package/dist/modules/cpq/migrations/Migration20260220220000_cpq.js +40 -0
- package/dist/modules/cpq/migrations/Migration20260220220000_cpq.js.map +7 -0
- package/dist/modules/cpq/migrations/Migration20260330000000_cpq_product_domain.js +54 -0
- package/dist/modules/cpq/migrations/Migration20260330000000_cpq_product_domain.js.map +7 -0
- package/dist/modules/cpq/migrations/Migration20260331000000_cpq_charge_unique_per_offering.js +15 -0
- package/dist/modules/cpq/migrations/Migration20260331000000_cpq_charge_unique_per_offering.js.map +7 -0
- package/dist/modules/cpq/migrations/Migration20260401000000_cpq_quoting_v2.js +62 -0
- package/dist/modules/cpq/migrations/Migration20260401000000_cpq_quoting_v2.js.map +7 -0
- package/dist/modules/cpq/migrations/Migration20260402000000_cpq_workflows.js +56 -0
- package/dist/modules/cpq/migrations/Migration20260402000000_cpq_workflows.js.map +7 -0
- package/dist/modules/cpq/migrations/Migration20260407000000_cpq_pricing_tables_v2.js +26 -0
- package/dist/modules/cpq/migrations/Migration20260407000000_cpq_pricing_tables_v2.js.map +7 -0
- package/dist/modules/cpq/migrations/Migration20260407100000_cpq_price_rules.js +37 -0
- package/dist/modules/cpq/migrations/Migration20260407100000_cpq_price_rules.js.map +7 -0
- package/dist/modules/cpq/migrations/Migration20260408000000_cpq_price_rules.js +35 -0
- package/dist/modules/cpq/migrations/Migration20260408000000_cpq_price_rules.js.map +7 -0
- package/dist/modules/cpq/migrations/Migration20260410000000_cpq_drop_datacentres_inventory.js +21 -0
- package/dist/modules/cpq/migrations/Migration20260410000000_cpq_drop_datacentres_inventory.js.map +7 -0
- package/dist/modules/cpq/migrations/Migration20260410000000_cpq_wizard_rename.js +46 -0
- package/dist/modules/cpq/migrations/Migration20260410000000_cpq_wizard_rename.js.map +7 -0
- package/dist/modules/cpq/migrations/Migration20260410100000_cpq_inventory.js +118 -0
- package/dist/modules/cpq/migrations/Migration20260410100000_cpq_inventory.js.map +7 -0
- package/dist/modules/cpq/migrations/Migration20260411000000_cpq_orders.js +63 -0
- package/dist/modules/cpq/migrations/Migration20260411000000_cpq_orders.js.map +7 -0
- package/dist/modules/cpq/migrations/Migration20260412000000_cpq_bundled_offerings.js +28 -0
- package/dist/modules/cpq/migrations/Migration20260412000000_cpq_bundled_offerings.js.map +7 -0
- package/dist/modules/cpq/migrations/Migration20260504064621_cpq_arc.js +36 -0
- package/dist/modules/cpq/migrations/Migration20260504064621_cpq_arc.js.map +7 -0
- package/dist/modules/cpq/migrations/Migration20260514000000_cpq_spec_merge_retired_deprecated.js +14 -0
- package/dist/modules/cpq/migrations/Migration20260514000000_cpq_spec_merge_retired_deprecated.js.map +7 -0
- package/dist/modules/cpq/migrations/Migration20260514100000_cpq_offering_merge_retired_deprecated.js +14 -0
- package/dist/modules/cpq/migrations/Migration20260514100000_cpq_offering_merge_retired_deprecated.js.map +7 -0
- package/dist/modules/cpq/migrations/Migration20260514110000_cpq_list_search_indexes.js +58 -0
- package/dist/modules/cpq/migrations/Migration20260514110000_cpq_list_search_indexes.js.map +7 -0
- package/dist/modules/cpq/migrations/Migration20260515000000_cpq_inventory_subscriptions_search_indexes.js +29 -0
- package/dist/modules/cpq/migrations/Migration20260515000000_cpq_inventory_subscriptions_search_indexes.js.map +7 -0
- package/dist/modules/cpq/services/cpqBundleService.js +447 -0
- package/dist/modules/cpq/services/cpqBundleService.js.map +7 -0
- package/dist/modules/cpq/services/cpqInventoryService.js +1371 -0
- package/dist/modules/cpq/services/cpqInventoryService.js.map +7 -0
- package/dist/modules/cpq/services/cpqOrderService.js +901 -0
- package/dist/modules/cpq/services/cpqOrderService.js.map +7 -0
- package/dist/modules/cpq/services/cpqPricingService.js +289 -0
- package/dist/modules/cpq/services/cpqPricingService.js.map +7 -0
- package/dist/modules/cpq/services/cpqProductService.js +204 -0
- package/dist/modules/cpq/services/cpqProductService.js.map +7 -0
- package/dist/modules/cpq/services/cpqQuotingService.js +1867 -0
- package/dist/modules/cpq/services/cpqQuotingService.js.map +7 -0
- package/dist/modules/cpq/services/cpqValidationService.js +234 -0
- package/dist/modules/cpq/services/cpqValidationService.js.map +7 -0
- package/dist/modules/cpq/services/cpqWizardService.js +137 -0
- package/dist/modules/cpq/services/cpqWizardService.js.map +7 -0
- package/dist/modules/cpq/services/types.js +114 -0
- package/dist/modules/cpq/services/types.js.map +7 -0
- package/dist/modules/cpq/setup.js +49 -0
- package/dist/modules/cpq/setup.js.map +7 -0
- package/dist/modules/cpq/subscribers/subscription-amended-log.js +18 -0
- package/dist/modules/cpq/subscribers/subscription-amended-log.js.map +7 -0
- package/dist/modules/cpq/subscribers/subscription-cancelled-log.js +19 -0
- package/dist/modules/cpq/subscribers/subscription-cancelled-log.js.map +7 -0
- package/dist/modules/cpq/subscribers/subscription-merged-log.js +20 -0
- package/dist/modules/cpq/subscribers/subscription-merged-log.js.map +7 -0
- package/dist/modules/cpq/subscribers/subscription-renewed-log.js +18 -0
- package/dist/modules/cpq/subscribers/subscription-renewed-log.js.map +7 -0
- package/dist/modules/cpq/subscribers/subscription-superseded-log.js +18 -0
- package/dist/modules/cpq/subscribers/subscription-superseded-log.js.map +7 -0
- package/dist/modules/cpq/widgets/injection/customer-inventory/widget.client.js +192 -0
- package/dist/modules/cpq/widgets/injection/customer-inventory/widget.client.js.map +7 -0
- package/dist/modules/cpq/widgets/injection/customer-inventory/widget.js +17 -0
- package/dist/modules/cpq/widgets/injection/customer-inventory/widget.js.map +7 -0
- package/dist/modules/cpq/widgets/injection/order-cpq-tab/widget.client.js +79 -0
- package/dist/modules/cpq/widgets/injection/order-cpq-tab/widget.client.js.map +7 -0
- package/dist/modules/cpq/widgets/injection/order-cpq-tab/widget.js +17 -0
- package/dist/modules/cpq/widgets/injection/order-cpq-tab/widget.js.map +7 -0
- package/dist/modules/cpq/widgets/injection/quote-configurator/widget.client.js +181 -0
- package/dist/modules/cpq/widgets/injection/quote-configurator/widget.client.js.map +7 -0
- package/dist/modules/cpq/widgets/injection/quote-configurator/widget.js +17 -0
- package/dist/modules/cpq/widgets/injection/quote-configurator/widget.js.map +7 -0
- package/dist/modules/cpq/widgets/injection-table.js +44 -0
- package/dist/modules/cpq/widgets/injection-table.js.map +7 -0
- package/dist/modules/cpq/workflows/WizardRunner.js +113 -0
- package/dist/modules/cpq/workflows/WizardRunner.js.map +7 -0
- package/dist/modules/cpq/workflows/WizardTrigger.js +116 -0
- package/dist/modules/cpq/workflows/WizardTrigger.js.map +7 -0
- package/dist/modules/cpq/workflows/engine.js +188 -0
- package/dist/modules/cpq/workflows/engine.js.map +7 -0
- package/dist/modules/cpq/workflows/registry.js +16 -0
- package/dist/modules/cpq/workflows/registry.js.map +7 -0
- package/dist/modules/cpq/workflows/steps/CustomerSelectStep.js +119 -0
- package/dist/modules/cpq/workflows/steps/CustomerSelectStep.js.map +7 -0
- package/dist/modules/cpq/workflows/steps/InventorySelectStep.js +24 -0
- package/dist/modules/cpq/workflows/steps/InventorySelectStep.js.map +7 -0
- package/dist/modules/cpq/workflows/steps/ItemListStep.js +115 -0
- package/dist/modules/cpq/workflows/steps/ItemListStep.js.map +7 -0
- package/dist/modules/cpq/workflows/steps/OfferingSelectStep.js +327 -0
- package/dist/modules/cpq/workflows/steps/OfferingSelectStep.js.map +7 -0
- package/dist/modules/cpq/workflows/steps/ProductConfigureStep.js +231 -0
- package/dist/modules/cpq/workflows/steps/ProductConfigureStep.js.map +7 -0
- package/dist/modules/cpq/workflows/steps/ReviewStep.js +152 -0
- package/dist/modules/cpq/workflows/steps/ReviewStep.js.map +7 -0
- package/dist/modules/cpq/workflows/steps/index.js +49 -0
- package/dist/modules/cpq/workflows/steps/index.js.map +7 -0
- package/dist/modules/cpq/workflows/types.js +1 -0
- package/dist/modules/cpq/workflows/types.js.map +7 -0
- package/package.json +150 -0
- package/src/modules/cpq/__integration__/TC-CPQ-001.spec.ts +177 -0
- package/src/modules/cpq/__integration__/TC-CPQ-002.spec.ts +123 -0
- package/src/modules/cpq/__integration__/TC-CPQ-003.spec.ts +115 -0
- package/src/modules/cpq/__integration__/TC-CPQ-004.spec.ts +184 -0
- package/src/modules/cpq/__integration__/TC-CPQ-005.spec.ts +43 -0
- package/src/modules/cpq/__integration__/TC-CPQ-006.spec.ts +87 -0
- package/src/modules/cpq/__integration__/TC-CPQ-007.spec.ts +79 -0
- package/src/modules/cpq/__integration__/TC-CPQ-008.spec.ts +55 -0
- package/src/modules/cpq/__integration__/TC-CPQ-009.spec.ts +45 -0
- package/src/modules/cpq/__integration__/TC-CPQ-010.spec.ts +54 -0
- package/src/modules/cpq/__integration__/TC-CPQ-011.spec.ts +24 -0
- package/src/modules/cpq/__integration__/TC-CPQ-012.spec.ts +62 -0
- package/src/modules/cpq/__integration__/TC-CPQ-ARC-001.spec.ts +52 -0
- package/src/modules/cpq/__integration__/TC-CPQ-ARC-002.spec.ts +65 -0
- package/src/modules/cpq/__integration__/TC-CPQ-ARC-003.spec.ts +107 -0
- package/src/modules/cpq/__integration__/TC-CPQ-ARC-004.spec.ts +74 -0
- package/src/modules/cpq/__integration__/TC-CPQ-ARC-005.spec.ts +86 -0
- package/src/modules/cpq/__integration__/TC-CPQ-ARC-006.spec.ts +79 -0
- package/src/modules/cpq/__integration__/TC-CPQ-ARC-007.spec.ts +63 -0
- package/src/modules/cpq/__integration__/TC-CPQ-ARC-008.spec.ts +62 -0
- package/src/modules/cpq/__integration__/TC-CPQ-ARC-009.spec.ts +62 -0
- package/src/modules/cpq/__integration__/TC-CPQ-ARC-010.spec.ts +59 -0
- package/src/modules/cpq/__integration__/TC-CPQ-ARC-011.spec.ts +128 -0
- package/src/modules/cpq/__integration__/_helpers/cpqArcFixtures.ts +208 -0
- package/src/modules/cpq/__tests__/package-isolation.test.ts +232 -0
- package/src/modules/cpq/acl.ts +26 -0
- package/src/modules/cpq/api/_helpers/__tests__/handleArcError.test.ts +117 -0
- package/src/modules/cpq/api/_helpers/handleArcError.ts +81 -0
- package/src/modules/cpq/api/attribute-options/route.ts +55 -0
- package/src/modules/cpq/api/bundle-slots/route.ts +112 -0
- package/src/modules/cpq/api/bundle-tree/route.ts +31 -0
- package/src/modules/cpq/api/context.ts +39 -0
- package/src/modules/cpq/api/inventory/assets/route.ts +123 -0
- package/src/modules/cpq/api/inventory/assets/status/route.ts +34 -0
- package/src/modules/cpq/api/inventory/customer/[customerId]/parent-items/route.ts +30 -0
- package/src/modules/cpq/api/inventory/customer/[customerId]/route.ts +31 -0
- package/src/modules/cpq/api/inventory/subscription-items/route.ts +107 -0
- package/src/modules/cpq/api/inventory/subscriptions/[subscriptionId]/change-log/route.ts +64 -0
- package/src/modules/cpq/api/inventory/subscriptions/expiring/route.ts +66 -0
- package/src/modules/cpq/api/inventory/subscriptions/route.ts +126 -0
- package/src/modules/cpq/api/inventory/subscriptions/status/route.ts +34 -0
- package/src/modules/cpq/api/offering-components/route.ts +103 -0
- package/src/modules/cpq/api/orders/[orderId]/activate/route.ts +48 -0
- package/src/modules/cpq/api/orders/[orderId]/route.ts +28 -0
- package/src/modules/cpq/api/orders/[orderId]/status/route.ts +38 -0
- package/src/modules/cpq/api/orders/route.ts +77 -0
- package/src/modules/cpq/api/price-rules/route.ts +210 -0
- package/src/modules/cpq/api/pricing-table-entries/route.ts +159 -0
- package/src/modules/cpq/api/pricing-tables/route.ts +202 -0
- package/src/modules/cpq/api/product-attributes/route.ts +175 -0
- package/src/modules/cpq/api/product-charges/route.ts +181 -0
- package/src/modules/cpq/api/product-offerings/route.ts +329 -0
- package/src/modules/cpq/api/product-relationships/route.ts +156 -0
- package/src/modules/cpq/api/product-specifications/route.ts +325 -0
- package/src/modules/cpq/api/quotes/[quoteId]/cancel-meta/route.ts +77 -0
- package/src/modules/cpq/api/quotes/[quoteId]/clone/route.ts +28 -0
- package/src/modules/cpq/api/quotes/[quoteId]/items/[lineId]/route.ts +55 -0
- package/src/modules/cpq/api/quotes/[quoteId]/items/route.ts +26 -0
- package/src/modules/cpq/api/quotes/[quoteId]/merge-meta/route.ts +78 -0
- package/src/modules/cpq/api/quotes/[quoteId]/recalculate/route.ts +34 -0
- package/src/modules/cpq/api/quotes/[quoteId]/route.ts +109 -0
- package/src/modules/cpq/api/quotes/[quoteId]/status/route.ts +26 -0
- package/src/modules/cpq/api/quotes/[quoteId]/target-subscriptions/[targetId]/route.ts +91 -0
- package/src/modules/cpq/api/quotes/[quoteId]/target-subscriptions/route.ts +107 -0
- package/src/modules/cpq/api/quotes/attributes/route.ts +61 -0
- package/src/modules/cpq/api/quotes/from-subscription/route.ts +85 -0
- package/src/modules/cpq/api/quotes/price/route.ts +81 -0
- package/src/modules/cpq/api/quotes/route.ts +114 -0
- package/src/modules/cpq/api/quotes/validate-relationships/route.ts +100 -0
- package/src/modules/cpq/api/resolveQuotingService.ts +11 -0
- package/src/modules/cpq/api/wizards/resolve/route.ts +39 -0
- package/src/modules/cpq/api/wizards/route.ts +127 -0
- package/src/modules/cpq/backend/cpq/inventory/AssetsTable.tsx +166 -0
- package/src/modules/cpq/backend/cpq/inventory/SubscriptionsTable.tsx +251 -0
- package/src/modules/cpq/backend/cpq/inventory/assets/[id]/page.meta.ts +9 -0
- package/src/modules/cpq/backend/cpq/inventory/assets/[id]/page.tsx +440 -0
- package/src/modules/cpq/backend/cpq/inventory/page.meta.ts +16 -0
- package/src/modules/cpq/backend/cpq/inventory/page.tsx +49 -0
- package/src/modules/cpq/backend/cpq/inventory/shared.tsx +32 -0
- package/src/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.meta.ts +9 -0
- package/src/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.tsx +1085 -0
- package/src/modules/cpq/backend/cpq/offerings/[id]/page.tsx +1165 -0
- package/src/modules/cpq/backend/cpq/offerings/page.meta.ts +16 -0
- package/src/modules/cpq/backend/cpq/offerings/page.tsx +468 -0
- package/src/modules/cpq/backend/cpq/orders/[id]/page.tsx +921 -0
- package/src/modules/cpq/backend/cpq/orders/page.meta.ts +16 -0
- package/src/modules/cpq/backend/cpq/orders/page.tsx +182 -0
- package/src/modules/cpq/backend/cpq/price-rules/PriceRuleForm.tsx +310 -0
- package/src/modules/cpq/backend/cpq/price-rules/[id]/page.meta.ts +9 -0
- package/src/modules/cpq/backend/cpq/price-rules/[id]/page.tsx +472 -0
- package/src/modules/cpq/backend/cpq/price-rules/page.meta.ts +16 -0
- package/src/modules/cpq/backend/cpq/price-rules/page.tsx +253 -0
- package/src/modules/cpq/backend/cpq/pricing/[id]/EntriesEditor.tsx +431 -0
- package/src/modules/cpq/backend/cpq/pricing/[id]/ImportPreview.tsx +122 -0
- package/src/modules/cpq/backend/cpq/pricing/[id]/page.tsx +588 -0
- package/src/modules/cpq/backend/cpq/pricing/[id]/xlsxExport.ts +90 -0
- package/src/modules/cpq/backend/cpq/pricing/[id]/xlsxImport.ts +338 -0
- package/src/modules/cpq/backend/cpq/pricing/page.meta.ts +16 -0
- package/src/modules/cpq/backend/cpq/pricing/page.tsx +111 -0
- package/src/modules/cpq/backend/cpq/quotes/[id]/_components/ArcQuoteConfigurator.tsx +737 -0
- package/src/modules/cpq/backend/cpq/quotes/[id]/page.tsx +1721 -0
- package/src/modules/cpq/backend/cpq/quotes/page.meta.ts +16 -0
- package/src/modules/cpq/backend/cpq/quotes/page.tsx +370 -0
- package/src/modules/cpq/backend/cpq/specifications/[id]/DependsOnRulesEditor.tsx +300 -0
- package/src/modules/cpq/backend/cpq/specifications/[id]/page.tsx +1722 -0
- package/src/modules/cpq/backend/cpq/specifications/page.meta.ts +16 -0
- package/src/modules/cpq/backend/cpq/specifications/page.tsx +191 -0
- package/src/modules/cpq/backend/cpq/wizards/[definitionCode]/detail/page.tsx +319 -0
- package/src/modules/cpq/backend/cpq/wizards/[definitionCode]/page.tsx +234 -0
- package/src/modules/cpq/backend/cpq/wizards/page.meta.ts +16 -0
- package/src/modules/cpq/backend/cpq/wizards/page.tsx +141 -0
- package/src/modules/cpq/ce.ts +150 -0
- package/src/modules/cpq/cli.ts +10 -0
- package/src/modules/cpq/components/CpqListView.tsx +431 -0
- package/src/modules/cpq/components/NumberInput.tsx +166 -0
- package/src/modules/cpq/components/StatusPath.tsx +116 -0
- package/src/modules/cpq/components/statusMaps.ts +148 -0
- package/src/modules/cpq/components/useCpqRowActions.tsx +183 -0
- package/src/modules/cpq/data/__tests__/validators.arc.test.ts +271 -0
- package/src/modules/cpq/data/__tests__/validators.test.ts +782 -0
- package/src/modules/cpq/data/entities.ts +1467 -0
- package/src/modules/cpq/data/validators.ts +663 -0
- package/src/modules/cpq/di.ts +70 -0
- package/src/modules/cpq/events.ts +62 -0
- package/src/modules/cpq/index.ts +15 -0
- package/src/modules/cpq/lib/seeds/__tests__/api.test.ts +86 -0
- package/src/modules/cpq/lib/seeds/__tests__/tenant-provisioning.test.ts +349 -0
- package/src/modules/cpq/lib/seeds/api.ts +119 -0
- package/src/modules/cpq/lib/seeds/tenant-provisioning.ts +239 -0
- package/src/modules/cpq/lib/seeds.ts +18 -0
- package/src/modules/cpq/migrations/.snapshot-open-mercato.json +7473 -0
- package/src/modules/cpq/migrations/Migration20260220220000_cpq.ts +51 -0
- package/src/modules/cpq/migrations/Migration20260330000000_cpq_product_domain.ts +70 -0
- package/src/modules/cpq/migrations/Migration20260331000000_cpq_charge_unique_per_offering.ts +15 -0
- package/src/modules/cpq/migrations/Migration20260401000000_cpq_quoting_v2.ts +73 -0
- package/src/modules/cpq/migrations/Migration20260402000000_cpq_workflows.ts +59 -0
- package/src/modules/cpq/migrations/Migration20260407000000_cpq_pricing_tables_v2.ts +30 -0
- package/src/modules/cpq/migrations/Migration20260407100000_cpq_price_rules.ts +36 -0
- package/src/modules/cpq/migrations/Migration20260408000000_cpq_price_rules.ts +33 -0
- package/src/modules/cpq/migrations/Migration20260410000000_cpq_drop_datacentres_inventory.ts +22 -0
- package/src/modules/cpq/migrations/Migration20260410000000_cpq_wizard_rename.ts +56 -0
- package/src/modules/cpq/migrations/Migration20260410100000_cpq_inventory.ts +118 -0
- package/src/modules/cpq/migrations/Migration20260411000000_cpq_orders.ts +62 -0
- package/src/modules/cpq/migrations/Migration20260412000000_cpq_bundled_offerings.ts +33 -0
- package/src/modules/cpq/migrations/Migration20260504064621_cpq_arc.ts +68 -0
- package/src/modules/cpq/migrations/Migration20260514000000_cpq_spec_merge_retired_deprecated.ts +30 -0
- package/src/modules/cpq/migrations/Migration20260514100000_cpq_offering_merge_retired_deprecated.ts +27 -0
- package/src/modules/cpq/migrations/Migration20260514110000_cpq_list_search_indexes.ts +82 -0
- package/src/modules/cpq/migrations/Migration20260515000000_cpq_inventory_subscriptions_search_indexes.ts +52 -0
- package/src/modules/cpq/services/__tests__/_helpers/mockEm.ts +59 -0
- package/src/modules/cpq/services/__tests__/cpqBundleService.test.ts +661 -0
- package/src/modules/cpq/services/__tests__/cpqInventoryService.arc.test.ts +357 -0
- package/src/modules/cpq/services/__tests__/cpqInventoryService.test.ts +718 -0
- package/src/modules/cpq/services/__tests__/cpqOrderService.test.ts +603 -0
- package/src/modules/cpq/services/__tests__/cpqPricingService.test.ts +1012 -0
- package/src/modules/cpq/services/__tests__/cpqProductService.test.ts +603 -0
- package/src/modules/cpq/services/__tests__/cpqQuotingService.arc.test.ts +143 -0
- package/src/modules/cpq/services/__tests__/cpqQuotingService.test.ts +658 -0
- package/src/modules/cpq/services/__tests__/cpqValidationService.test.ts +811 -0
- package/src/modules/cpq/services/__tests__/cpqWizardService.test.ts +389 -0
- package/src/modules/cpq/services/__tests__/types.test.ts +359 -0
- package/src/modules/cpq/services/cpqBundleService.ts +671 -0
- package/src/modules/cpq/services/cpqInventoryService.ts +1929 -0
- package/src/modules/cpq/services/cpqOrderService.ts +1230 -0
- package/src/modules/cpq/services/cpqPricingService.ts +412 -0
- package/src/modules/cpq/services/cpqProductService.ts +311 -0
- package/src/modules/cpq/services/cpqQuotingService.ts +2638 -0
- package/src/modules/cpq/services/cpqValidationService.ts +323 -0
- package/src/modules/cpq/services/cpqWizardService.ts +204 -0
- package/src/modules/cpq/services/types.ts +303 -0
- package/src/modules/cpq/setup.ts +63 -0
- package/src/modules/cpq/subscribers/subscription-amended-log.ts +20 -0
- package/src/modules/cpq/subscribers/subscription-cancelled-log.ts +19 -0
- package/src/modules/cpq/subscribers/subscription-merged-log.ts +22 -0
- package/src/modules/cpq/subscribers/subscription-renewed-log.ts +18 -0
- package/src/modules/cpq/subscribers/subscription-superseded-log.ts +19 -0
- package/src/modules/cpq/widgets/injection/customer-inventory/widget.client.tsx +339 -0
- package/src/modules/cpq/widgets/injection/customer-inventory/widget.ts +16 -0
- package/src/modules/cpq/widgets/injection/order-cpq-tab/widget.client.tsx +96 -0
- package/src/modules/cpq/widgets/injection/order-cpq-tab/widget.ts +16 -0
- package/src/modules/cpq/widgets/injection/quote-configurator/widget.client.tsx +265 -0
- package/src/modules/cpq/widgets/injection/quote-configurator/widget.ts +16 -0
- package/src/modules/cpq/widgets/injection-table.ts +42 -0
- package/src/modules/cpq/workflows/WizardRunner.tsx +158 -0
- package/src/modules/cpq/workflows/WizardTrigger.tsx +142 -0
- package/src/modules/cpq/workflows/engine.tsx +278 -0
- package/src/modules/cpq/workflows/registry.ts +15 -0
- package/src/modules/cpq/workflows/steps/CustomerSelectStep.tsx +136 -0
- package/src/modules/cpq/workflows/steps/InventorySelectStep.tsx +34 -0
- package/src/modules/cpq/workflows/steps/ItemListStep.tsx +146 -0
- package/src/modules/cpq/workflows/steps/OfferingSelectStep.tsx +438 -0
- package/src/modules/cpq/workflows/steps/ProductConfigureStep.tsx +287 -0
- package/src/modules/cpq/workflows/steps/ReviewStep.tsx +219 -0
- package/src/modules/cpq/workflows/steps/index.ts +51 -0
- package/src/modules/cpq/workflows/types.ts +102 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { resolveCpqRouteContext } from "../../../../context.js";
|
|
3
|
+
import { cpqChangeLogQuerySchema } from "../../../../../data/validators.js";
|
|
4
|
+
import { handleArcError } from "../../../../_helpers/handleArcError.js";
|
|
5
|
+
const metadata = {
|
|
6
|
+
GET: { requireAuth: true, requireFeatures: ["cpq.arc.changelog.view"] }
|
|
7
|
+
};
|
|
8
|
+
async function GET(req, { params }) {
|
|
9
|
+
try {
|
|
10
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
11
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
12
|
+
const { subscriptionId } = await params;
|
|
13
|
+
const url = new URL(req.url);
|
|
14
|
+
const query = cpqChangeLogQuerySchema.parse({
|
|
15
|
+
page: url.searchParams.get("page") ?? void 0,
|
|
16
|
+
pageSize: url.searchParams.get("pageSize") ?? void 0
|
|
17
|
+
});
|
|
18
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
19
|
+
const service = ctx.container.resolve("cpqInventoryService");
|
|
20
|
+
const result = await service.listChangeLog(
|
|
21
|
+
subscriptionId,
|
|
22
|
+
{ page: query.page, pageSize: query.pageSize },
|
|
23
|
+
scope
|
|
24
|
+
);
|
|
25
|
+
return NextResponse.json(result);
|
|
26
|
+
} catch (err) {
|
|
27
|
+
return handleArcError(err, "cpq/inventory/subscriptions/[subscriptionId]/change-log.GET");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const openApi = {
|
|
31
|
+
"/api/cpq/inventory/subscriptions/{subscriptionId}/change-log": {
|
|
32
|
+
parameters: [
|
|
33
|
+
{
|
|
34
|
+
name: "subscriptionId",
|
|
35
|
+
in: "path",
|
|
36
|
+
required: true,
|
|
37
|
+
schema: { type: "string", format: "uuid" }
|
|
38
|
+
},
|
|
39
|
+
{ name: "page", in: "query", schema: { type: "integer", minimum: 1, default: 1 } },
|
|
40
|
+
{ name: "pageSize", in: "query", schema: { type: "integer", minimum: 1, maximum: 100 } }
|
|
41
|
+
],
|
|
42
|
+
get: {
|
|
43
|
+
tags: ["CPQ ARC"],
|
|
44
|
+
summary: "List ARC change-log entries for a subscription",
|
|
45
|
+
responses: {
|
|
46
|
+
"200": { description: "Paginated change log" },
|
|
47
|
+
"401": { description: "Unauthorized" }
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
export {
|
|
53
|
+
GET,
|
|
54
|
+
metadata,
|
|
55
|
+
openApi
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../../src/modules/cpq/api/inventory/subscriptions/%5BsubscriptionId%5D/change-log/route.ts"],
|
|
4
|
+
"sourcesContent": ["import { NextResponse } from 'next/server'\nimport { resolveCpqRouteContext } from '../../../../context'\nimport { cpqChangeLogQuerySchema } from '../../../../../data/validators'\nimport type { DefaultCpqInventoryService } from '../../../../../services/cpqInventoryService'\nimport { handleArcError } from '../../../../_helpers/handleArcError'\n\n/**\n * GET /api/cpq/inventory/subscriptions/[subscriptionId]/change-log\n *\n * Paginated CpqSubscriptionChangeLog timeline for a subscription\n * (most recent first).\n */\nexport const metadata = {\n GET: { requireAuth: true, requireFeatures: ['cpq.arc.changelog.view'] },\n}\n\nexport async function GET(\n req: Request,\n { params }: { params: Promise<{ subscriptionId: string }> },\n) {\n try {\n const ctx = await resolveCpqRouteContext(req)\n if (!ctx.auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n const { subscriptionId } = await params\n const url = new URL(req.url)\n const query = cpqChangeLogQuerySchema.parse({\n page: url.searchParams.get('page') ?? undefined,\n pageSize: url.searchParams.get('pageSize') ?? undefined,\n })\n const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId }\n const service = ctx.container.resolve('cpqInventoryService') as DefaultCpqInventoryService\n const result = await service.listChangeLog(\n subscriptionId,\n { page: query.page, pageSize: query.pageSize },\n scope,\n )\n return NextResponse.json(result)\n } catch (err) {\n return handleArcError(err, 'cpq/inventory/subscriptions/[subscriptionId]/change-log.GET')\n }\n}\n\nexport const openApi = {\n '/api/cpq/inventory/subscriptions/{subscriptionId}/change-log': {\n parameters: [\n {\n name: 'subscriptionId',\n in: 'path',\n required: true,\n schema: { type: 'string', format: 'uuid' },\n },\n { name: 'page', in: 'query', schema: { type: 'integer', minimum: 1, default: 1 } },\n { name: 'pageSize', in: 'query', schema: { type: 'integer', minimum: 1, maximum: 100 } },\n ],\n get: {\n tags: ['CPQ ARC'],\n summary: 'List ARC change-log entries for a subscription',\n responses: {\n '200': { description: 'Paginated change log' },\n '401': { description: 'Unauthorized' },\n },\n },\n },\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,oBAAoB;AAC7B,SAAS,8BAA8B;AACvC,SAAS,+BAA+B;AAExC,SAAS,sBAAsB;AAQxB,MAAM,WAAW;AAAA,EACtB,KAAK,EAAE,aAAa,MAAM,iBAAiB,CAAC,wBAAwB,EAAE;AACxE;AAEA,eAAsB,IACpB,KACA,EAAE,OAAO,GACT;AACA,MAAI;AACF,UAAM,MAAM,MAAM,uBAAuB,GAAG;AAC5C,QAAI,CAAC,IAAI,KAAM,QAAO,aAAa,KAAK,EAAE,OAAO,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAClF,UAAM,EAAE,eAAe,IAAI,MAAM;AACjC,UAAM,MAAM,IAAI,IAAI,IAAI,GAAG;AAC3B,UAAM,QAAQ,wBAAwB,MAAM;AAAA,MAC1C,MAAM,IAAI,aAAa,IAAI,MAAM,KAAK;AAAA,MACtC,UAAU,IAAI,aAAa,IAAI,UAAU,KAAK;AAAA,IAChD,CAAC;AACD,UAAM,QAAQ,EAAE,gBAAgB,IAAI,gBAAgB,UAAU,IAAI,SAAS;AAC3E,UAAM,UAAU,IAAI,UAAU,QAAQ,qBAAqB;AAC3D,UAAM,SAAS,MAAM,QAAQ;AAAA,MAC3B;AAAA,MACA,EAAE,MAAM,MAAM,MAAM,UAAU,MAAM,SAAS;AAAA,MAC7C;AAAA,IACF;AACA,WAAO,aAAa,KAAK,MAAM;AAAA,EACjC,SAAS,KAAK;AACZ,WAAO,eAAe,KAAK,6DAA6D;AAAA,EAC1F;AACF;AAEO,MAAM,UAAU;AAAA,EACrB,gEAAgE;AAAA,IAC9D,YAAY;AAAA,MACV;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,UAAU,QAAQ,OAAO;AAAA,MAC3C;AAAA,MACA,EAAE,MAAM,QAAQ,IAAI,SAAS,QAAQ,EAAE,MAAM,WAAW,SAAS,GAAG,SAAS,EAAE,EAAE;AAAA,MACjF,EAAE,MAAM,YAAY,IAAI,SAAS,QAAQ,EAAE,MAAM,WAAW,SAAS,GAAG,SAAS,IAAI,EAAE;AAAA,IACzF;AAAA,IACA,KAAK;AAAA,MACH,MAAM,CAAC,SAAS;AAAA,MAChB,SAAS;AAAA,MACT,WAAW;AAAA,QACT,OAAO,EAAE,aAAa,uBAAuB;AAAA,QAC7C,OAAO,EAAE,aAAa,eAAe;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { resolveCpqRouteContext } from "../../../context.js";
|
|
3
|
+
import { cpqExpiringSubscriptionsQuerySchema } from "../../../../data/validators.js";
|
|
4
|
+
import { handleArcError } from "../../../_helpers/handleArcError.js";
|
|
5
|
+
const metadata = {
|
|
6
|
+
GET: { requireAuth: true, requireFeatures: ["cpq.inventory.expiring.view"] }
|
|
7
|
+
};
|
|
8
|
+
async function GET(req) {
|
|
9
|
+
try {
|
|
10
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
11
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
12
|
+
const url = new URL(req.url);
|
|
13
|
+
const query = cpqExpiringSubscriptionsQuerySchema.parse({
|
|
14
|
+
withinDays: url.searchParams.get("withinDays") ?? void 0,
|
|
15
|
+
customerId: url.searchParams.get("customerId") ?? void 0,
|
|
16
|
+
billingCycle: url.searchParams.get("billingCycle") ?? void 0,
|
|
17
|
+
status: url.searchParams.get("status") ?? void 0,
|
|
18
|
+
page: url.searchParams.get("page") ?? void 0,
|
|
19
|
+
pageSize: url.searchParams.get("pageSize") ?? void 0
|
|
20
|
+
});
|
|
21
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
22
|
+
const service = ctx.container.resolve("cpqInventoryService");
|
|
23
|
+
const result = await service.findExpiringSubscriptions(query, scope);
|
|
24
|
+
return NextResponse.json(result);
|
|
25
|
+
} catch (err) {
|
|
26
|
+
return handleArcError(err, "cpq/inventory/subscriptions/expiring.GET");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const openApi = {
|
|
30
|
+
"/api/cpq/inventory/subscriptions/expiring": {
|
|
31
|
+
parameters: [
|
|
32
|
+
{
|
|
33
|
+
name: "withinDays",
|
|
34
|
+
in: "query",
|
|
35
|
+
schema: { type: "integer", minimum: 1, maximum: 365, default: 30 }
|
|
36
|
+
},
|
|
37
|
+
{ name: "customerId", in: "query", schema: { type: "string", format: "uuid" } },
|
|
38
|
+
{
|
|
39
|
+
name: "billingCycle",
|
|
40
|
+
in: "query",
|
|
41
|
+
schema: { type: "string", enum: ["monthly", "quarterly", "annually"] }
|
|
42
|
+
},
|
|
43
|
+
{ name: "status", in: "query", schema: { type: "string", default: "active" } },
|
|
44
|
+
{ name: "page", in: "query", schema: { type: "integer", minimum: 1, default: 1 } },
|
|
45
|
+
{ name: "pageSize", in: "query", schema: { type: "integer", minimum: 1, maximum: 100 } }
|
|
46
|
+
],
|
|
47
|
+
get: {
|
|
48
|
+
tags: ["CPQ ARC"],
|
|
49
|
+
summary: "List subscriptions expiring within N days",
|
|
50
|
+
responses: {
|
|
51
|
+
"200": { description: "Paginated subscriptions" },
|
|
52
|
+
"401": { description: "Unauthorized" }
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
export {
|
|
58
|
+
GET,
|
|
59
|
+
metadata,
|
|
60
|
+
openApi
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/cpq/api/inventory/subscriptions/expiring/route.ts"],
|
|
4
|
+
"sourcesContent": ["import { NextResponse } from 'next/server'\nimport { resolveCpqRouteContext } from '../../../context'\nimport { cpqExpiringSubscriptionsQuerySchema } from '../../../../data/validators'\nimport type { DefaultCpqInventoryService } from '../../../../services/cpqInventoryService'\nimport { handleArcError } from '../../../_helpers/handleArcError'\n\n/**\n * GET /api/cpq/inventory/subscriptions/expiring\n *\n * List active subscriptions whose currentTermEnd falls within the next\n * `withinDays` days. Drives the operator's renewal triage view.\n */\nexport const metadata = {\n GET: { requireAuth: true, requireFeatures: ['cpq.inventory.expiring.view'] },\n}\n\nexport async function GET(req: Request) {\n try {\n const ctx = await resolveCpqRouteContext(req)\n if (!ctx.auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n const url = new URL(req.url)\n const query = cpqExpiringSubscriptionsQuerySchema.parse({\n withinDays: url.searchParams.get('withinDays') ?? undefined,\n customerId: url.searchParams.get('customerId') ?? undefined,\n billingCycle: url.searchParams.get('billingCycle') ?? undefined,\n status: url.searchParams.get('status') ?? undefined,\n page: url.searchParams.get('page') ?? undefined,\n pageSize: url.searchParams.get('pageSize') ?? undefined,\n })\n const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId }\n const service = ctx.container.resolve('cpqInventoryService') as DefaultCpqInventoryService\n const result = await service.findExpiringSubscriptions(query, scope)\n return NextResponse.json(result)\n } catch (err) {\n return handleArcError(err, 'cpq/inventory/subscriptions/expiring.GET')\n }\n}\n\nexport const openApi = {\n '/api/cpq/inventory/subscriptions/expiring': {\n parameters: [\n {\n name: 'withinDays',\n in: 'query',\n schema: { type: 'integer', minimum: 1, maximum: 365, default: 30 },\n },\n { name: 'customerId', in: 'query', schema: { type: 'string', format: 'uuid' } },\n {\n name: 'billingCycle',\n in: 'query',\n schema: { type: 'string', enum: ['monthly', 'quarterly', 'annually'] },\n },\n { name: 'status', in: 'query', schema: { type: 'string', default: 'active' } },\n { name: 'page', in: 'query', schema: { type: 'integer', minimum: 1, default: 1 } },\n { name: 'pageSize', in: 'query', schema: { type: 'integer', minimum: 1, maximum: 100 } },\n ],\n get: {\n tags: ['CPQ ARC'],\n summary: 'List subscriptions expiring within N days',\n responses: {\n '200': { description: 'Paginated subscriptions' },\n '401': { description: 'Unauthorized' },\n },\n },\n },\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,oBAAoB;AAC7B,SAAS,8BAA8B;AACvC,SAAS,2CAA2C;AAEpD,SAAS,sBAAsB;AAQxB,MAAM,WAAW;AAAA,EACtB,KAAK,EAAE,aAAa,MAAM,iBAAiB,CAAC,6BAA6B,EAAE;AAC7E;AAEA,eAAsB,IAAI,KAAc;AACtC,MAAI;AACF,UAAM,MAAM,MAAM,uBAAuB,GAAG;AAC5C,QAAI,CAAC,IAAI,KAAM,QAAO,aAAa,KAAK,EAAE,OAAO,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAClF,UAAM,MAAM,IAAI,IAAI,IAAI,GAAG;AAC3B,UAAM,QAAQ,oCAAoC,MAAM;AAAA,MACtD,YAAY,IAAI,aAAa,IAAI,YAAY,KAAK;AAAA,MAClD,YAAY,IAAI,aAAa,IAAI,YAAY,KAAK;AAAA,MAClD,cAAc,IAAI,aAAa,IAAI,cAAc,KAAK;AAAA,MACtD,QAAQ,IAAI,aAAa,IAAI,QAAQ,KAAK;AAAA,MAC1C,MAAM,IAAI,aAAa,IAAI,MAAM,KAAK;AAAA,MACtC,UAAU,IAAI,aAAa,IAAI,UAAU,KAAK;AAAA,IAChD,CAAC;AACD,UAAM,QAAQ,EAAE,gBAAgB,IAAI,gBAAgB,UAAU,IAAI,SAAS;AAC3E,UAAM,UAAU,IAAI,UAAU,QAAQ,qBAAqB;AAC3D,UAAM,SAAS,MAAM,QAAQ,0BAA0B,OAAO,KAAK;AACnE,WAAO,aAAa,KAAK,MAAM;AAAA,EACjC,SAAS,KAAK;AACZ,WAAO,eAAe,KAAK,0CAA0C;AAAA,EACvE;AACF;AAEO,MAAM,UAAU;AAAA,EACrB,6CAA6C;AAAA,IAC3C,YAAY;AAAA,MACV;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,QAAQ,EAAE,MAAM,WAAW,SAAS,GAAG,SAAS,KAAK,SAAS,GAAG;AAAA,MACnE;AAAA,MACA,EAAE,MAAM,cAAc,IAAI,SAAS,QAAQ,EAAE,MAAM,UAAU,QAAQ,OAAO,EAAE;AAAA,MAC9E;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,QAAQ,EAAE,MAAM,UAAU,MAAM,CAAC,WAAW,aAAa,UAAU,EAAE;AAAA,MACvE;AAAA,MACA,EAAE,MAAM,UAAU,IAAI,SAAS,QAAQ,EAAE,MAAM,UAAU,SAAS,SAAS,EAAE;AAAA,MAC7E,EAAE,MAAM,QAAQ,IAAI,SAAS,QAAQ,EAAE,MAAM,WAAW,SAAS,GAAG,SAAS,EAAE,EAAE;AAAA,MACjF,EAAE,MAAM,YAAY,IAAI,SAAS,QAAQ,EAAE,MAAM,WAAW,SAAS,GAAG,SAAS,IAAI,EAAE;AAAA,IACzF;AAAA,IACA,KAAK;AAAA,MACH,MAAM,CAAC,SAAS;AAAA,MAChB,SAAS;AAAA,MACT,WAAW;AAAA,QACT,OAAO,EAAE,aAAa,0BAA0B;AAAA,QAChD,OAAO,EAAE,aAAa,eAAe;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { resolveCpqRouteContext } from "../../context.js";
|
|
4
|
+
import {
|
|
5
|
+
cpqInventorySubscriptionCreateSchema,
|
|
6
|
+
cpqInventorySubscriptionUpdateSchema
|
|
7
|
+
} from "../../../data/validators.js";
|
|
8
|
+
const metadata = {
|
|
9
|
+
GET: { requireAuth: true, requireFeatures: ["cpq.inventory.view"] },
|
|
10
|
+
POST: { requireAuth: true, requireFeatures: ["cpq.inventory.manage"] },
|
|
11
|
+
PUT: { requireAuth: true, requireFeatures: ["cpq.inventory.manage"] },
|
|
12
|
+
DELETE: { requireAuth: true, requireFeatures: ["cpq.inventory.manage"] }
|
|
13
|
+
};
|
|
14
|
+
async function GET(req) {
|
|
15
|
+
try {
|
|
16
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
17
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
18
|
+
const url = new URL(req.url);
|
|
19
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
20
|
+
const service = ctx.container.resolve("cpqInventoryService");
|
|
21
|
+
const id = url.searchParams.get("id");
|
|
22
|
+
if (id) {
|
|
23
|
+
const result2 = await service.getSubscription(id, scope);
|
|
24
|
+
return NextResponse.json(result2);
|
|
25
|
+
}
|
|
26
|
+
const filters = {};
|
|
27
|
+
const customerId = url.searchParams.get("customerId");
|
|
28
|
+
if (customerId) filters.customerId = customerId;
|
|
29
|
+
const status = url.searchParams.get("status");
|
|
30
|
+
if (status) filters.status = status.split(",");
|
|
31
|
+
const productId = url.searchParams.get("productId");
|
|
32
|
+
if (productId) filters.productId = productId;
|
|
33
|
+
const sourceOrderId = url.searchParams.get("sourceOrderId");
|
|
34
|
+
if (sourceOrderId) filters.sourceOrderId = sourceOrderId;
|
|
35
|
+
const billingCycle = url.searchParams.get("billingCycle");
|
|
36
|
+
if (billingCycle) filters.billingCycle = billingCycle;
|
|
37
|
+
const search = url.searchParams.get("search");
|
|
38
|
+
if (search) filters.search = search;
|
|
39
|
+
const expiringWithinDays = url.searchParams.get("expiringWithinDays");
|
|
40
|
+
if (expiringWithinDays) {
|
|
41
|
+
const n = Number(expiringWithinDays);
|
|
42
|
+
if (Number.isFinite(n) && n > 0) filters.expiringWithinDays = Math.min(365, n);
|
|
43
|
+
}
|
|
44
|
+
const ALLOWED_SORT_FIELDS = ["createdAt", "updatedAt", "code", "name", "status", "startDate", "currentTermEnd"];
|
|
45
|
+
const sortFieldParam = url.searchParams.get("sortField") ?? "";
|
|
46
|
+
if (ALLOWED_SORT_FIELDS.includes(sortFieldParam)) {
|
|
47
|
+
filters.sortField = sortFieldParam;
|
|
48
|
+
}
|
|
49
|
+
filters.sortDir = url.searchParams.get("sortDir") === "asc" ? "asc" : "desc";
|
|
50
|
+
filters.page = Math.max(1, Number(url.searchParams.get("page") ?? "1"));
|
|
51
|
+
filters.pageSize = Math.min(100, Math.max(1, Number(url.searchParams.get("pageSize") ?? "50")));
|
|
52
|
+
const result = await service.listSubscriptions(filters, scope);
|
|
53
|
+
return NextResponse.json(result);
|
|
54
|
+
} catch (err) {
|
|
55
|
+
console.error("[cpq/inventory/subscriptions.GET]", err);
|
|
56
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function POST(req) {
|
|
60
|
+
try {
|
|
61
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
62
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
63
|
+
const body = cpqInventorySubscriptionCreateSchema.parse(await req.json());
|
|
64
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
65
|
+
const service = ctx.container.resolve("cpqInventoryService");
|
|
66
|
+
const result = await service.createSubscription(body, scope);
|
|
67
|
+
return NextResponse.json(result, { status: 201 });
|
|
68
|
+
} catch (err) {
|
|
69
|
+
if (err instanceof z.ZodError) {
|
|
70
|
+
return NextResponse.json({ error: "Validation error", details: err.issues }, { status: 400 });
|
|
71
|
+
}
|
|
72
|
+
console.error("[cpq/inventory/subscriptions.POST]", err);
|
|
73
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function PUT(req) {
|
|
77
|
+
try {
|
|
78
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
79
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
80
|
+
const body = cpqInventorySubscriptionUpdateSchema.parse(await req.json());
|
|
81
|
+
const { id, ...updates } = body;
|
|
82
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
83
|
+
const service = ctx.container.resolve("cpqInventoryService");
|
|
84
|
+
const result = await service.updateSubscription(id, updates, scope);
|
|
85
|
+
return NextResponse.json(result);
|
|
86
|
+
} catch (err) {
|
|
87
|
+
if (err instanceof z.ZodError) {
|
|
88
|
+
return NextResponse.json({ error: "Validation error", details: err.issues }, { status: 400 });
|
|
89
|
+
}
|
|
90
|
+
console.error("[cpq/inventory/subscriptions.PUT]", err);
|
|
91
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function DELETE(req) {
|
|
95
|
+
try {
|
|
96
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
97
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
98
|
+
const { id } = await req.json();
|
|
99
|
+
if (!id) return NextResponse.json({ error: "Missing id" }, { status: 400 });
|
|
100
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
101
|
+
const service = ctx.container.resolve("cpqInventoryService");
|
|
102
|
+
await service.deleteSubscription(id, scope);
|
|
103
|
+
return NextResponse.json({ success: true });
|
|
104
|
+
} catch (err) {
|
|
105
|
+
console.error("[cpq/inventory/subscriptions.DELETE]", err);
|
|
106
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export {
|
|
110
|
+
DELETE,
|
|
111
|
+
GET,
|
|
112
|
+
POST,
|
|
113
|
+
PUT,
|
|
114
|
+
metadata
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/cpq/api/inventory/subscriptions/route.ts"],
|
|
4
|
+
"sourcesContent": ["import { NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport { resolveCpqRouteContext } from '../../context'\nimport {\n cpqInventorySubscriptionCreateSchema,\n cpqInventorySubscriptionUpdateSchema,\n} from '../../../data/validators'\n\nexport const metadata = {\n GET: { requireAuth: true, requireFeatures: ['cpq.inventory.view'] },\n POST: { requireAuth: true, requireFeatures: ['cpq.inventory.manage'] },\n PUT: { requireAuth: true, requireFeatures: ['cpq.inventory.manage'] },\n DELETE: { requireAuth: true, requireFeatures: ['cpq.inventory.manage'] },\n}\n\nexport async function GET(req: Request) {\n try {\n const ctx = await resolveCpqRouteContext(req)\n if (!ctx.auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n\n const url = new URL(req.url)\n const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId }\n const service = ctx.container.resolve('cpqInventoryService') as any\n\n const id = url.searchParams.get('id')\n if (id) {\n const result = await service.getSubscription(id, scope)\n return NextResponse.json(result)\n }\n\n const filters: Record<string, unknown> = {}\n const customerId = url.searchParams.get('customerId')\n if (customerId) filters.customerId = customerId\n const status = url.searchParams.get('status')\n if (status) filters.status = status.split(',')\n const productId = url.searchParams.get('productId')\n if (productId) filters.productId = productId\n const sourceOrderId = url.searchParams.get('sourceOrderId')\n if (sourceOrderId) filters.sourceOrderId = sourceOrderId\n const billingCycle = url.searchParams.get('billingCycle')\n if (billingCycle) filters.billingCycle = billingCycle\n const search = url.searchParams.get('search')\n if (search) filters.search = search\n const expiringWithinDays = url.searchParams.get('expiringWithinDays')\n if (expiringWithinDays) {\n const n = Number(expiringWithinDays)\n if (Number.isFinite(n) && n > 0) filters.expiringWithinDays = Math.min(365, n)\n }\n\n const ALLOWED_SORT_FIELDS = ['createdAt', 'updatedAt', 'code', 'name', 'status', 'startDate', 'currentTermEnd'] as const\n const sortFieldParam = url.searchParams.get('sortField') ?? ''\n if ((ALLOWED_SORT_FIELDS as readonly string[]).includes(sortFieldParam)) {\n filters.sortField = sortFieldParam\n }\n filters.sortDir = url.searchParams.get('sortDir') === 'asc' ? 'asc' : 'desc'\n\n filters.page = Math.max(1, Number(url.searchParams.get('page') ?? '1'))\n filters.pageSize = Math.min(100, Math.max(1, Number(url.searchParams.get('pageSize') ?? '50')))\n\n const result = await service.listSubscriptions(filters, scope)\n return NextResponse.json(result)\n } catch (err) {\n console.error('[cpq/inventory/subscriptions.GET]', err)\n return NextResponse.json({ error: 'Internal error' }, { status: 500 })\n }\n}\n\nexport async function POST(req: Request) {\n try {\n const ctx = await resolveCpqRouteContext(req)\n if (!ctx.auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n\n const body = cpqInventorySubscriptionCreateSchema.parse(await req.json())\n const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId }\n const service = ctx.container.resolve('cpqInventoryService') as any\n\n const result = await service.createSubscription(body, scope)\n return NextResponse.json(result, { status: 201 })\n } catch (err) {\n if (err instanceof z.ZodError) {\n return NextResponse.json({ error: 'Validation error', details: err.issues }, { status: 400 })\n }\n console.error('[cpq/inventory/subscriptions.POST]', err)\n return NextResponse.json({ error: 'Internal error' }, { status: 500 })\n }\n}\n\nexport async function PUT(req: Request) {\n try {\n const ctx = await resolveCpqRouteContext(req)\n if (!ctx.auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n\n const body = cpqInventorySubscriptionUpdateSchema.parse(await req.json())\n const { id, ...updates } = body\n const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId }\n const service = ctx.container.resolve('cpqInventoryService') as any\n\n const result = await service.updateSubscription(id, updates, scope)\n return NextResponse.json(result)\n } catch (err) {\n if (err instanceof z.ZodError) {\n return NextResponse.json({ error: 'Validation error', details: err.issues }, { status: 400 })\n }\n console.error('[cpq/inventory/subscriptions.PUT]', err)\n return NextResponse.json({ error: 'Internal error' }, { status: 500 })\n }\n}\n\nexport async function DELETE(req: Request) {\n try {\n const ctx = await resolveCpqRouteContext(req)\n if (!ctx.auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n\n const { id } = (await req.json()) as { id?: string }\n if (!id) return NextResponse.json({ error: 'Missing id' }, { status: 400 })\n\n const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId }\n const service = ctx.container.resolve('cpqInventoryService') as any\n\n await service.deleteSubscription(id, scope)\n return NextResponse.json({ success: true })\n } catch (err) {\n console.error('[cpq/inventory/subscriptions.DELETE]', err)\n return NextResponse.json({ error: 'Internal error' }, { status: 500 })\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["result"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { resolveCpqRouteContext } from "../../../context.js";
|
|
4
|
+
import { cpqInventoryStatusTransitionSchema } from "../../../../data/validators.js";
|
|
5
|
+
const metadata = {
|
|
6
|
+
POST: { requireAuth: true, requireFeatures: ["cpq.inventory.manage"] }
|
|
7
|
+
};
|
|
8
|
+
async function POST(req) {
|
|
9
|
+
try {
|
|
10
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
11
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
12
|
+
const body = cpqInventoryStatusTransitionSchema.parse(await req.json());
|
|
13
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
14
|
+
const service = ctx.container.resolve("cpqInventoryService");
|
|
15
|
+
const result = await service.transitionSubscriptionStatus(body.id, body.targetStatus, scope);
|
|
16
|
+
return NextResponse.json(result);
|
|
17
|
+
} catch (err) {
|
|
18
|
+
if (err instanceof z.ZodError) {
|
|
19
|
+
return NextResponse.json({ error: "Validation error", details: err.issues }, { status: 400 });
|
|
20
|
+
}
|
|
21
|
+
if (err && typeof err === "object" && "status" in err && err.status === 409) {
|
|
22
|
+
return NextResponse.json(
|
|
23
|
+
{ error: err.error ?? "Conflict" },
|
|
24
|
+
{ status: 409 }
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
console.error("[cpq/inventory/subscriptions/status.POST]", err);
|
|
28
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
POST,
|
|
33
|
+
metadata
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/cpq/api/inventory/subscriptions/status/route.ts"],
|
|
4
|
+
"sourcesContent": ["import { NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport { resolveCpqRouteContext } from '../../../context'\nimport { cpqInventoryStatusTransitionSchema } from '../../../../data/validators'\n\nexport const metadata = {\n POST: { requireAuth: true, requireFeatures: ['cpq.inventory.manage'] },\n}\n\nexport async function POST(req: Request) {\n try {\n const ctx = await resolveCpqRouteContext(req)\n if (!ctx.auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n\n const body = cpqInventoryStatusTransitionSchema.parse(await req.json())\n const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId }\n const service = ctx.container.resolve('cpqInventoryService') as any\n\n const result = await service.transitionSubscriptionStatus(body.id, body.targetStatus, scope)\n return NextResponse.json(result)\n } catch (err) {\n if (err instanceof z.ZodError) {\n return NextResponse.json({ error: 'Validation error', details: err.issues }, { status: 400 })\n }\n if (err && typeof err === 'object' && 'status' in err && (err as any).status === 409) {\n return NextResponse.json(\n { error: (err as any).error ?? 'Conflict' },\n { status: 409 },\n )\n }\n console.error('[cpq/inventory/subscriptions/status.POST]', err)\n return NextResponse.json({ error: 'Internal error' }, { status: 500 })\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,oBAAoB;AAC7B,SAAS,SAAS;AAClB,SAAS,8BAA8B;AACvC,SAAS,0CAA0C;AAE5C,MAAM,WAAW;AAAA,EACtB,MAAM,EAAE,aAAa,MAAM,iBAAiB,CAAC,sBAAsB,EAAE;AACvE;AAEA,eAAsB,KAAK,KAAc;AACvC,MAAI;AACF,UAAM,MAAM,MAAM,uBAAuB,GAAG;AAC5C,QAAI,CAAC,IAAI,KAAM,QAAO,aAAa,KAAK,EAAE,OAAO,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAElF,UAAM,OAAO,mCAAmC,MAAM,MAAM,IAAI,KAAK,CAAC;AACtE,UAAM,QAAQ,EAAE,gBAAgB,IAAI,gBAAgB,UAAU,IAAI,SAAS;AAC3E,UAAM,UAAU,IAAI,UAAU,QAAQ,qBAAqB;AAE3D,UAAM,SAAS,MAAM,QAAQ,6BAA6B,KAAK,IAAI,KAAK,cAAc,KAAK;AAC3F,WAAO,aAAa,KAAK,MAAM;AAAA,EACjC,SAAS,KAAK;AACZ,QAAI,eAAe,EAAE,UAAU;AAC7B,aAAO,aAAa,KAAK,EAAE,OAAO,oBAAoB,SAAS,IAAI,OAAO,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC9F;AACA,QAAI,OAAO,OAAO,QAAQ,YAAY,YAAY,OAAQ,IAAY,WAAW,KAAK;AACpF,aAAO,aAAa;AAAA,QAClB,EAAE,OAAQ,IAAY,SAAS,WAAW;AAAA,QAC1C,EAAE,QAAQ,IAAI;AAAA,MAChB;AAAA,IACF;AACA,YAAQ,MAAM,6CAA6C,GAAG;AAC9D,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACvE;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { resolveCpqRouteContext } from "../context.js";
|
|
4
|
+
import { cpqOfferingComponentCreateSchema, cpqOfferingComponentUpdateSchema } from "../../data/validators.js";
|
|
5
|
+
const metadata = {
|
|
6
|
+
GET: { requireAuth: true, requireFeatures: ["cpq.offerings.view"] },
|
|
7
|
+
POST: { requireAuth: true, requireFeatures: ["cpq.offerings.manage"] },
|
|
8
|
+
PUT: { requireAuth: true, requireFeatures: ["cpq.offerings.manage"] },
|
|
9
|
+
DELETE: { requireAuth: true, requireFeatures: ["cpq.offerings.manage"] }
|
|
10
|
+
};
|
|
11
|
+
async function GET(req) {
|
|
12
|
+
try {
|
|
13
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
14
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
15
|
+
const url = new URL(req.url);
|
|
16
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
17
|
+
const service = ctx.container.resolve("cpqBundleService");
|
|
18
|
+
const offeringId = url.searchParams.get("offeringId");
|
|
19
|
+
if (!offeringId) return NextResponse.json({ error: "offeringId is required" }, { status: 400 });
|
|
20
|
+
const components = await service.getComponents(offeringId, scope);
|
|
21
|
+
const slotId = url.searchParams.get("slotId");
|
|
22
|
+
const filtered = slotId ? components.filter((c) => c.slotId === slotId) : components;
|
|
23
|
+
return NextResponse.json({ items: filtered });
|
|
24
|
+
} catch (err) {
|
|
25
|
+
console.error("[cpq/offering-components.GET]", err);
|
|
26
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function POST(req) {
|
|
30
|
+
try {
|
|
31
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
32
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
33
|
+
const body = cpqOfferingComponentCreateSchema.parse(await req.json());
|
|
34
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
35
|
+
const service = ctx.container.resolve("cpqBundleService");
|
|
36
|
+
const component = await service.addComponent(body, scope);
|
|
37
|
+
return NextResponse.json(component, { status: 201 });
|
|
38
|
+
} catch (err) {
|
|
39
|
+
if (err instanceof z.ZodError) {
|
|
40
|
+
return NextResponse.json({ error: "Validation error", details: err.issues }, { status: 400 });
|
|
41
|
+
}
|
|
42
|
+
if (err instanceof Error && err.message.startsWith("V-")) {
|
|
43
|
+
return NextResponse.json({ error: err.message }, { status: 400 });
|
|
44
|
+
}
|
|
45
|
+
console.error("[cpq/offering-components.POST]", err);
|
|
46
|
+
return NextResponse.json({ error: err instanceof Error ? err.message : "Internal error" }, { status: 500 });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function PUT(req) {
|
|
50
|
+
try {
|
|
51
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
52
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
53
|
+
const body = cpqOfferingComponentUpdateSchema.parse(await req.json());
|
|
54
|
+
const { id, ...updates } = body;
|
|
55
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
56
|
+
const service = ctx.container.resolve("cpqBundleService");
|
|
57
|
+
const component = await service.updateComponent(id, updates, scope);
|
|
58
|
+
if (!component) return NextResponse.json({ error: "Not found" }, { status: 404 });
|
|
59
|
+
return NextResponse.json(component);
|
|
60
|
+
} catch (err) {
|
|
61
|
+
if (err instanceof z.ZodError) {
|
|
62
|
+
return NextResponse.json({ error: "Validation error", details: err.issues }, { status: 400 });
|
|
63
|
+
}
|
|
64
|
+
console.error("[cpq/offering-components.PUT]", err);
|
|
65
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async function DELETE(req) {
|
|
69
|
+
try {
|
|
70
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
71
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
72
|
+
const { id } = await req.json();
|
|
73
|
+
if (!id) return NextResponse.json({ error: "Missing id" }, { status: 400 });
|
|
74
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
75
|
+
const service = ctx.container.resolve("cpqBundleService");
|
|
76
|
+
const deleted = await service.removeComponent(id, scope);
|
|
77
|
+
if (!deleted) return NextResponse.json({ error: "Not found" }, { status: 404 });
|
|
78
|
+
return NextResponse.json({ success: true });
|
|
79
|
+
} catch (err) {
|
|
80
|
+
console.error("[cpq/offering-components.DELETE]", err);
|
|
81
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export {
|
|
85
|
+
DELETE,
|
|
86
|
+
GET,
|
|
87
|
+
POST,
|
|
88
|
+
PUT,
|
|
89
|
+
metadata
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/cpq/api/offering-components/route.ts"],
|
|
4
|
+
"sourcesContent": ["import { NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport { resolveCpqRouteContext } from '../context'\nimport { cpqOfferingComponentCreateSchema, cpqOfferingComponentUpdateSchema } from '../../data/validators'\nimport type { DefaultCpqBundleService } from '../../services/cpqBundleService'\n\nexport const metadata = {\n GET: { requireAuth: true, requireFeatures: ['cpq.offerings.view'] },\n POST: { requireAuth: true, requireFeatures: ['cpq.offerings.manage'] },\n PUT: { requireAuth: true, requireFeatures: ['cpq.offerings.manage'] },\n DELETE: { requireAuth: true, requireFeatures: ['cpq.offerings.manage'] },\n}\n\nexport async function GET(req: Request) {\n try {\n const ctx = await resolveCpqRouteContext(req)\n if (!ctx.auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n\n const url = new URL(req.url)\n const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId }\n const service = ctx.container.resolve('cpqBundleService') as DefaultCpqBundleService\n\n const offeringId = url.searchParams.get('offeringId')\n if (!offeringId) return NextResponse.json({ error: 'offeringId is required' }, { status: 400 })\n\n const components = await service.getComponents(offeringId, scope)\n\n const slotId = url.searchParams.get('slotId')\n const filtered = slotId ? components.filter((c) => c.slotId === slotId) : components\n\n return NextResponse.json({ items: filtered })\n } catch (err) {\n console.error('[cpq/offering-components.GET]', err)\n return NextResponse.json({ error: 'Internal error' }, { status: 500 })\n }\n}\n\nexport async function POST(req: Request) {\n try {\n const ctx = await resolveCpqRouteContext(req)\n if (!ctx.auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n\n const body = cpqOfferingComponentCreateSchema.parse(await req.json())\n const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId }\n const service = ctx.container.resolve('cpqBundleService') as DefaultCpqBundleService\n\n const component = await service.addComponent(body, scope)\n return NextResponse.json(component, { status: 201 })\n } catch (err) {\n if (err instanceof z.ZodError) {\n return NextResponse.json({ error: 'Validation error', details: err.issues }, { status: 400 })\n }\n if (err instanceof Error && err.message.startsWith('V-')) {\n return NextResponse.json({ error: err.message }, { status: 400 })\n }\n console.error('[cpq/offering-components.POST]', err)\n return NextResponse.json({ error: err instanceof Error ? err.message : 'Internal error' }, { status: 500 })\n }\n}\n\nexport async function PUT(req: Request) {\n try {\n const ctx = await resolveCpqRouteContext(req)\n if (!ctx.auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n\n const body = cpqOfferingComponentUpdateSchema.parse(await req.json())\n const { id, ...updates } = body\n const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId }\n const service = ctx.container.resolve('cpqBundleService') as DefaultCpqBundleService\n\n const component = await service.updateComponent(id, updates, scope)\n if (!component) return NextResponse.json({ error: 'Not found' }, { status: 404 })\n\n return NextResponse.json(component)\n } catch (err) {\n if (err instanceof z.ZodError) {\n return NextResponse.json({ error: 'Validation error', details: err.issues }, { status: 400 })\n }\n console.error('[cpq/offering-components.PUT]', err)\n return NextResponse.json({ error: 'Internal error' }, { status: 500 })\n }\n}\n\nexport async function DELETE(req: Request) {\n try {\n const ctx = await resolveCpqRouteContext(req)\n if (!ctx.auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n\n const { id } = (await req.json()) as { id?: string }\n if (!id) return NextResponse.json({ error: 'Missing id' }, { status: 400 })\n\n const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId }\n const service = ctx.container.resolve('cpqBundleService') as DefaultCpqBundleService\n\n const deleted = await service.removeComponent(id, scope)\n if (!deleted) return NextResponse.json({ error: 'Not found' }, { status: 404 })\n\n return NextResponse.json({ success: true })\n } catch (err) {\n console.error('[cpq/offering-components.DELETE]', err)\n return NextResponse.json({ error: 'Internal error' }, { status: 500 })\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,oBAAoB;AAC7B,SAAS,SAAS;AAClB,SAAS,8BAA8B;AACvC,SAAS,kCAAkC,wCAAwC;AAG5E,MAAM,WAAW;AAAA,EACtB,KAAK,EAAE,aAAa,MAAM,iBAAiB,CAAC,oBAAoB,EAAE;AAAA,EAClE,MAAM,EAAE,aAAa,MAAM,iBAAiB,CAAC,sBAAsB,EAAE;AAAA,EACrE,KAAK,EAAE,aAAa,MAAM,iBAAiB,CAAC,sBAAsB,EAAE;AAAA,EACpE,QAAQ,EAAE,aAAa,MAAM,iBAAiB,CAAC,sBAAsB,EAAE;AACzE;AAEA,eAAsB,IAAI,KAAc;AACtC,MAAI;AACF,UAAM,MAAM,MAAM,uBAAuB,GAAG;AAC5C,QAAI,CAAC,IAAI,KAAM,QAAO,aAAa,KAAK,EAAE,OAAO,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAElF,UAAM,MAAM,IAAI,IAAI,IAAI,GAAG;AAC3B,UAAM,QAAQ,EAAE,gBAAgB,IAAI,gBAAgB,UAAU,IAAI,SAAS;AAC3E,UAAM,UAAU,IAAI,UAAU,QAAQ,kBAAkB;AAExD,UAAM,aAAa,IAAI,aAAa,IAAI,YAAY;AACpD,QAAI,CAAC,WAAY,QAAO,aAAa,KAAK,EAAE,OAAO,yBAAyB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAE9F,UAAM,aAAa,MAAM,QAAQ,cAAc,YAAY,KAAK;AAEhE,UAAM,SAAS,IAAI,aAAa,IAAI,QAAQ;AAC5C,UAAM,WAAW,SAAS,WAAW,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,IAAI;AAE1E,WAAO,aAAa,KAAK,EAAE,OAAO,SAAS,CAAC;AAAA,EAC9C,SAAS,KAAK;AACZ,YAAQ,MAAM,iCAAiC,GAAG;AAClD,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACvE;AACF;AAEA,eAAsB,KAAK,KAAc;AACvC,MAAI;AACF,UAAM,MAAM,MAAM,uBAAuB,GAAG;AAC5C,QAAI,CAAC,IAAI,KAAM,QAAO,aAAa,KAAK,EAAE,OAAO,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAElF,UAAM,OAAO,iCAAiC,MAAM,MAAM,IAAI,KAAK,CAAC;AACpE,UAAM,QAAQ,EAAE,gBAAgB,IAAI,gBAAgB,UAAU,IAAI,SAAS;AAC3E,UAAM,UAAU,IAAI,UAAU,QAAQ,kBAAkB;AAExD,UAAM,YAAY,MAAM,QAAQ,aAAa,MAAM,KAAK;AACxD,WAAO,aAAa,KAAK,WAAW,EAAE,QAAQ,IAAI,CAAC;AAAA,EACrD,SAAS,KAAK;AACZ,QAAI,eAAe,EAAE,UAAU;AAC7B,aAAO,aAAa,KAAK,EAAE,OAAO,oBAAoB,SAAS,IAAI,OAAO,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC9F;AACA,QAAI,eAAe,SAAS,IAAI,QAAQ,WAAW,IAAI,GAAG;AACxD,aAAO,aAAa,KAAK,EAAE,OAAO,IAAI,QAAQ,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,IAClE;AACA,YAAQ,MAAM,kCAAkC,GAAG;AACnD,WAAO,aAAa,KAAK,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,iBAAiB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC5G;AACF;AAEA,eAAsB,IAAI,KAAc;AACtC,MAAI;AACF,UAAM,MAAM,MAAM,uBAAuB,GAAG;AAC5C,QAAI,CAAC,IAAI,KAAM,QAAO,aAAa,KAAK,EAAE,OAAO,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAElF,UAAM,OAAO,iCAAiC,MAAM,MAAM,IAAI,KAAK,CAAC;AACpE,UAAM,EAAE,IAAI,GAAG,QAAQ,IAAI;AAC3B,UAAM,QAAQ,EAAE,gBAAgB,IAAI,gBAAgB,UAAU,IAAI,SAAS;AAC3E,UAAM,UAAU,IAAI,UAAU,QAAQ,kBAAkB;AAExD,UAAM,YAAY,MAAM,QAAQ,gBAAgB,IAAI,SAAS,KAAK;AAClE,QAAI,CAAC,UAAW,QAAO,aAAa,KAAK,EAAE,OAAO,YAAY,GAAG,EAAE,QAAQ,IAAI,CAAC;AAEhF,WAAO,aAAa,KAAK,SAAS;AAAA,EACpC,SAAS,KAAK;AACZ,QAAI,eAAe,EAAE,UAAU;AAC7B,aAAO,aAAa,KAAK,EAAE,OAAO,oBAAoB,SAAS,IAAI,OAAO,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC9F;AACA,YAAQ,MAAM,iCAAiC,GAAG;AAClD,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACvE;AACF;AAEA,eAAsB,OAAO,KAAc;AACzC,MAAI;AACF,UAAM,MAAM,MAAM,uBAAuB,GAAG;AAC5C,QAAI,CAAC,IAAI,KAAM,QAAO,aAAa,KAAK,EAAE,OAAO,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAElF,UAAM,EAAE,GAAG,IAAK,MAAM,IAAI,KAAK;AAC/B,QAAI,CAAC,GAAI,QAAO,aAAa,KAAK,EAAE,OAAO,aAAa,GAAG,EAAE,QAAQ,IAAI,CAAC;AAE1E,UAAM,QAAQ,EAAE,gBAAgB,IAAI,gBAAgB,UAAU,IAAI,SAAS;AAC3E,UAAM,UAAU,IAAI,UAAU,QAAQ,kBAAkB;AAExD,UAAM,UAAU,MAAM,QAAQ,gBAAgB,IAAI,KAAK;AACvD,QAAI,CAAC,QAAS,QAAO,aAAa,KAAK,EAAE,OAAO,YAAY,GAAG,EAAE,QAAQ,IAAI,CAAC;AAE9E,WAAO,aAAa,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,EAC5C,SAAS,KAAK;AACZ,YAAQ,MAAM,oCAAoC,GAAG;AACrD,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACvE;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { OptimisticLockError } from "@mikro-orm/core";
|
|
3
|
+
import { resolveCpqRouteContext } from "../../../context.js";
|
|
4
|
+
import { OrderError } from "../../../../services/cpqOrderService.js";
|
|
5
|
+
const metadata = {
|
|
6
|
+
POST: { requireAuth: true, requireFeatures: ["cpq.orders.manage"] }
|
|
7
|
+
};
|
|
8
|
+
async function POST(req, { params }) {
|
|
9
|
+
try {
|
|
10
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
11
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
12
|
+
const { orderId } = await params;
|
|
13
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
14
|
+
const service = ctx.container.resolve("cpqOrderService");
|
|
15
|
+
const result = await service.activateOrder(orderId, scope);
|
|
16
|
+
return NextResponse.json(result);
|
|
17
|
+
} catch (err) {
|
|
18
|
+
if (err instanceof OrderError) {
|
|
19
|
+
return NextResponse.json({ error: err.message }, { status: err.status });
|
|
20
|
+
}
|
|
21
|
+
if (err instanceof OptimisticLockError || err && typeof err === "object" && err.constructor?.name === "OptimisticLockError") {
|
|
22
|
+
return NextResponse.json(
|
|
23
|
+
{ error: "Concurrent modification detected", details: err.message },
|
|
24
|
+
{ status: 409 }
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
const errObj = err;
|
|
28
|
+
if (typeof errObj?.status === "number" && typeof errObj?.error === "string") {
|
|
29
|
+
return NextResponse.json({ error: errObj.error }, { status: errObj.status });
|
|
30
|
+
}
|
|
31
|
+
console.error("[cpq/orders/[orderId]/activate.POST]", err);
|
|
32
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
POST,
|
|
37
|
+
metadata
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/cpq/api/orders/%5BorderId%5D/activate/route.ts"],
|
|
4
|
+
"sourcesContent": ["import { NextResponse } from 'next/server'\nimport { OptimisticLockError } from '@mikro-orm/core'\nimport { resolveCpqRouteContext } from '../../../context'\nimport { OrderError } from '../../../../services/cpqOrderService'\nimport type { DefaultCpqOrderService } from '../../../../services/cpqOrderService'\n\nexport const metadata = {\n POST: { requireAuth: true, requireFeatures: ['cpq.orders.manage'] },\n}\n\nexport async function POST(req: Request, { params }: { params: Promise<{ orderId: string }> }) {\n try {\n const ctx = await resolveCpqRouteContext(req)\n if (!ctx.auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n\n const { orderId } = await params\n const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId }\n\n const service = ctx.container.resolve('cpqOrderService') as DefaultCpqOrderService\n const result = await service.activateOrder(orderId, scope)\n return NextResponse.json(result)\n } catch (err) {\n if (err instanceof OrderError) {\n return NextResponse.json({ error: err.message }, { status: err.status })\n }\n // XD-250 ARC: optimistic-lock collision on subscription.version when two\n // ARC orders touching the same sub race to activate. Spec \u00A7 Risks:\n // \"second activation gets 409, order stays in pending_activation,\n // retryable\". Constructor-name fallback survives Turbopack class drift.\n if (\n err instanceof OptimisticLockError ||\n (err &&\n typeof err === 'object' &&\n (err as { constructor?: { name?: string } }).constructor?.name === 'OptimisticLockError')\n ) {\n return NextResponse.json(\n { error: 'Concurrent modification detected', details: (err as Error).message },\n { status: 409 },\n )\n }\n const errObj = err as Record<string, unknown>\n if (typeof errObj?.status === 'number' && typeof errObj?.error === 'string') {\n return NextResponse.json({ error: errObj.error }, { status: errObj.status as number })\n }\n console.error('[cpq/orders/[orderId]/activate.POST]', err)\n return NextResponse.json({ error: 'Internal error' }, { status: 500 })\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AACpC,SAAS,8BAA8B;AACvC,SAAS,kBAAkB;AAGpB,MAAM,WAAW;AAAA,EACtB,MAAM,EAAE,aAAa,MAAM,iBAAiB,CAAC,mBAAmB,EAAE;AACpE;AAEA,eAAsB,KAAK,KAAc,EAAE,OAAO,GAA6C;AAC7F,MAAI;AACF,UAAM,MAAM,MAAM,uBAAuB,GAAG;AAC5C,QAAI,CAAC,IAAI,KAAM,QAAO,aAAa,KAAK,EAAE,OAAO,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAElF,UAAM,EAAE,QAAQ,IAAI,MAAM;AAC1B,UAAM,QAAQ,EAAE,gBAAgB,IAAI,gBAAgB,UAAU,IAAI,SAAS;AAE3E,UAAM,UAAU,IAAI,UAAU,QAAQ,iBAAiB;AACvD,UAAM,SAAS,MAAM,QAAQ,cAAc,SAAS,KAAK;AACzD,WAAO,aAAa,KAAK,MAAM;AAAA,EACjC,SAAS,KAAK;AACZ,QAAI,eAAe,YAAY;AAC7B,aAAO,aAAa,KAAK,EAAE,OAAO,IAAI,QAAQ,GAAG,EAAE,QAAQ,IAAI,OAAO,CAAC;AAAA,IACzE;AAKA,QACE,eAAe,uBACd,OACC,OAAO,QAAQ,YACd,IAA4C,aAAa,SAAS,uBACrE;AACA,aAAO,aAAa;AAAA,QAClB,EAAE,OAAO,oCAAoC,SAAU,IAAc,QAAQ;AAAA,QAC7E,EAAE,QAAQ,IAAI;AAAA,MAChB;AAAA,IACF;AACA,UAAM,SAAS;AACf,QAAI,OAAO,QAAQ,WAAW,YAAY,OAAO,QAAQ,UAAU,UAAU;AAC3E,aAAO,aAAa,KAAK,EAAE,OAAO,OAAO,MAAM,GAAG,EAAE,QAAQ,OAAO,OAAiB,CAAC;AAAA,IACvF;AACA,YAAQ,MAAM,wCAAwC,GAAG;AACzD,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACvE;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { resolveCpqRouteContext } from "../../context.js";
|
|
3
|
+
import { OrderError } from "../../../services/cpqOrderService.js";
|
|
4
|
+
const metadata = {
|
|
5
|
+
GET: { requireAuth: true, requireFeatures: ["cpq.orders.view"] }
|
|
6
|
+
};
|
|
7
|
+
async function GET(req, { params }) {
|
|
8
|
+
try {
|
|
9
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
10
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
11
|
+
const { orderId } = await params;
|
|
12
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
13
|
+
const service = ctx.container.resolve("cpqOrderService");
|
|
14
|
+
const result = await service.getOrder(orderId, scope);
|
|
15
|
+
return NextResponse.json(result);
|
|
16
|
+
} catch (err) {
|
|
17
|
+
if (err instanceof OrderError) {
|
|
18
|
+
return NextResponse.json({ error: err.message }, { status: err.status });
|
|
19
|
+
}
|
|
20
|
+
console.error("[cpq/orders/[orderId].GET]", err);
|
|
21
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
GET,
|
|
26
|
+
metadata
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/cpq/api/orders/%5BorderId%5D/route.ts"],
|
|
4
|
+
"sourcesContent": ["import { NextResponse } from 'next/server'\nimport { resolveCpqRouteContext } from '../../context'\nimport { OrderError } from '../../../services/cpqOrderService'\nimport type { DefaultCpqOrderService } from '../../../services/cpqOrderService'\n\nexport const metadata = {\n GET: { requireAuth: true, requireFeatures: ['cpq.orders.view'] },\n}\n\nexport async function GET(req: Request, { params }: { params: Promise<{ orderId: string }> }) {\n try {\n const ctx = await resolveCpqRouteContext(req)\n if (!ctx.auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n\n const { orderId } = await params\n const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId }\n\n const service = ctx.container.resolve('cpqOrderService') as DefaultCpqOrderService\n const result = await service.getOrder(orderId, scope)\n return NextResponse.json(result)\n } catch (err) {\n if (err instanceof OrderError) {\n return NextResponse.json({ error: err.message }, { status: err.status })\n }\n console.error('[cpq/orders/[orderId].GET]', err)\n return NextResponse.json({ error: 'Internal error' }, { status: 500 })\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,oBAAoB;AAC7B,SAAS,8BAA8B;AACvC,SAAS,kBAAkB;AAGpB,MAAM,WAAW;AAAA,EACtB,KAAK,EAAE,aAAa,MAAM,iBAAiB,CAAC,iBAAiB,EAAE;AACjE;AAEA,eAAsB,IAAI,KAAc,EAAE,OAAO,GAA6C;AAC5F,MAAI;AACF,UAAM,MAAM,MAAM,uBAAuB,GAAG;AAC5C,QAAI,CAAC,IAAI,KAAM,QAAO,aAAa,KAAK,EAAE,OAAO,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAElF,UAAM,EAAE,QAAQ,IAAI,MAAM;AAC1B,UAAM,QAAQ,EAAE,gBAAgB,IAAI,gBAAgB,UAAU,IAAI,SAAS;AAE3E,UAAM,UAAU,IAAI,UAAU,QAAQ,iBAAiB;AACvD,UAAM,SAAS,MAAM,QAAQ,SAAS,SAAS,KAAK;AACpD,WAAO,aAAa,KAAK,MAAM;AAAA,EACjC,SAAS,KAAK;AACZ,QAAI,eAAe,YAAY;AAC7B,aAAO,aAAa,KAAK,EAAE,OAAO,IAAI,QAAQ,GAAG,EAAE,QAAQ,IAAI,OAAO,CAAC;AAAA,IACzE;AACA,YAAQ,MAAM,8BAA8B,GAAG;AAC/C,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACvE;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { resolveCpqRouteContext } from "../../../context.js";
|
|
4
|
+
import { cpqOrderStatusTransitionSchema } from "../../../../data/validators.js";
|
|
5
|
+
import { OrderError } from "../../../../services/cpqOrderService.js";
|
|
6
|
+
const metadata = {
|
|
7
|
+
POST: { requireAuth: true, requireFeatures: ["cpq.orders.manage"] }
|
|
8
|
+
};
|
|
9
|
+
async function POST(req, { params }) {
|
|
10
|
+
try {
|
|
11
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
12
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
13
|
+
const { orderId } = await params;
|
|
14
|
+
const body = cpqOrderStatusTransitionSchema.parse(await req.json());
|
|
15
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
16
|
+
const service = ctx.container.resolve("cpqOrderService");
|
|
17
|
+
const result = await service.transitionOrderStatus(orderId, body.targetStatus, scope);
|
|
18
|
+
return NextResponse.json(result);
|
|
19
|
+
} catch (err) {
|
|
20
|
+
if (err instanceof z.ZodError) {
|
|
21
|
+
return NextResponse.json({ error: "Validation error", details: err.issues }, { status: 400 });
|
|
22
|
+
}
|
|
23
|
+
if (err instanceof OrderError) {
|
|
24
|
+
return NextResponse.json({ error: err.message }, { status: err.status });
|
|
25
|
+
}
|
|
26
|
+
const errObj = err;
|
|
27
|
+
if (typeof errObj?.status === "number" && typeof errObj?.error === "string") {
|
|
28
|
+
return NextResponse.json({ error: errObj.error }, { status: errObj.status });
|
|
29
|
+
}
|
|
30
|
+
console.error("[cpq/orders/[orderId]/status.POST]", err);
|
|
31
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export {
|
|
35
|
+
POST,
|
|
36
|
+
metadata
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/cpq/api/orders/%5BorderId%5D/status/route.ts"],
|
|
4
|
+
"sourcesContent": ["import { NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport { resolveCpqRouteContext } from '../../../context'\nimport { cpqOrderStatusTransitionSchema } from '../../../../data/validators'\nimport { OrderError } from '../../../../services/cpqOrderService'\nimport type { DefaultCpqOrderService } from '../../../../services/cpqOrderService'\n\nexport const metadata = {\n POST: { requireAuth: true, requireFeatures: ['cpq.orders.manage'] },\n}\n\nexport async function POST(req: Request, { params }: { params: Promise<{ orderId: string }> }) {\n try {\n const ctx = await resolveCpqRouteContext(req)\n if (!ctx.auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n\n const { orderId } = await params\n const body = cpqOrderStatusTransitionSchema.parse(await req.json())\n const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId }\n\n const service = ctx.container.resolve('cpqOrderService') as DefaultCpqOrderService\n const result = await service.transitionOrderStatus(orderId, body.targetStatus, scope)\n return NextResponse.json(result)\n } catch (err) {\n if (err instanceof z.ZodError) {\n return NextResponse.json({ error: 'Validation error', details: err.issues }, { status: 400 })\n }\n if (err instanceof OrderError) {\n return NextResponse.json({ error: err.message }, { status: err.status })\n }\n const errObj = err as Record<string, unknown>\n if (typeof errObj?.status === 'number' && typeof errObj?.error === 'string') {\n return NextResponse.json({ error: errObj.error }, { status: errObj.status as number })\n }\n console.error('[cpq/orders/[orderId]/status.POST]', err)\n return NextResponse.json({ error: 'Internal error' }, { status: 500 })\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,oBAAoB;AAC7B,SAAS,SAAS;AAClB,SAAS,8BAA8B;AACvC,SAAS,sCAAsC;AAC/C,SAAS,kBAAkB;AAGpB,MAAM,WAAW;AAAA,EACtB,MAAM,EAAE,aAAa,MAAM,iBAAiB,CAAC,mBAAmB,EAAE;AACpE;AAEA,eAAsB,KAAK,KAAc,EAAE,OAAO,GAA6C;AAC7F,MAAI;AACF,UAAM,MAAM,MAAM,uBAAuB,GAAG;AAC5C,QAAI,CAAC,IAAI,KAAM,QAAO,aAAa,KAAK,EAAE,OAAO,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAElF,UAAM,EAAE,QAAQ,IAAI,MAAM;AAC1B,UAAM,OAAO,+BAA+B,MAAM,MAAM,IAAI,KAAK,CAAC;AAClE,UAAM,QAAQ,EAAE,gBAAgB,IAAI,gBAAgB,UAAU,IAAI,SAAS;AAE3E,UAAM,UAAU,IAAI,UAAU,QAAQ,iBAAiB;AACvD,UAAM,SAAS,MAAM,QAAQ,sBAAsB,SAAS,KAAK,cAAc,KAAK;AACpF,WAAO,aAAa,KAAK,MAAM;AAAA,EACjC,SAAS,KAAK;AACZ,QAAI,eAAe,EAAE,UAAU;AAC7B,aAAO,aAAa,KAAK,EAAE,OAAO,oBAAoB,SAAS,IAAI,OAAO,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC9F;AACA,QAAI,eAAe,YAAY;AAC7B,aAAO,aAAa,KAAK,EAAE,OAAO,IAAI,QAAQ,GAAG,EAAE,QAAQ,IAAI,OAAO,CAAC;AAAA,IACzE;AACA,UAAM,SAAS;AACf,QAAI,OAAO,QAAQ,WAAW,YAAY,OAAO,QAAQ,UAAU,UAAU;AAC3E,aAAO,aAAa,KAAK,EAAE,OAAO,OAAO,MAAM,GAAG,EAAE,QAAQ,OAAO,OAAiB,CAAC;AAAA,IACvF;AACA,YAAQ,MAAM,sCAAsC,GAAG;AACvD,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACvE;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|