@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,101 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { resolveCpqRouteContext } from "../context.js";
|
|
4
|
+
import { cpqBundleSlotCreateSchema, cpqBundleSlotUpdateSchema } from "../../data/validators.js";
|
|
5
|
+
const metadata = {
|
|
6
|
+
GET: { requireAuth: true, requireFeatures: ["cpq.specifications.view"] },
|
|
7
|
+
POST: { requireAuth: true, requireFeatures: ["cpq.specifications.manage"] },
|
|
8
|
+
PUT: { requireAuth: true, requireFeatures: ["cpq.specifications.manage"] },
|
|
9
|
+
DELETE: { requireAuth: true, requireFeatures: ["cpq.specifications.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 id = url.searchParams.get("id");
|
|
19
|
+
if (id) {
|
|
20
|
+
const slot = await service.getSlot(id, scope);
|
|
21
|
+
if (!slot) return NextResponse.json({ error: "Not found" }, { status: 404 });
|
|
22
|
+
return NextResponse.json(slot);
|
|
23
|
+
}
|
|
24
|
+
const specId = url.searchParams.get("specId");
|
|
25
|
+
if (!specId) return NextResponse.json({ error: "specId is required" }, { status: 400 });
|
|
26
|
+
const slots = await service.getSlots(specId, scope);
|
|
27
|
+
return NextResponse.json({ items: slots });
|
|
28
|
+
} catch (err) {
|
|
29
|
+
console.error("[cpq/bundle-slots.GET]", err);
|
|
30
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async function POST(req) {
|
|
34
|
+
try {
|
|
35
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
36
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
37
|
+
const body = cpqBundleSlotCreateSchema.parse(await req.json());
|
|
38
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
39
|
+
const service = ctx.container.resolve("cpqBundleService");
|
|
40
|
+
const slot = await service.createSlot(body, scope);
|
|
41
|
+
return NextResponse.json(slot, { status: 201 });
|
|
42
|
+
} catch (err) {
|
|
43
|
+
if (err instanceof z.ZodError) {
|
|
44
|
+
return NextResponse.json({ error: "Validation error", details: err.issues }, { status: 400 });
|
|
45
|
+
}
|
|
46
|
+
if (err instanceof Error && err.message.startsWith("V-")) {
|
|
47
|
+
return NextResponse.json({ error: err.message }, { status: 400 });
|
|
48
|
+
}
|
|
49
|
+
console.error("[cpq/bundle-slots.POST]", err);
|
|
50
|
+
return NextResponse.json({ error: err instanceof Error ? err.message : "Internal error" }, { status: 500 });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function PUT(req) {
|
|
54
|
+
try {
|
|
55
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
56
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
57
|
+
const body = cpqBundleSlotUpdateSchema.parse(await req.json());
|
|
58
|
+
const { id, ...updates } = body;
|
|
59
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
60
|
+
const service = ctx.container.resolve("cpqBundleService");
|
|
61
|
+
const slot = await service.updateSlot(id, updates, scope);
|
|
62
|
+
if (!slot) return NextResponse.json({ error: "Not found" }, { status: 404 });
|
|
63
|
+
return NextResponse.json(slot);
|
|
64
|
+
} catch (err) {
|
|
65
|
+
if (err instanceof z.ZodError) {
|
|
66
|
+
return NextResponse.json({ error: "Validation error", details: err.issues }, { status: 400 });
|
|
67
|
+
}
|
|
68
|
+
if (err instanceof Error && err.message.startsWith("V-")) {
|
|
69
|
+
return NextResponse.json({ error: err.message }, { status: 400 });
|
|
70
|
+
}
|
|
71
|
+
console.error("[cpq/bundle-slots.PUT]", err);
|
|
72
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async function DELETE(req) {
|
|
76
|
+
try {
|
|
77
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
78
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
79
|
+
const { id } = await req.json();
|
|
80
|
+
if (!id) return NextResponse.json({ error: "Missing id" }, { status: 400 });
|
|
81
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
82
|
+
const service = ctx.container.resolve("cpqBundleService");
|
|
83
|
+
const deleted = await service.deleteSlot(id, scope);
|
|
84
|
+
if (!deleted) return NextResponse.json({ error: "Not found" }, { status: 404 });
|
|
85
|
+
return NextResponse.json({ success: true });
|
|
86
|
+
} catch (err) {
|
|
87
|
+
if (err instanceof Error && err.message.includes("active offering components")) {
|
|
88
|
+
return NextResponse.json({ error: err.message }, { status: 400 });
|
|
89
|
+
}
|
|
90
|
+
console.error("[cpq/bundle-slots.DELETE]", err);
|
|
91
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export {
|
|
95
|
+
DELETE,
|
|
96
|
+
GET,
|
|
97
|
+
POST,
|
|
98
|
+
PUT,
|
|
99
|
+
metadata
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/cpq/api/bundle-slots/route.ts"],
|
|
4
|
+
"sourcesContent": ["import { NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport { resolveCpqRouteContext } from '../context'\nimport { cpqBundleSlotCreateSchema, cpqBundleSlotUpdateSchema } from '../../data/validators'\nimport type { DefaultCpqBundleService } from '../../services/cpqBundleService'\n\nexport const metadata = {\n GET: { requireAuth: true, requireFeatures: ['cpq.specifications.view'] },\n POST: { requireAuth: true, requireFeatures: ['cpq.specifications.manage'] },\n PUT: { requireAuth: true, requireFeatures: ['cpq.specifications.manage'] },\n DELETE: { requireAuth: true, requireFeatures: ['cpq.specifications.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 id = url.searchParams.get('id')\n if (id) {\n const slot = await service.getSlot(id, scope)\n if (!slot) return NextResponse.json({ error: 'Not found' }, { status: 404 })\n return NextResponse.json(slot)\n }\n\n const specId = url.searchParams.get('specId')\n if (!specId) return NextResponse.json({ error: 'specId is required' }, { status: 400 })\n\n const slots = await service.getSlots(specId, scope)\n return NextResponse.json({ items: slots })\n } catch (err) {\n console.error('[cpq/bundle-slots.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 = cpqBundleSlotCreateSchema.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 slot = await service.createSlot(body, scope)\n return NextResponse.json(slot, { 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/bundle-slots.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 = cpqBundleSlotUpdateSchema.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 slot = await service.updateSlot(id, updates, scope)\n if (!slot) return NextResponse.json({ error: 'Not found' }, { status: 404 })\n\n return NextResponse.json(slot)\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/bundle-slots.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.deleteSlot(id, scope)\n if (!deleted) return NextResponse.json({ error: 'Not found' }, { status: 404 })\n\n return NextResponse.json({ success: true })\n } catch (err) {\n if (err instanceof Error && err.message.includes('active offering components')) {\n return NextResponse.json({ error: err.message }, { status: 400 })\n }\n console.error('[cpq/bundle-slots.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,2BAA2B,iCAAiC;AAG9D,MAAM,WAAW;AAAA,EACtB,KAAK,EAAE,aAAa,MAAM,iBAAiB,CAAC,yBAAyB,EAAE;AAAA,EACvE,MAAM,EAAE,aAAa,MAAM,iBAAiB,CAAC,2BAA2B,EAAE;AAAA,EAC1E,KAAK,EAAE,aAAa,MAAM,iBAAiB,CAAC,2BAA2B,EAAE;AAAA,EACzE,QAAQ,EAAE,aAAa,MAAM,iBAAiB,CAAC,2BAA2B,EAAE;AAC9E;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,KAAK,IAAI,aAAa,IAAI,IAAI;AACpC,QAAI,IAAI;AACN,YAAM,OAAO,MAAM,QAAQ,QAAQ,IAAI,KAAK;AAC5C,UAAI,CAAC,KAAM,QAAO,aAAa,KAAK,EAAE,OAAO,YAAY,GAAG,EAAE,QAAQ,IAAI,CAAC;AAC3E,aAAO,aAAa,KAAK,IAAI;AAAA,IAC/B;AAEA,UAAM,SAAS,IAAI,aAAa,IAAI,QAAQ;AAC5C,QAAI,CAAC,OAAQ,QAAO,aAAa,KAAK,EAAE,OAAO,qBAAqB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAEtF,UAAM,QAAQ,MAAM,QAAQ,SAAS,QAAQ,KAAK;AAClD,WAAO,aAAa,KAAK,EAAE,OAAO,MAAM,CAAC;AAAA,EAC3C,SAAS,KAAK;AACZ,YAAQ,MAAM,0BAA0B,GAAG;AAC3C,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,0BAA0B,MAAM,MAAM,IAAI,KAAK,CAAC;AAC7D,UAAM,QAAQ,EAAE,gBAAgB,IAAI,gBAAgB,UAAU,IAAI,SAAS;AAC3E,UAAM,UAAU,IAAI,UAAU,QAAQ,kBAAkB;AAExD,UAAM,OAAO,MAAM,QAAQ,WAAW,MAAM,KAAK;AACjD,WAAO,aAAa,KAAK,MAAM,EAAE,QAAQ,IAAI,CAAC;AAAA,EAChD,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,2BAA2B,GAAG;AAC5C,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,0BAA0B,MAAM,MAAM,IAAI,KAAK,CAAC;AAC7D,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,OAAO,MAAM,QAAQ,WAAW,IAAI,SAAS,KAAK;AACxD,QAAI,CAAC,KAAM,QAAO,aAAa,KAAK,EAAE,OAAO,YAAY,GAAG,EAAE,QAAQ,IAAI,CAAC;AAE3E,WAAO,aAAa,KAAK,IAAI;AAAA,EAC/B,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,0BAA0B,GAAG;AAC3C,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,WAAW,IAAI,KAAK;AAClD,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,QAAI,eAAe,SAAS,IAAI,QAAQ,SAAS,4BAA4B,GAAG;AAC9E,aAAO,aAAa,KAAK,EAAE,OAAO,IAAI,QAAQ,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,IAClE;AACA,YAAQ,MAAM,6BAA6B,GAAG;AAC9C,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
|
+
const metadata = {
|
|
4
|
+
GET: { requireAuth: true, requireFeatures: ["cpq.offerings.view"] }
|
|
5
|
+
};
|
|
6
|
+
async function GET(req) {
|
|
7
|
+
try {
|
|
8
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
9
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
10
|
+
const url = new URL(req.url);
|
|
11
|
+
const offeringId = url.searchParams.get("offeringId");
|
|
12
|
+
if (!offeringId) return NextResponse.json({ error: "offeringId is required" }, { status: 400 });
|
|
13
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
14
|
+
const service = ctx.container.resolve("cpqBundleService");
|
|
15
|
+
const tree = await service.resolveBundleTree(offeringId, scope);
|
|
16
|
+
if (!tree) return NextResponse.json({ error: "Not found" }, { status: 404 });
|
|
17
|
+
const validation = await service.validateBundleCompleteness(offeringId, scope);
|
|
18
|
+
return NextResponse.json({ tree, validation });
|
|
19
|
+
} catch (err) {
|
|
20
|
+
console.error("[cpq/bundle-tree.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/bundle-tree/route.ts"],
|
|
4
|
+
"sourcesContent": ["import { NextResponse } from 'next/server'\nimport { resolveCpqRouteContext } from '../context'\nimport type { DefaultCpqBundleService } from '../../services/cpqBundleService'\n\nexport const metadata = {\n GET: { requireAuth: true, requireFeatures: ['cpq.offerings.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\n const url = new URL(req.url)\n const offeringId = url.searchParams.get('offeringId')\n if (!offeringId) return NextResponse.json({ error: 'offeringId is required' }, { status: 400 })\n\n const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId }\n const service = ctx.container.resolve('cpqBundleService') as DefaultCpqBundleService\n\n const tree = await service.resolveBundleTree(offeringId, scope)\n if (!tree) return NextResponse.json({ error: 'Not found' }, { status: 404 })\n\n const validation = await service.validateBundleCompleteness(offeringId, scope)\n\n return NextResponse.json({ tree, validation })\n } catch (err) {\n console.error('[cpq/bundle-tree.GET]', err)\n return NextResponse.json({ error: 'Internal error' }, { status: 500 })\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,oBAAoB;AAC7B,SAAS,8BAA8B;AAGhC,MAAM,WAAW;AAAA,EACtB,KAAK,EAAE,aAAa,MAAM,iBAAiB,CAAC,oBAAoB,EAAE;AACpE;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,aAAa,IAAI,aAAa,IAAI,YAAY;AACpD,QAAI,CAAC,WAAY,QAAO,aAAa,KAAK,EAAE,OAAO,yBAAyB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAE9F,UAAM,QAAQ,EAAE,gBAAgB,IAAI,gBAAgB,UAAU,IAAI,SAAS;AAC3E,UAAM,UAAU,IAAI,UAAU,QAAQ,kBAAkB;AAExD,UAAM,OAAO,MAAM,QAAQ,kBAAkB,YAAY,KAAK;AAC9D,QAAI,CAAC,KAAM,QAAO,aAAa,KAAK,EAAE,OAAO,YAAY,GAAG,EAAE,QAAQ,IAAI,CAAC;AAE3E,UAAM,aAAa,MAAM,QAAQ,2BAA2B,YAAY,KAAK;AAE7E,WAAO,aAAa,KAAK,EAAE,MAAM,WAAW,CAAC;AAAA,EAC/C,SAAS,KAAK;AACZ,YAAQ,MAAM,yBAAyB,GAAG;AAC1C,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACvE;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { createRequestContainer } from "@open-mercato/shared/lib/di/container";
|
|
2
|
+
import { getAuthFromRequest } from "@open-mercato/shared/lib/auth/server";
|
|
3
|
+
import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
|
|
4
|
+
import { resolveFeatureCheckContext } from "@open-mercato/core/modules/directory/utils/organizationScope";
|
|
5
|
+
async function resolveCpqRouteContext(req) {
|
|
6
|
+
const container = await createRequestContainer();
|
|
7
|
+
const auth = await getAuthFromRequest(req);
|
|
8
|
+
const { translate } = await resolveTranslations();
|
|
9
|
+
if (!auth || !auth.tenantId) {
|
|
10
|
+
throw new Error("Unauthorized");
|
|
11
|
+
}
|
|
12
|
+
const { organizationId: resolvedOrgId, scope } = await resolveFeatureCheckContext({ container, auth, request: req });
|
|
13
|
+
const organizationId = resolvedOrgId ?? "";
|
|
14
|
+
const tenantId = scope?.tenantId ?? auth.tenantId ?? "";
|
|
15
|
+
const em = container.resolve("em");
|
|
16
|
+
return {
|
|
17
|
+
container,
|
|
18
|
+
auth,
|
|
19
|
+
em,
|
|
20
|
+
organizationId,
|
|
21
|
+
tenantId,
|
|
22
|
+
organizationScope: scope ?? null,
|
|
23
|
+
translate
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
resolveCpqRouteContext
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/cpq/api/context.ts"],
|
|
4
|
+
"sourcesContent": ["import { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { resolveFeatureCheckContext } from '@open-mercato/core/modules/directory/utils/organizationScope'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport type { AwilixContainer } from 'awilix'\nimport type { OrganizationScope } from '@open-mercato/core/modules/directory/utils/organizationScope'\n\nexport type CpqRouteContext = {\n container: AwilixContainer\n auth: Awaited<ReturnType<typeof getAuthFromRequest>>\n em: EntityManager\n organizationId: string\n tenantId: string\n organizationScope: OrganizationScope | null\n translate: (key: string, fallback?: string) => string\n}\n\nexport async function resolveCpqRouteContext(req: Request): Promise<CpqRouteContext> {\n const container = await createRequestContainer()\n const auth = await getAuthFromRequest(req)\n const { translate } = await resolveTranslations()\n if (!auth || !auth.tenantId) {\n throw new Error('Unauthorized')\n }\n const { organizationId: resolvedOrgId, scope } = await resolveFeatureCheckContext({ container, auth, request: req })\n const organizationId = resolvedOrgId ?? ''\n const tenantId = scope?.tenantId ?? auth.tenantId ?? ''\n const em = container.resolve('em') as EntityManager\n return {\n container,\n auth,\n em,\n organizationId,\n tenantId,\n organizationScope: scope ?? null,\n translate,\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,8BAA8B;AACvC,SAAS,0BAA0B;AACnC,SAAS,2BAA2B;AACpC,SAAS,kCAAkC;AAe3C,eAAsB,uBAAuB,KAAwC;AACnF,QAAM,YAAY,MAAM,uBAAuB;AAC/C,QAAM,OAAO,MAAM,mBAAmB,GAAG;AACzC,QAAM,EAAE,UAAU,IAAI,MAAM,oBAAoB;AAChD,MAAI,CAAC,QAAQ,CAAC,KAAK,UAAU;AAC3B,UAAM,IAAI,MAAM,cAAc;AAAA,EAChC;AACA,QAAM,EAAE,gBAAgB,eAAe,MAAM,IAAI,MAAM,2BAA2B,EAAE,WAAW,MAAM,SAAS,IAAI,CAAC;AACnH,QAAM,iBAAiB,iBAAiB;AACxC,QAAM,WAAW,OAAO,YAAY,KAAK,YAAY;AACrD,QAAM,KAAK,UAAU,QAAQ,IAAI;AACjC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,SAAS;AAAA,IAC5B;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { resolveCpqRouteContext } from "../../context.js";
|
|
4
|
+
import {
|
|
5
|
+
cpqInventoryAssetCreateSchema,
|
|
6
|
+
cpqInventoryAssetUpdateSchema
|
|
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.getAsset(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;
|
|
31
|
+
const assetType = url.searchParams.get("assetType");
|
|
32
|
+
if (assetType) filters.assetType = assetType;
|
|
33
|
+
const productId = url.searchParams.get("productId");
|
|
34
|
+
if (productId) filters.productId = productId;
|
|
35
|
+
const subscriptionId = url.searchParams.get("subscriptionId");
|
|
36
|
+
if (subscriptionId) filters.subscriptionId = subscriptionId;
|
|
37
|
+
const subscriptionItemId = url.searchParams.get("subscriptionItemId");
|
|
38
|
+
if (subscriptionItemId) filters.subscriptionItemId = subscriptionItemId;
|
|
39
|
+
const search = url.searchParams.get("search");
|
|
40
|
+
if (search) filters.search = search;
|
|
41
|
+
const ALLOWED_SORT_FIELDS = ["createdAt", "updatedAt", "code", "name", "status", "assetType", "purchasePrice"];
|
|
42
|
+
const sortFieldParam = url.searchParams.get("sortField") ?? "";
|
|
43
|
+
if (ALLOWED_SORT_FIELDS.includes(sortFieldParam)) {
|
|
44
|
+
filters.sortField = sortFieldParam;
|
|
45
|
+
}
|
|
46
|
+
filters.sortDir = url.searchParams.get("sortDir") === "asc" ? "asc" : "desc";
|
|
47
|
+
filters.page = Math.max(1, Number(url.searchParams.get("page") ?? "1"));
|
|
48
|
+
filters.pageSize = Math.min(100, Math.max(1, Number(url.searchParams.get("pageSize") ?? "50")));
|
|
49
|
+
const result = await service.listAssets(filters, scope);
|
|
50
|
+
return NextResponse.json(result);
|
|
51
|
+
} catch (err) {
|
|
52
|
+
console.error("[cpq/inventory/assets.GET]", err);
|
|
53
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function POST(req) {
|
|
57
|
+
try {
|
|
58
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
59
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
60
|
+
const body = cpqInventoryAssetCreateSchema.parse(await req.json());
|
|
61
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
62
|
+
const service = ctx.container.resolve("cpqInventoryService");
|
|
63
|
+
const result = await service.createAsset(body, scope);
|
|
64
|
+
return NextResponse.json(result, { status: 201 });
|
|
65
|
+
} catch (err) {
|
|
66
|
+
if (err instanceof z.ZodError) {
|
|
67
|
+
return NextResponse.json({ error: "Validation error", details: err.issues }, { status: 400 });
|
|
68
|
+
}
|
|
69
|
+
console.error("[cpq/inventory/assets.POST]", err);
|
|
70
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async function PUT(req) {
|
|
74
|
+
try {
|
|
75
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
76
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
77
|
+
const body = cpqInventoryAssetUpdateSchema.parse(await req.json());
|
|
78
|
+
const { id, ...updates } = body;
|
|
79
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
80
|
+
const service = ctx.container.resolve("cpqInventoryService");
|
|
81
|
+
const result = await service.updateAsset(id, updates, scope);
|
|
82
|
+
return NextResponse.json(result);
|
|
83
|
+
} catch (err) {
|
|
84
|
+
if (err instanceof z.ZodError) {
|
|
85
|
+
return NextResponse.json({ error: "Validation error", details: err.issues }, { status: 400 });
|
|
86
|
+
}
|
|
87
|
+
console.error("[cpq/inventory/assets.PUT]", err);
|
|
88
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async function DELETE(req) {
|
|
92
|
+
try {
|
|
93
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
94
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
95
|
+
const { id } = await req.json();
|
|
96
|
+
if (!id) return NextResponse.json({ error: "Missing id" }, { status: 400 });
|
|
97
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
98
|
+
const service = ctx.container.resolve("cpqInventoryService");
|
|
99
|
+
await service.deleteAsset(id, scope);
|
|
100
|
+
return NextResponse.json({ success: true });
|
|
101
|
+
} catch (err) {
|
|
102
|
+
console.error("[cpq/inventory/assets.DELETE]", err);
|
|
103
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export {
|
|
107
|
+
DELETE,
|
|
108
|
+
GET,
|
|
109
|
+
POST,
|
|
110
|
+
PUT,
|
|
111
|
+
metadata
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/cpq/api/inventory/assets/route.ts"],
|
|
4
|
+
"sourcesContent": ["import { NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport { resolveCpqRouteContext } from '../../context'\nimport {\n cpqInventoryAssetCreateSchema,\n cpqInventoryAssetUpdateSchema,\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.getAsset(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\n const assetType = url.searchParams.get('assetType')\n if (assetType) filters.assetType = assetType\n const productId = url.searchParams.get('productId')\n if (productId) filters.productId = productId\n const subscriptionId = url.searchParams.get('subscriptionId')\n if (subscriptionId) filters.subscriptionId = subscriptionId\n const subscriptionItemId = url.searchParams.get('subscriptionItemId')\n if (subscriptionItemId) filters.subscriptionItemId = subscriptionItemId\n const search = url.searchParams.get('search')\n if (search) filters.search = search\n\n const ALLOWED_SORT_FIELDS = ['createdAt', 'updatedAt', 'code', 'name', 'status', 'assetType', 'purchasePrice'] 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.listAssets(filters, scope)\n return NextResponse.json(result)\n } catch (err) {\n console.error('[cpq/inventory/assets.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 = cpqInventoryAssetCreateSchema.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.createAsset(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/assets.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 = cpqInventoryAssetUpdateSchema.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.updateAsset(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/assets.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.deleteAsset(id, scope)\n return NextResponse.json({ success: true })\n } catch (err) {\n console.error('[cpq/inventory/assets.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;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEA,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,qBAAqB;AAE3D,UAAM,KAAK,IAAI,aAAa,IAAI,IAAI;AACpC,QAAI,IAAI;AACN,YAAMA,UAAS,MAAM,QAAQ,SAAS,IAAI,KAAK;AAC/C,aAAO,aAAa,KAAKA,OAAM;AAAA,IACjC;AAEA,UAAM,UAAmC,CAAC;AAC1C,UAAM,aAAa,IAAI,aAAa,IAAI,YAAY;AACpD,QAAI,WAAY,SAAQ,aAAa;AACrC,UAAM,SAAS,IAAI,aAAa,IAAI,QAAQ;AAC5C,QAAI,OAAQ,SAAQ,SAAS;AAC7B,UAAM,YAAY,IAAI,aAAa,IAAI,WAAW;AAClD,QAAI,UAAW,SAAQ,YAAY;AACnC,UAAM,YAAY,IAAI,aAAa,IAAI,WAAW;AAClD,QAAI,UAAW,SAAQ,YAAY;AACnC,UAAM,iBAAiB,IAAI,aAAa,IAAI,gBAAgB;AAC5D,QAAI,eAAgB,SAAQ,iBAAiB;AAC7C,UAAM,qBAAqB,IAAI,aAAa,IAAI,oBAAoB;AACpE,QAAI,mBAAoB,SAAQ,qBAAqB;AACrD,UAAM,SAAS,IAAI,aAAa,IAAI,QAAQ;AAC5C,QAAI,OAAQ,SAAQ,SAAS;AAE7B,UAAM,sBAAsB,CAAC,aAAa,aAAa,QAAQ,QAAQ,UAAU,aAAa,eAAe;AAC7G,UAAM,iBAAiB,IAAI,aAAa,IAAI,WAAW,KAAK;AAC5D,QAAK,oBAA0C,SAAS,cAAc,GAAG;AACvE,cAAQ,YAAY;AAAA,IACtB;AACA,YAAQ,UAAU,IAAI,aAAa,IAAI,SAAS,MAAM,QAAQ,QAAQ;AAEtE,YAAQ,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,aAAa,IAAI,MAAM,KAAK,GAAG,CAAC;AACtE,YAAQ,WAAW,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,OAAO,IAAI,aAAa,IAAI,UAAU,KAAK,IAAI,CAAC,CAAC;AAE9F,UAAM,SAAS,MAAM,QAAQ,WAAW,SAAS,KAAK;AACtD,WAAO,aAAa,KAAK,MAAM;AAAA,EACjC,SAAS,KAAK;AACZ,YAAQ,MAAM,8BAA8B,GAAG;AAC/C,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,8BAA8B,MAAM,MAAM,IAAI,KAAK,CAAC;AACjE,UAAM,QAAQ,EAAE,gBAAgB,IAAI,gBAAgB,UAAU,IAAI,SAAS;AAC3E,UAAM,UAAU,IAAI,UAAU,QAAQ,qBAAqB;AAE3D,UAAM,SAAS,MAAM,QAAQ,YAAY,MAAM,KAAK;AACpD,WAAO,aAAa,KAAK,QAAQ,EAAE,QAAQ,IAAI,CAAC;AAAA,EAClD,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,+BAA+B,GAAG;AAChD,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACvE;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,8BAA8B,MAAM,MAAM,IAAI,KAAK,CAAC;AACjE,UAAM,EAAE,IAAI,GAAG,QAAQ,IAAI;AAC3B,UAAM,QAAQ,EAAE,gBAAgB,IAAI,gBAAgB,UAAU,IAAI,SAAS;AAC3E,UAAM,UAAU,IAAI,UAAU,QAAQ,qBAAqB;AAE3D,UAAM,SAAS,MAAM,QAAQ,YAAY,IAAI,SAAS,KAAK;AAC3D,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,YAAQ,MAAM,8BAA8B,GAAG;AAC/C,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,qBAAqB;AAE3D,UAAM,QAAQ,YAAY,IAAI,KAAK;AACnC,WAAO,aAAa,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,EAC5C,SAAS,KAAK;AACZ,YAAQ,MAAM,iCAAiC,GAAG;AAClD,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACvE;AACF;",
|
|
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.transitionAssetStatus(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/assets/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/assets/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.transitionAssetStatus(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/assets/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,sBAAsB,KAAK,IAAI,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,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,sCAAsC,GAAG;AACvD,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACvE;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { resolveCpqRouteContext } from "../../../../context.js";
|
|
3
|
+
const metadata = {
|
|
4
|
+
GET: { requireAuth: true, requireFeatures: ["cpq.inventory.view"] }
|
|
5
|
+
};
|
|
6
|
+
async function GET(req, { params }) {
|
|
7
|
+
try {
|
|
8
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
9
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
10
|
+
const { customerId } = await params;
|
|
11
|
+
const url = new URL(req.url);
|
|
12
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
13
|
+
const service = ctx.container.resolve("cpqInventoryService");
|
|
14
|
+
const filters = {};
|
|
15
|
+
const productId = url.searchParams.get("productId");
|
|
16
|
+
if (productId) filters.productId = productId;
|
|
17
|
+
const offeringId = url.searchParams.get("offeringId");
|
|
18
|
+
if (offeringId) filters.offeringId = offeringId;
|
|
19
|
+
const result = await service.getCustomerParentItems(customerId, filters, scope);
|
|
20
|
+
return NextResponse.json(result);
|
|
21
|
+
} catch (err) {
|
|
22
|
+
console.error("[cpq/inventory/customer/parent-items.GET]", err);
|
|
23
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
GET,
|
|
28
|
+
metadata
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../../src/modules/cpq/api/inventory/customer/%5BcustomerId%5D/parent-items/route.ts"],
|
|
4
|
+
"sourcesContent": ["import { NextResponse } from 'next/server'\nimport { resolveCpqRouteContext } from '../../../../context'\n\nexport const metadata = {\n GET: { requireAuth: true, requireFeatures: ['cpq.inventory.view'] },\n}\n\nexport async function GET(req: Request, { params }: { params: Promise<{ customerId: string }> }) {\n try {\n const ctx = await resolveCpqRouteContext(req)\n if (!ctx.auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n\n const { customerId } = await params\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 filters: Record<string, unknown> = {}\n const productId = url.searchParams.get('productId')\n if (productId) filters.productId = productId\n const offeringId = url.searchParams.get('offeringId')\n if (offeringId) filters.offeringId = offeringId\n\n const result = await service.getCustomerParentItems(customerId, filters, scope)\n return NextResponse.json(result)\n } catch (err) {\n console.error('[cpq/inventory/customer/parent-items.GET]', err)\n return NextResponse.json({ error: 'Internal error' }, { status: 500 })\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,oBAAoB;AAC7B,SAAS,8BAA8B;AAEhC,MAAM,WAAW;AAAA,EACtB,KAAK,EAAE,aAAa,MAAM,iBAAiB,CAAC,oBAAoB,EAAE;AACpE;AAEA,eAAsB,IAAI,KAAc,EAAE,OAAO,GAAgD;AAC/F,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,WAAW,IAAI,MAAM;AAC7B,UAAM,MAAM,IAAI,IAAI,IAAI,GAAG;AAC3B,UAAM,QAAQ,EAAE,gBAAgB,IAAI,gBAAgB,UAAU,IAAI,SAAS;AAC3E,UAAM,UAAU,IAAI,UAAU,QAAQ,qBAAqB;AAE3D,UAAM,UAAmC,CAAC;AAC1C,UAAM,YAAY,IAAI,aAAa,IAAI,WAAW;AAClD,QAAI,UAAW,SAAQ,YAAY;AACnC,UAAM,aAAa,IAAI,aAAa,IAAI,YAAY;AACpD,QAAI,WAAY,SAAQ,aAAa;AAErC,UAAM,SAAS,MAAM,QAAQ,uBAAuB,YAAY,SAAS,KAAK;AAC9E,WAAO,aAAa,KAAK,MAAM;AAAA,EACjC,SAAS,KAAK;AACZ,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,31 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { resolveCpqRouteContext } from "../../../context.js";
|
|
3
|
+
const metadata = {
|
|
4
|
+
GET: { requireAuth: true, requireFeatures: ["cpq.inventory.view"] }
|
|
5
|
+
};
|
|
6
|
+
async function GET(req, { params }) {
|
|
7
|
+
try {
|
|
8
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
9
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
10
|
+
const { customerId } = await params;
|
|
11
|
+
const url = new URL(req.url);
|
|
12
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
13
|
+
const service = ctx.container.resolve("cpqInventoryService");
|
|
14
|
+
const filters = {};
|
|
15
|
+
const status = url.searchParams.get("status");
|
|
16
|
+
if (status) filters.status = status;
|
|
17
|
+
const productId = url.searchParams.get("productId");
|
|
18
|
+
if (productId) filters.productId = productId;
|
|
19
|
+
filters.includeTerminated = url.searchParams.get("includeTerminated") === "true";
|
|
20
|
+
const result = await service.getCustomerInventory(customerId, filters, scope);
|
|
21
|
+
return NextResponse.json(result);
|
|
22
|
+
} catch (err) {
|
|
23
|
+
console.error("[cpq/inventory/customer.GET]", err);
|
|
24
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
GET,
|
|
29
|
+
metadata
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/cpq/api/inventory/customer/%5BcustomerId%5D/route.ts"],
|
|
4
|
+
"sourcesContent": ["import { NextResponse } from 'next/server'\nimport { resolveCpqRouteContext } from '../../../context'\n\nexport const metadata = {\n GET: { requireAuth: true, requireFeatures: ['cpq.inventory.view'] },\n}\n\nexport async function GET(req: Request, { params }: { params: Promise<{ customerId: string }> }) {\n try {\n const ctx = await resolveCpqRouteContext(req)\n if (!ctx.auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n\n const { customerId } = await params\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 filters: Record<string, unknown> = {}\n const status = url.searchParams.get('status')\n if (status) filters.status = status\n const productId = url.searchParams.get('productId')\n if (productId) filters.productId = productId\n filters.includeTerminated = url.searchParams.get('includeTerminated') === 'true'\n\n const result = await service.getCustomerInventory(customerId, filters, scope)\n return NextResponse.json(result)\n } catch (err) {\n console.error('[cpq/inventory/customer.GET]', err)\n return NextResponse.json({ error: 'Internal error' }, { status: 500 })\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,oBAAoB;AAC7B,SAAS,8BAA8B;AAEhC,MAAM,WAAW;AAAA,EACtB,KAAK,EAAE,aAAa,MAAM,iBAAiB,CAAC,oBAAoB,EAAE;AACpE;AAEA,eAAsB,IAAI,KAAc,EAAE,OAAO,GAAgD;AAC/F,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,WAAW,IAAI,MAAM;AAC7B,UAAM,MAAM,IAAI,IAAI,IAAI,GAAG;AAC3B,UAAM,QAAQ,EAAE,gBAAgB,IAAI,gBAAgB,UAAU,IAAI,SAAS;AAC3E,UAAM,UAAU,IAAI,UAAU,QAAQ,qBAAqB;AAE3D,UAAM,UAAmC,CAAC;AAC1C,UAAM,SAAS,IAAI,aAAa,IAAI,QAAQ;AAC5C,QAAI,OAAQ,SAAQ,SAAS;AAC7B,UAAM,YAAY,IAAI,aAAa,IAAI,WAAW;AAClD,QAAI,UAAW,SAAQ,YAAY;AACnC,YAAQ,oBAAoB,IAAI,aAAa,IAAI,mBAAmB,MAAM;AAE1E,UAAM,SAAS,MAAM,QAAQ,qBAAqB,YAAY,SAAS,KAAK;AAC5E,WAAO,aAAa,KAAK,MAAM;AAAA,EACjC,SAAS,KAAK;AACZ,YAAQ,MAAM,gCAAgC,GAAG;AACjD,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACvE;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { resolveCpqRouteContext } from "../../context.js";
|
|
4
|
+
import {
|
|
5
|
+
cpqInventorySubscriptionItemCreateSchema,
|
|
6
|
+
cpqInventorySubscriptionItemUpdateSchema
|
|
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 subscriptionId = url.searchParams.get("subscriptionId");
|
|
22
|
+
const parentItemId = url.searchParams.get("parentItemId");
|
|
23
|
+
if (!subscriptionId && !parentItemId) {
|
|
24
|
+
return NextResponse.json(
|
|
25
|
+
{ error: "At least one of subscriptionId or parentItemId is required" },
|
|
26
|
+
{ status: 400 }
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
const filters = {};
|
|
30
|
+
if (subscriptionId) filters.subscriptionId = subscriptionId;
|
|
31
|
+
if (parentItemId) filters.parentItemId = parentItemId;
|
|
32
|
+
const status = url.searchParams.get("status");
|
|
33
|
+
if (status) filters.status = status;
|
|
34
|
+
const result = await service.listSubscriptionItems(filters, scope);
|
|
35
|
+
return NextResponse.json(result);
|
|
36
|
+
} catch (err) {
|
|
37
|
+
console.error("[cpq/inventory/subscription-items.GET]", err);
|
|
38
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function POST(req) {
|
|
42
|
+
try {
|
|
43
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
44
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
45
|
+
const body = cpqInventorySubscriptionItemCreateSchema.parse(await req.json());
|
|
46
|
+
const { subscriptionId, ...input } = body;
|
|
47
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
48
|
+
const service = ctx.container.resolve("cpqInventoryService");
|
|
49
|
+
const result = await service.addSubscriptionItem(subscriptionId, input, scope);
|
|
50
|
+
return NextResponse.json(result, { status: 201 });
|
|
51
|
+
} catch (err) {
|
|
52
|
+
if (err instanceof z.ZodError) {
|
|
53
|
+
return NextResponse.json({ error: "Validation error", details: err.issues }, { status: 400 });
|
|
54
|
+
}
|
|
55
|
+
console.error("[cpq/inventory/subscription-items.POST]", err);
|
|
56
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function PUT(req) {
|
|
60
|
+
try {
|
|
61
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
62
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
63
|
+
const body = cpqInventorySubscriptionItemUpdateSchema.parse(await req.json());
|
|
64
|
+
const { id, ...updates } = body;
|
|
65
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
66
|
+
const service = ctx.container.resolve("cpqInventoryService");
|
|
67
|
+
const result = await service.updateSubscriptionItem(id, updates, scope);
|
|
68
|
+
return NextResponse.json(result);
|
|
69
|
+
} catch (err) {
|
|
70
|
+
if (err instanceof z.ZodError) {
|
|
71
|
+
return NextResponse.json({ error: "Validation error", details: err.issues }, { status: 400 });
|
|
72
|
+
}
|
|
73
|
+
console.error("[cpq/inventory/subscription-items.PUT]", err);
|
|
74
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async function DELETE(req) {
|
|
78
|
+
try {
|
|
79
|
+
const ctx = await resolveCpqRouteContext(req);
|
|
80
|
+
if (!ctx.auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
81
|
+
const { id } = await req.json();
|
|
82
|
+
if (!id) return NextResponse.json({ error: "Missing id" }, { status: 400 });
|
|
83
|
+
const scope = { organizationId: ctx.organizationId, tenantId: ctx.tenantId };
|
|
84
|
+
const service = ctx.container.resolve("cpqInventoryService");
|
|
85
|
+
await service.deleteSubscriptionItem(id, scope);
|
|
86
|
+
return NextResponse.json({ success: true });
|
|
87
|
+
} catch (err) {
|
|
88
|
+
console.error("[cpq/inventory/subscription-items.DELETE]", err);
|
|
89
|
+
return NextResponse.json({ error: "Internal error" }, { status: 500 });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export {
|
|
93
|
+
DELETE,
|
|
94
|
+
GET,
|
|
95
|
+
POST,
|
|
96
|
+
PUT,
|
|
97
|
+
metadata
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/cpq/api/inventory/subscription-items/route.ts"],
|
|
4
|
+
"sourcesContent": ["import { NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport { resolveCpqRouteContext } from '../../context'\nimport {\n cpqInventorySubscriptionItemCreateSchema,\n cpqInventorySubscriptionItemUpdateSchema,\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 subscriptionId = url.searchParams.get('subscriptionId')\n const parentItemId = url.searchParams.get('parentItemId')\n if (!subscriptionId && !parentItemId) {\n return NextResponse.json(\n { error: 'At least one of subscriptionId or parentItemId is required' },\n { status: 400 },\n )\n }\n\n const filters: Record<string, unknown> = {}\n if (subscriptionId) filters.subscriptionId = subscriptionId\n if (parentItemId) filters.parentItemId = parentItemId\n const status = url.searchParams.get('status')\n if (status) filters.status = status\n\n const result = await service.listSubscriptionItems(filters, scope)\n return NextResponse.json(result)\n } catch (err) {\n console.error('[cpq/inventory/subscription-items.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 = cpqInventorySubscriptionItemCreateSchema.parse(await req.json())\n const { subscriptionId, ...input } = 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.addSubscriptionItem(subscriptionId, input, 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/subscription-items.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 = cpqInventorySubscriptionItemUpdateSchema.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.updateSubscriptionItem(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/subscription-items.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.deleteSubscriptionItem(id, scope)\n return NextResponse.json({ success: true })\n } catch (err) {\n console.error('[cpq/inventory/subscription-items.DELETE]', err)\n return NextResponse.json({ error: 'Internal error' }, { status: 500 })\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|