@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.
Files changed (504) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/LICENSE +21 -0
  3. package/MIGRATION.md +236 -0
  4. package/README.md +108 -0
  5. package/dist/modules/cpq/acl.js +30 -0
  6. package/dist/modules/cpq/acl.js.map +7 -0
  7. package/dist/modules/cpq/api/_helpers/handleArcError.js +37 -0
  8. package/dist/modules/cpq/api/_helpers/handleArcError.js.map +7 -0
  9. package/dist/modules/cpq/api/attribute-options/route.js +47 -0
  10. package/dist/modules/cpq/api/attribute-options/route.js.map +7 -0
  11. package/dist/modules/cpq/api/bundle-slots/route.js +101 -0
  12. package/dist/modules/cpq/api/bundle-slots/route.js.map +7 -0
  13. package/dist/modules/cpq/api/bundle-tree/route.js +28 -0
  14. package/dist/modules/cpq/api/bundle-tree/route.js.map +7 -0
  15. package/dist/modules/cpq/api/context.js +29 -0
  16. package/dist/modules/cpq/api/context.js.map +7 -0
  17. package/dist/modules/cpq/api/inventory/assets/route.js +113 -0
  18. package/dist/modules/cpq/api/inventory/assets/route.js.map +7 -0
  19. package/dist/modules/cpq/api/inventory/assets/status/route.js +35 -0
  20. package/dist/modules/cpq/api/inventory/assets/status/route.js.map +7 -0
  21. package/dist/modules/cpq/api/inventory/customer/[customerId]/parent-items/route.js +30 -0
  22. package/dist/modules/cpq/api/inventory/customer/[customerId]/parent-items/route.js.map +7 -0
  23. package/dist/modules/cpq/api/inventory/customer/[customerId]/route.js +31 -0
  24. package/dist/modules/cpq/api/inventory/customer/[customerId]/route.js.map +7 -0
  25. package/dist/modules/cpq/api/inventory/subscription-items/route.js +99 -0
  26. package/dist/modules/cpq/api/inventory/subscription-items/route.js.map +7 -0
  27. package/dist/modules/cpq/api/inventory/subscriptions/[subscriptionId]/change-log/route.js +57 -0
  28. package/dist/modules/cpq/api/inventory/subscriptions/[subscriptionId]/change-log/route.js.map +7 -0
  29. package/dist/modules/cpq/api/inventory/subscriptions/expiring/route.js +62 -0
  30. package/dist/modules/cpq/api/inventory/subscriptions/expiring/route.js.map +7 -0
  31. package/dist/modules/cpq/api/inventory/subscriptions/route.js +116 -0
  32. package/dist/modules/cpq/api/inventory/subscriptions/route.js.map +7 -0
  33. package/dist/modules/cpq/api/inventory/subscriptions/status/route.js +35 -0
  34. package/dist/modules/cpq/api/inventory/subscriptions/status/route.js.map +7 -0
  35. package/dist/modules/cpq/api/offering-components/route.js +91 -0
  36. package/dist/modules/cpq/api/offering-components/route.js.map +7 -0
  37. package/dist/modules/cpq/api/orders/[orderId]/activate/route.js +39 -0
  38. package/dist/modules/cpq/api/orders/[orderId]/activate/route.js.map +7 -0
  39. package/dist/modules/cpq/api/orders/[orderId]/route.js +28 -0
  40. package/dist/modules/cpq/api/orders/[orderId]/route.js.map +7 -0
  41. package/dist/modules/cpq/api/orders/[orderId]/status/route.js +38 -0
  42. package/dist/modules/cpq/api/orders/[orderId]/status/route.js.map +7 -0
  43. package/dist/modules/cpq/api/orders/route.js +71 -0
  44. package/dist/modules/cpq/api/orders/route.js.map +7 -0
  45. package/dist/modules/cpq/api/price-rules/route.js +180 -0
  46. package/dist/modules/cpq/api/price-rules/route.js.map +7 -0
  47. package/dist/modules/cpq/api/pricing-table-entries/route.js +142 -0
  48. package/dist/modules/cpq/api/pricing-table-entries/route.js.map +7 -0
  49. package/dist/modules/cpq/api/pricing-tables/route.js +179 -0
  50. package/dist/modules/cpq/api/pricing-tables/route.js.map +7 -0
  51. package/dist/modules/cpq/api/product-attributes/route.js +160 -0
  52. package/dist/modules/cpq/api/product-attributes/route.js.map +7 -0
  53. package/dist/modules/cpq/api/product-charges/route.js +166 -0
  54. package/dist/modules/cpq/api/product-charges/route.js.map +7 -0
  55. package/dist/modules/cpq/api/product-offerings/route.js +294 -0
  56. package/dist/modules/cpq/api/product-offerings/route.js.map +7 -0
  57. package/dist/modules/cpq/api/product-relationships/route.js +144 -0
  58. package/dist/modules/cpq/api/product-relationships/route.js.map +7 -0
  59. package/dist/modules/cpq/api/product-specifications/route.js +292 -0
  60. package/dist/modules/cpq/api/product-specifications/route.js.map +7 -0
  61. package/dist/modules/cpq/api/quotes/[quoteId]/cancel-meta/route.js +71 -0
  62. package/dist/modules/cpq/api/quotes/[quoteId]/cancel-meta/route.js.map +7 -0
  63. package/dist/modules/cpq/api/quotes/[quoteId]/clone/route.js +29 -0
  64. package/dist/modules/cpq/api/quotes/[quoteId]/clone/route.js.map +7 -0
  65. package/dist/modules/cpq/api/quotes/[quoteId]/items/[lineId]/route.js +54 -0
  66. package/dist/modules/cpq/api/quotes/[quoteId]/items/[lineId]/route.js.map +7 -0
  67. package/dist/modules/cpq/api/quotes/[quoteId]/items/route.js +27 -0
  68. package/dist/modules/cpq/api/quotes/[quoteId]/items/route.js.map +7 -0
  69. package/dist/modules/cpq/api/quotes/[quoteId]/merge-meta/route.js +72 -0
  70. package/dist/modules/cpq/api/quotes/[quoteId]/merge-meta/route.js.map +7 -0
  71. package/dist/modules/cpq/api/quotes/[quoteId]/recalculate/route.js +35 -0
  72. package/dist/modules/cpq/api/quotes/[quoteId]/recalculate/route.js.map +7 -0
  73. package/dist/modules/cpq/api/quotes/[quoteId]/route.js +102 -0
  74. package/dist/modules/cpq/api/quotes/[quoteId]/route.js.map +7 -0
  75. package/dist/modules/cpq/api/quotes/[quoteId]/status/route.js +27 -0
  76. package/dist/modules/cpq/api/quotes/[quoteId]/status/route.js.map +7 -0
  77. package/dist/modules/cpq/api/quotes/[quoteId]/target-subscriptions/[targetId]/route.js +79 -0
  78. package/dist/modules/cpq/api/quotes/[quoteId]/target-subscriptions/[targetId]/route.js.map +7 -0
  79. package/dist/modules/cpq/api/quotes/[quoteId]/target-subscriptions/route.js +95 -0
  80. package/dist/modules/cpq/api/quotes/[quoteId]/target-subscriptions/route.js.map +7 -0
  81. package/dist/modules/cpq/api/quotes/attributes/route.js +52 -0
  82. package/dist/modules/cpq/api/quotes/attributes/route.js.map +7 -0
  83. package/dist/modules/cpq/api/quotes/from-subscription/route.js +72 -0
  84. package/dist/modules/cpq/api/quotes/from-subscription/route.js.map +7 -0
  85. package/dist/modules/cpq/api/quotes/price/route.js +69 -0
  86. package/dist/modules/cpq/api/quotes/price/route.js.map +7 -0
  87. package/dist/modules/cpq/api/quotes/route.js +97 -0
  88. package/dist/modules/cpq/api/quotes/route.js.map +7 -0
  89. package/dist/modules/cpq/api/quotes/validate-relationships/route.js +86 -0
  90. package/dist/modules/cpq/api/quotes/validate-relationships/route.js.map +7 -0
  91. package/dist/modules/cpq/api/resolveQuotingService.js +7 -0
  92. package/dist/modules/cpq/api/resolveQuotingService.js.map +7 -0
  93. package/dist/modules/cpq/api/wizards/resolve/route.js +38 -0
  94. package/dist/modules/cpq/api/wizards/resolve/route.js.map +7 -0
  95. package/dist/modules/cpq/api/wizards/route.js +111 -0
  96. package/dist/modules/cpq/api/wizards/route.js.map +7 -0
  97. package/dist/modules/cpq/backend/cpq/inventory/AssetsTable.js +136 -0
  98. package/dist/modules/cpq/backend/cpq/inventory/AssetsTable.js.map +7 -0
  99. package/dist/modules/cpq/backend/cpq/inventory/SubscriptionsTable.js +185 -0
  100. package/dist/modules/cpq/backend/cpq/inventory/SubscriptionsTable.js.map +7 -0
  101. package/dist/modules/cpq/backend/cpq/inventory/assets/[id]/page.js +343 -0
  102. package/dist/modules/cpq/backend/cpq/inventory/assets/[id]/page.js.map +7 -0
  103. package/dist/modules/cpq/backend/cpq/inventory/assets/[id]/page.meta.js +13 -0
  104. package/dist/modules/cpq/backend/cpq/inventory/assets/[id]/page.meta.js.map +7 -0
  105. package/dist/modules/cpq/backend/cpq/inventory/page.js +35 -0
  106. package/dist/modules/cpq/backend/cpq/inventory/page.js.map +7 -0
  107. package/dist/modules/cpq/backend/cpq/inventory/page.meta.js +18 -0
  108. package/dist/modules/cpq/backend/cpq/inventory/page.meta.js.map +7 -0
  109. package/dist/modules/cpq/backend/cpq/inventory/shared.js +20 -0
  110. package/dist/modules/cpq/backend/cpq/inventory/shared.js.map +7 -0
  111. package/dist/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.js +794 -0
  112. package/dist/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.js.map +7 -0
  113. package/dist/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.meta.js +13 -0
  114. package/dist/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.meta.js.map +7 -0
  115. package/dist/modules/cpq/backend/cpq/offerings/[id]/page.js +917 -0
  116. package/dist/modules/cpq/backend/cpq/offerings/[id]/page.js.map +7 -0
  117. package/dist/modules/cpq/backend/cpq/offerings/page.js +405 -0
  118. package/dist/modules/cpq/backend/cpq/offerings/page.js.map +7 -0
  119. package/dist/modules/cpq/backend/cpq/offerings/page.meta.js +18 -0
  120. package/dist/modules/cpq/backend/cpq/offerings/page.meta.js.map +7 -0
  121. package/dist/modules/cpq/backend/cpq/orders/[id]/page.js +677 -0
  122. package/dist/modules/cpq/backend/cpq/orders/[id]/page.js.map +7 -0
  123. package/dist/modules/cpq/backend/cpq/orders/page.js +134 -0
  124. package/dist/modules/cpq/backend/cpq/orders/page.js.map +7 -0
  125. package/dist/modules/cpq/backend/cpq/orders/page.meta.js +18 -0
  126. package/dist/modules/cpq/backend/cpq/orders/page.meta.js.map +7 -0
  127. package/dist/modules/cpq/backend/cpq/price-rules/PriceRuleForm.js +272 -0
  128. package/dist/modules/cpq/backend/cpq/price-rules/PriceRuleForm.js.map +7 -0
  129. package/dist/modules/cpq/backend/cpq/price-rules/[id]/page.js +407 -0
  130. package/dist/modules/cpq/backend/cpq/price-rules/[id]/page.js.map +7 -0
  131. package/dist/modules/cpq/backend/cpq/price-rules/[id]/page.meta.js +13 -0
  132. package/dist/modules/cpq/backend/cpq/price-rules/[id]/page.meta.js.map +7 -0
  133. package/dist/modules/cpq/backend/cpq/price-rules/page.js +211 -0
  134. package/dist/modules/cpq/backend/cpq/price-rules/page.js.map +7 -0
  135. package/dist/modules/cpq/backend/cpq/price-rules/page.meta.js +18 -0
  136. package/dist/modules/cpq/backend/cpq/price-rules/page.meta.js.map +7 -0
  137. package/dist/modules/cpq/backend/cpq/pricing/[id]/EntriesEditor.js +275 -0
  138. package/dist/modules/cpq/backend/cpq/pricing/[id]/EntriesEditor.js.map +7 -0
  139. package/dist/modules/cpq/backend/cpq/pricing/[id]/ImportPreview.js +112 -0
  140. package/dist/modules/cpq/backend/cpq/pricing/[id]/ImportPreview.js.map +7 -0
  141. package/dist/modules/cpq/backend/cpq/pricing/[id]/page.js +492 -0
  142. package/dist/modules/cpq/backend/cpq/pricing/[id]/page.js.map +7 -0
  143. package/dist/modules/cpq/backend/cpq/pricing/[id]/xlsxExport.js +50 -0
  144. package/dist/modules/cpq/backend/cpq/pricing/[id]/xlsxExport.js.map +7 -0
  145. package/dist/modules/cpq/backend/cpq/pricing/[id]/xlsxImport.js +249 -0
  146. package/dist/modules/cpq/backend/cpq/pricing/[id]/xlsxImport.js.map +7 -0
  147. package/dist/modules/cpq/backend/cpq/pricing/page.js +87 -0
  148. package/dist/modules/cpq/backend/cpq/pricing/page.js.map +7 -0
  149. package/dist/modules/cpq/backend/cpq/pricing/page.meta.js +18 -0
  150. package/dist/modules/cpq/backend/cpq/pricing/page.meta.js.map +7 -0
  151. package/dist/modules/cpq/backend/cpq/quotes/[id]/_components/ArcQuoteConfigurator.js +652 -0
  152. package/dist/modules/cpq/backend/cpq/quotes/[id]/_components/ArcQuoteConfigurator.js.map +7 -0
  153. package/dist/modules/cpq/backend/cpq/quotes/[id]/page.js +1289 -0
  154. package/dist/modules/cpq/backend/cpq/quotes/[id]/page.js.map +7 -0
  155. package/dist/modules/cpq/backend/cpq/quotes/page.js +283 -0
  156. package/dist/modules/cpq/backend/cpq/quotes/page.js.map +7 -0
  157. package/dist/modules/cpq/backend/cpq/quotes/page.meta.js +18 -0
  158. package/dist/modules/cpq/backend/cpq/quotes/page.meta.js.map +7 -0
  159. package/dist/modules/cpq/backend/cpq/specifications/[id]/DependsOnRulesEditor.js +214 -0
  160. package/dist/modules/cpq/backend/cpq/specifications/[id]/DependsOnRulesEditor.js.map +7 -0
  161. package/dist/modules/cpq/backend/cpq/specifications/[id]/page.js +1399 -0
  162. package/dist/modules/cpq/backend/cpq/specifications/[id]/page.js.map +7 -0
  163. package/dist/modules/cpq/backend/cpq/specifications/page.js +148 -0
  164. package/dist/modules/cpq/backend/cpq/specifications/page.js.map +7 -0
  165. package/dist/modules/cpq/backend/cpq/specifications/page.meta.js +18 -0
  166. package/dist/modules/cpq/backend/cpq/specifications/page.meta.js.map +7 -0
  167. package/dist/modules/cpq/backend/cpq/wizards/[definitionCode]/detail/page.js +204 -0
  168. package/dist/modules/cpq/backend/cpq/wizards/[definitionCode]/detail/page.js.map +7 -0
  169. package/dist/modules/cpq/backend/cpq/wizards/[definitionCode]/page.js +191 -0
  170. package/dist/modules/cpq/backend/cpq/wizards/[definitionCode]/page.js.map +7 -0
  171. package/dist/modules/cpq/backend/cpq/wizards/page.js +119 -0
  172. package/dist/modules/cpq/backend/cpq/wizards/page.js.map +7 -0
  173. package/dist/modules/cpq/backend/cpq/wizards/page.meta.js +18 -0
  174. package/dist/modules/cpq/backend/cpq/wizards/page.meta.js.map +7 -0
  175. package/dist/modules/cpq/ce.js +151 -0
  176. package/dist/modules/cpq/ce.js.map +7 -0
  177. package/dist/modules/cpq/cli.js +11 -0
  178. package/dist/modules/cpq/cli.js.map +7 -0
  179. package/dist/modules/cpq/components/CpqListView.js +265 -0
  180. package/dist/modules/cpq/components/CpqListView.js.map +7 -0
  181. package/dist/modules/cpq/components/NumberInput.js +95 -0
  182. package/dist/modules/cpq/components/NumberInput.js.map +7 -0
  183. package/dist/modules/cpq/components/StatusPath.js +60 -0
  184. package/dist/modules/cpq/components/StatusPath.js.map +7 -0
  185. package/dist/modules/cpq/components/statusMaps.js +66 -0
  186. package/dist/modules/cpq/components/statusMaps.js.map +7 -0
  187. package/dist/modules/cpq/components/useCpqRowActions.js +125 -0
  188. package/dist/modules/cpq/components/useCpqRowActions.js.map +7 -0
  189. package/dist/modules/cpq/data/entities.js +1556 -0
  190. package/dist/modules/cpq/data/entities.js.map +7 -0
  191. package/dist/modules/cpq/data/validators.js +575 -0
  192. package/dist/modules/cpq/data/validators.js.map +7 -0
  193. package/dist/modules/cpq/di.js +57 -0
  194. package/dist/modules/cpq/di.js.map +7 -0
  195. package/dist/modules/cpq/events.js +50 -0
  196. package/dist/modules/cpq/events.js.map +7 -0
  197. package/dist/modules/cpq/index.js +16 -0
  198. package/dist/modules/cpq/index.js.map +7 -0
  199. package/dist/modules/cpq/lib/seeds/api.js +32 -0
  200. package/dist/modules/cpq/lib/seeds/api.js.map +7 -0
  201. package/dist/modules/cpq/lib/seeds/tenant-provisioning.js +158 -0
  202. package/dist/modules/cpq/lib/seeds/tenant-provisioning.js.map +7 -0
  203. package/dist/modules/cpq/lib/seeds.js +6 -0
  204. package/dist/modules/cpq/lib/seeds.js.map +7 -0
  205. package/dist/modules/cpq/migrations/Migration20260220220000_cpq.js +40 -0
  206. package/dist/modules/cpq/migrations/Migration20260220220000_cpq.js.map +7 -0
  207. package/dist/modules/cpq/migrations/Migration20260330000000_cpq_product_domain.js +54 -0
  208. package/dist/modules/cpq/migrations/Migration20260330000000_cpq_product_domain.js.map +7 -0
  209. package/dist/modules/cpq/migrations/Migration20260331000000_cpq_charge_unique_per_offering.js +15 -0
  210. package/dist/modules/cpq/migrations/Migration20260331000000_cpq_charge_unique_per_offering.js.map +7 -0
  211. package/dist/modules/cpq/migrations/Migration20260401000000_cpq_quoting_v2.js +62 -0
  212. package/dist/modules/cpq/migrations/Migration20260401000000_cpq_quoting_v2.js.map +7 -0
  213. package/dist/modules/cpq/migrations/Migration20260402000000_cpq_workflows.js +56 -0
  214. package/dist/modules/cpq/migrations/Migration20260402000000_cpq_workflows.js.map +7 -0
  215. package/dist/modules/cpq/migrations/Migration20260407000000_cpq_pricing_tables_v2.js +26 -0
  216. package/dist/modules/cpq/migrations/Migration20260407000000_cpq_pricing_tables_v2.js.map +7 -0
  217. package/dist/modules/cpq/migrations/Migration20260407100000_cpq_price_rules.js +37 -0
  218. package/dist/modules/cpq/migrations/Migration20260407100000_cpq_price_rules.js.map +7 -0
  219. package/dist/modules/cpq/migrations/Migration20260408000000_cpq_price_rules.js +35 -0
  220. package/dist/modules/cpq/migrations/Migration20260408000000_cpq_price_rules.js.map +7 -0
  221. package/dist/modules/cpq/migrations/Migration20260410000000_cpq_drop_datacentres_inventory.js +21 -0
  222. package/dist/modules/cpq/migrations/Migration20260410000000_cpq_drop_datacentres_inventory.js.map +7 -0
  223. package/dist/modules/cpq/migrations/Migration20260410000000_cpq_wizard_rename.js +46 -0
  224. package/dist/modules/cpq/migrations/Migration20260410000000_cpq_wizard_rename.js.map +7 -0
  225. package/dist/modules/cpq/migrations/Migration20260410100000_cpq_inventory.js +118 -0
  226. package/dist/modules/cpq/migrations/Migration20260410100000_cpq_inventory.js.map +7 -0
  227. package/dist/modules/cpq/migrations/Migration20260411000000_cpq_orders.js +63 -0
  228. package/dist/modules/cpq/migrations/Migration20260411000000_cpq_orders.js.map +7 -0
  229. package/dist/modules/cpq/migrations/Migration20260412000000_cpq_bundled_offerings.js +28 -0
  230. package/dist/modules/cpq/migrations/Migration20260412000000_cpq_bundled_offerings.js.map +7 -0
  231. package/dist/modules/cpq/migrations/Migration20260504064621_cpq_arc.js +36 -0
  232. package/dist/modules/cpq/migrations/Migration20260504064621_cpq_arc.js.map +7 -0
  233. package/dist/modules/cpq/migrations/Migration20260514000000_cpq_spec_merge_retired_deprecated.js +14 -0
  234. package/dist/modules/cpq/migrations/Migration20260514000000_cpq_spec_merge_retired_deprecated.js.map +7 -0
  235. package/dist/modules/cpq/migrations/Migration20260514100000_cpq_offering_merge_retired_deprecated.js +14 -0
  236. package/dist/modules/cpq/migrations/Migration20260514100000_cpq_offering_merge_retired_deprecated.js.map +7 -0
  237. package/dist/modules/cpq/migrations/Migration20260514110000_cpq_list_search_indexes.js +58 -0
  238. package/dist/modules/cpq/migrations/Migration20260514110000_cpq_list_search_indexes.js.map +7 -0
  239. package/dist/modules/cpq/migrations/Migration20260515000000_cpq_inventory_subscriptions_search_indexes.js +29 -0
  240. package/dist/modules/cpq/migrations/Migration20260515000000_cpq_inventory_subscriptions_search_indexes.js.map +7 -0
  241. package/dist/modules/cpq/services/cpqBundleService.js +447 -0
  242. package/dist/modules/cpq/services/cpqBundleService.js.map +7 -0
  243. package/dist/modules/cpq/services/cpqInventoryService.js +1371 -0
  244. package/dist/modules/cpq/services/cpqInventoryService.js.map +7 -0
  245. package/dist/modules/cpq/services/cpqOrderService.js +901 -0
  246. package/dist/modules/cpq/services/cpqOrderService.js.map +7 -0
  247. package/dist/modules/cpq/services/cpqPricingService.js +289 -0
  248. package/dist/modules/cpq/services/cpqPricingService.js.map +7 -0
  249. package/dist/modules/cpq/services/cpqProductService.js +204 -0
  250. package/dist/modules/cpq/services/cpqProductService.js.map +7 -0
  251. package/dist/modules/cpq/services/cpqQuotingService.js +1867 -0
  252. package/dist/modules/cpq/services/cpqQuotingService.js.map +7 -0
  253. package/dist/modules/cpq/services/cpqValidationService.js +234 -0
  254. package/dist/modules/cpq/services/cpqValidationService.js.map +7 -0
  255. package/dist/modules/cpq/services/cpqWizardService.js +137 -0
  256. package/dist/modules/cpq/services/cpqWizardService.js.map +7 -0
  257. package/dist/modules/cpq/services/types.js +114 -0
  258. package/dist/modules/cpq/services/types.js.map +7 -0
  259. package/dist/modules/cpq/setup.js +49 -0
  260. package/dist/modules/cpq/setup.js.map +7 -0
  261. package/dist/modules/cpq/subscribers/subscription-amended-log.js +18 -0
  262. package/dist/modules/cpq/subscribers/subscription-amended-log.js.map +7 -0
  263. package/dist/modules/cpq/subscribers/subscription-cancelled-log.js +19 -0
  264. package/dist/modules/cpq/subscribers/subscription-cancelled-log.js.map +7 -0
  265. package/dist/modules/cpq/subscribers/subscription-merged-log.js +20 -0
  266. package/dist/modules/cpq/subscribers/subscription-merged-log.js.map +7 -0
  267. package/dist/modules/cpq/subscribers/subscription-renewed-log.js +18 -0
  268. package/dist/modules/cpq/subscribers/subscription-renewed-log.js.map +7 -0
  269. package/dist/modules/cpq/subscribers/subscription-superseded-log.js +18 -0
  270. package/dist/modules/cpq/subscribers/subscription-superseded-log.js.map +7 -0
  271. package/dist/modules/cpq/widgets/injection/customer-inventory/widget.client.js +192 -0
  272. package/dist/modules/cpq/widgets/injection/customer-inventory/widget.client.js.map +7 -0
  273. package/dist/modules/cpq/widgets/injection/customer-inventory/widget.js +17 -0
  274. package/dist/modules/cpq/widgets/injection/customer-inventory/widget.js.map +7 -0
  275. package/dist/modules/cpq/widgets/injection/order-cpq-tab/widget.client.js +79 -0
  276. package/dist/modules/cpq/widgets/injection/order-cpq-tab/widget.client.js.map +7 -0
  277. package/dist/modules/cpq/widgets/injection/order-cpq-tab/widget.js +17 -0
  278. package/dist/modules/cpq/widgets/injection/order-cpq-tab/widget.js.map +7 -0
  279. package/dist/modules/cpq/widgets/injection/quote-configurator/widget.client.js +181 -0
  280. package/dist/modules/cpq/widgets/injection/quote-configurator/widget.client.js.map +7 -0
  281. package/dist/modules/cpq/widgets/injection/quote-configurator/widget.js +17 -0
  282. package/dist/modules/cpq/widgets/injection/quote-configurator/widget.js.map +7 -0
  283. package/dist/modules/cpq/widgets/injection-table.js +44 -0
  284. package/dist/modules/cpq/widgets/injection-table.js.map +7 -0
  285. package/dist/modules/cpq/workflows/WizardRunner.js +113 -0
  286. package/dist/modules/cpq/workflows/WizardRunner.js.map +7 -0
  287. package/dist/modules/cpq/workflows/WizardTrigger.js +116 -0
  288. package/dist/modules/cpq/workflows/WizardTrigger.js.map +7 -0
  289. package/dist/modules/cpq/workflows/engine.js +188 -0
  290. package/dist/modules/cpq/workflows/engine.js.map +7 -0
  291. package/dist/modules/cpq/workflows/registry.js +16 -0
  292. package/dist/modules/cpq/workflows/registry.js.map +7 -0
  293. package/dist/modules/cpq/workflows/steps/CustomerSelectStep.js +119 -0
  294. package/dist/modules/cpq/workflows/steps/CustomerSelectStep.js.map +7 -0
  295. package/dist/modules/cpq/workflows/steps/InventorySelectStep.js +24 -0
  296. package/dist/modules/cpq/workflows/steps/InventorySelectStep.js.map +7 -0
  297. package/dist/modules/cpq/workflows/steps/ItemListStep.js +115 -0
  298. package/dist/modules/cpq/workflows/steps/ItemListStep.js.map +7 -0
  299. package/dist/modules/cpq/workflows/steps/OfferingSelectStep.js +327 -0
  300. package/dist/modules/cpq/workflows/steps/OfferingSelectStep.js.map +7 -0
  301. package/dist/modules/cpq/workflows/steps/ProductConfigureStep.js +231 -0
  302. package/dist/modules/cpq/workflows/steps/ProductConfigureStep.js.map +7 -0
  303. package/dist/modules/cpq/workflows/steps/ReviewStep.js +152 -0
  304. package/dist/modules/cpq/workflows/steps/ReviewStep.js.map +7 -0
  305. package/dist/modules/cpq/workflows/steps/index.js +49 -0
  306. package/dist/modules/cpq/workflows/steps/index.js.map +7 -0
  307. package/dist/modules/cpq/workflows/types.js +1 -0
  308. package/dist/modules/cpq/workflows/types.js.map +7 -0
  309. package/package.json +150 -0
  310. package/src/modules/cpq/__integration__/TC-CPQ-001.spec.ts +177 -0
  311. package/src/modules/cpq/__integration__/TC-CPQ-002.spec.ts +123 -0
  312. package/src/modules/cpq/__integration__/TC-CPQ-003.spec.ts +115 -0
  313. package/src/modules/cpq/__integration__/TC-CPQ-004.spec.ts +184 -0
  314. package/src/modules/cpq/__integration__/TC-CPQ-005.spec.ts +43 -0
  315. package/src/modules/cpq/__integration__/TC-CPQ-006.spec.ts +87 -0
  316. package/src/modules/cpq/__integration__/TC-CPQ-007.spec.ts +79 -0
  317. package/src/modules/cpq/__integration__/TC-CPQ-008.spec.ts +55 -0
  318. package/src/modules/cpq/__integration__/TC-CPQ-009.spec.ts +45 -0
  319. package/src/modules/cpq/__integration__/TC-CPQ-010.spec.ts +54 -0
  320. package/src/modules/cpq/__integration__/TC-CPQ-011.spec.ts +24 -0
  321. package/src/modules/cpq/__integration__/TC-CPQ-012.spec.ts +62 -0
  322. package/src/modules/cpq/__integration__/TC-CPQ-ARC-001.spec.ts +52 -0
  323. package/src/modules/cpq/__integration__/TC-CPQ-ARC-002.spec.ts +65 -0
  324. package/src/modules/cpq/__integration__/TC-CPQ-ARC-003.spec.ts +107 -0
  325. package/src/modules/cpq/__integration__/TC-CPQ-ARC-004.spec.ts +74 -0
  326. package/src/modules/cpq/__integration__/TC-CPQ-ARC-005.spec.ts +86 -0
  327. package/src/modules/cpq/__integration__/TC-CPQ-ARC-006.spec.ts +79 -0
  328. package/src/modules/cpq/__integration__/TC-CPQ-ARC-007.spec.ts +63 -0
  329. package/src/modules/cpq/__integration__/TC-CPQ-ARC-008.spec.ts +62 -0
  330. package/src/modules/cpq/__integration__/TC-CPQ-ARC-009.spec.ts +62 -0
  331. package/src/modules/cpq/__integration__/TC-CPQ-ARC-010.spec.ts +59 -0
  332. package/src/modules/cpq/__integration__/TC-CPQ-ARC-011.spec.ts +128 -0
  333. package/src/modules/cpq/__integration__/_helpers/cpqArcFixtures.ts +208 -0
  334. package/src/modules/cpq/__tests__/package-isolation.test.ts +232 -0
  335. package/src/modules/cpq/acl.ts +26 -0
  336. package/src/modules/cpq/api/_helpers/__tests__/handleArcError.test.ts +117 -0
  337. package/src/modules/cpq/api/_helpers/handleArcError.ts +81 -0
  338. package/src/modules/cpq/api/attribute-options/route.ts +55 -0
  339. package/src/modules/cpq/api/bundle-slots/route.ts +112 -0
  340. package/src/modules/cpq/api/bundle-tree/route.ts +31 -0
  341. package/src/modules/cpq/api/context.ts +39 -0
  342. package/src/modules/cpq/api/inventory/assets/route.ts +123 -0
  343. package/src/modules/cpq/api/inventory/assets/status/route.ts +34 -0
  344. package/src/modules/cpq/api/inventory/customer/[customerId]/parent-items/route.ts +30 -0
  345. package/src/modules/cpq/api/inventory/customer/[customerId]/route.ts +31 -0
  346. package/src/modules/cpq/api/inventory/subscription-items/route.ts +107 -0
  347. package/src/modules/cpq/api/inventory/subscriptions/[subscriptionId]/change-log/route.ts +64 -0
  348. package/src/modules/cpq/api/inventory/subscriptions/expiring/route.ts +66 -0
  349. package/src/modules/cpq/api/inventory/subscriptions/route.ts +126 -0
  350. package/src/modules/cpq/api/inventory/subscriptions/status/route.ts +34 -0
  351. package/src/modules/cpq/api/offering-components/route.ts +103 -0
  352. package/src/modules/cpq/api/orders/[orderId]/activate/route.ts +48 -0
  353. package/src/modules/cpq/api/orders/[orderId]/route.ts +28 -0
  354. package/src/modules/cpq/api/orders/[orderId]/status/route.ts +38 -0
  355. package/src/modules/cpq/api/orders/route.ts +77 -0
  356. package/src/modules/cpq/api/price-rules/route.ts +210 -0
  357. package/src/modules/cpq/api/pricing-table-entries/route.ts +159 -0
  358. package/src/modules/cpq/api/pricing-tables/route.ts +202 -0
  359. package/src/modules/cpq/api/product-attributes/route.ts +175 -0
  360. package/src/modules/cpq/api/product-charges/route.ts +181 -0
  361. package/src/modules/cpq/api/product-offerings/route.ts +329 -0
  362. package/src/modules/cpq/api/product-relationships/route.ts +156 -0
  363. package/src/modules/cpq/api/product-specifications/route.ts +325 -0
  364. package/src/modules/cpq/api/quotes/[quoteId]/cancel-meta/route.ts +77 -0
  365. package/src/modules/cpq/api/quotes/[quoteId]/clone/route.ts +28 -0
  366. package/src/modules/cpq/api/quotes/[quoteId]/items/[lineId]/route.ts +55 -0
  367. package/src/modules/cpq/api/quotes/[quoteId]/items/route.ts +26 -0
  368. package/src/modules/cpq/api/quotes/[quoteId]/merge-meta/route.ts +78 -0
  369. package/src/modules/cpq/api/quotes/[quoteId]/recalculate/route.ts +34 -0
  370. package/src/modules/cpq/api/quotes/[quoteId]/route.ts +109 -0
  371. package/src/modules/cpq/api/quotes/[quoteId]/status/route.ts +26 -0
  372. package/src/modules/cpq/api/quotes/[quoteId]/target-subscriptions/[targetId]/route.ts +91 -0
  373. package/src/modules/cpq/api/quotes/[quoteId]/target-subscriptions/route.ts +107 -0
  374. package/src/modules/cpq/api/quotes/attributes/route.ts +61 -0
  375. package/src/modules/cpq/api/quotes/from-subscription/route.ts +85 -0
  376. package/src/modules/cpq/api/quotes/price/route.ts +81 -0
  377. package/src/modules/cpq/api/quotes/route.ts +114 -0
  378. package/src/modules/cpq/api/quotes/validate-relationships/route.ts +100 -0
  379. package/src/modules/cpq/api/resolveQuotingService.ts +11 -0
  380. package/src/modules/cpq/api/wizards/resolve/route.ts +39 -0
  381. package/src/modules/cpq/api/wizards/route.ts +127 -0
  382. package/src/modules/cpq/backend/cpq/inventory/AssetsTable.tsx +166 -0
  383. package/src/modules/cpq/backend/cpq/inventory/SubscriptionsTable.tsx +251 -0
  384. package/src/modules/cpq/backend/cpq/inventory/assets/[id]/page.meta.ts +9 -0
  385. package/src/modules/cpq/backend/cpq/inventory/assets/[id]/page.tsx +440 -0
  386. package/src/modules/cpq/backend/cpq/inventory/page.meta.ts +16 -0
  387. package/src/modules/cpq/backend/cpq/inventory/page.tsx +49 -0
  388. package/src/modules/cpq/backend/cpq/inventory/shared.tsx +32 -0
  389. package/src/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.meta.ts +9 -0
  390. package/src/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.tsx +1085 -0
  391. package/src/modules/cpq/backend/cpq/offerings/[id]/page.tsx +1165 -0
  392. package/src/modules/cpq/backend/cpq/offerings/page.meta.ts +16 -0
  393. package/src/modules/cpq/backend/cpq/offerings/page.tsx +468 -0
  394. package/src/modules/cpq/backend/cpq/orders/[id]/page.tsx +921 -0
  395. package/src/modules/cpq/backend/cpq/orders/page.meta.ts +16 -0
  396. package/src/modules/cpq/backend/cpq/orders/page.tsx +182 -0
  397. package/src/modules/cpq/backend/cpq/price-rules/PriceRuleForm.tsx +310 -0
  398. package/src/modules/cpq/backend/cpq/price-rules/[id]/page.meta.ts +9 -0
  399. package/src/modules/cpq/backend/cpq/price-rules/[id]/page.tsx +472 -0
  400. package/src/modules/cpq/backend/cpq/price-rules/page.meta.ts +16 -0
  401. package/src/modules/cpq/backend/cpq/price-rules/page.tsx +253 -0
  402. package/src/modules/cpq/backend/cpq/pricing/[id]/EntriesEditor.tsx +431 -0
  403. package/src/modules/cpq/backend/cpq/pricing/[id]/ImportPreview.tsx +122 -0
  404. package/src/modules/cpq/backend/cpq/pricing/[id]/page.tsx +588 -0
  405. package/src/modules/cpq/backend/cpq/pricing/[id]/xlsxExport.ts +90 -0
  406. package/src/modules/cpq/backend/cpq/pricing/[id]/xlsxImport.ts +338 -0
  407. package/src/modules/cpq/backend/cpq/pricing/page.meta.ts +16 -0
  408. package/src/modules/cpq/backend/cpq/pricing/page.tsx +111 -0
  409. package/src/modules/cpq/backend/cpq/quotes/[id]/_components/ArcQuoteConfigurator.tsx +737 -0
  410. package/src/modules/cpq/backend/cpq/quotes/[id]/page.tsx +1721 -0
  411. package/src/modules/cpq/backend/cpq/quotes/page.meta.ts +16 -0
  412. package/src/modules/cpq/backend/cpq/quotes/page.tsx +370 -0
  413. package/src/modules/cpq/backend/cpq/specifications/[id]/DependsOnRulesEditor.tsx +300 -0
  414. package/src/modules/cpq/backend/cpq/specifications/[id]/page.tsx +1722 -0
  415. package/src/modules/cpq/backend/cpq/specifications/page.meta.ts +16 -0
  416. package/src/modules/cpq/backend/cpq/specifications/page.tsx +191 -0
  417. package/src/modules/cpq/backend/cpq/wizards/[definitionCode]/detail/page.tsx +319 -0
  418. package/src/modules/cpq/backend/cpq/wizards/[definitionCode]/page.tsx +234 -0
  419. package/src/modules/cpq/backend/cpq/wizards/page.meta.ts +16 -0
  420. package/src/modules/cpq/backend/cpq/wizards/page.tsx +141 -0
  421. package/src/modules/cpq/ce.ts +150 -0
  422. package/src/modules/cpq/cli.ts +10 -0
  423. package/src/modules/cpq/components/CpqListView.tsx +431 -0
  424. package/src/modules/cpq/components/NumberInput.tsx +166 -0
  425. package/src/modules/cpq/components/StatusPath.tsx +116 -0
  426. package/src/modules/cpq/components/statusMaps.ts +148 -0
  427. package/src/modules/cpq/components/useCpqRowActions.tsx +183 -0
  428. package/src/modules/cpq/data/__tests__/validators.arc.test.ts +271 -0
  429. package/src/modules/cpq/data/__tests__/validators.test.ts +782 -0
  430. package/src/modules/cpq/data/entities.ts +1467 -0
  431. package/src/modules/cpq/data/validators.ts +663 -0
  432. package/src/modules/cpq/di.ts +70 -0
  433. package/src/modules/cpq/events.ts +62 -0
  434. package/src/modules/cpq/index.ts +15 -0
  435. package/src/modules/cpq/lib/seeds/__tests__/api.test.ts +86 -0
  436. package/src/modules/cpq/lib/seeds/__tests__/tenant-provisioning.test.ts +349 -0
  437. package/src/modules/cpq/lib/seeds/api.ts +119 -0
  438. package/src/modules/cpq/lib/seeds/tenant-provisioning.ts +239 -0
  439. package/src/modules/cpq/lib/seeds.ts +18 -0
  440. package/src/modules/cpq/migrations/.snapshot-open-mercato.json +7473 -0
  441. package/src/modules/cpq/migrations/Migration20260220220000_cpq.ts +51 -0
  442. package/src/modules/cpq/migrations/Migration20260330000000_cpq_product_domain.ts +70 -0
  443. package/src/modules/cpq/migrations/Migration20260331000000_cpq_charge_unique_per_offering.ts +15 -0
  444. package/src/modules/cpq/migrations/Migration20260401000000_cpq_quoting_v2.ts +73 -0
  445. package/src/modules/cpq/migrations/Migration20260402000000_cpq_workflows.ts +59 -0
  446. package/src/modules/cpq/migrations/Migration20260407000000_cpq_pricing_tables_v2.ts +30 -0
  447. package/src/modules/cpq/migrations/Migration20260407100000_cpq_price_rules.ts +36 -0
  448. package/src/modules/cpq/migrations/Migration20260408000000_cpq_price_rules.ts +33 -0
  449. package/src/modules/cpq/migrations/Migration20260410000000_cpq_drop_datacentres_inventory.ts +22 -0
  450. package/src/modules/cpq/migrations/Migration20260410000000_cpq_wizard_rename.ts +56 -0
  451. package/src/modules/cpq/migrations/Migration20260410100000_cpq_inventory.ts +118 -0
  452. package/src/modules/cpq/migrations/Migration20260411000000_cpq_orders.ts +62 -0
  453. package/src/modules/cpq/migrations/Migration20260412000000_cpq_bundled_offerings.ts +33 -0
  454. package/src/modules/cpq/migrations/Migration20260504064621_cpq_arc.ts +68 -0
  455. package/src/modules/cpq/migrations/Migration20260514000000_cpq_spec_merge_retired_deprecated.ts +30 -0
  456. package/src/modules/cpq/migrations/Migration20260514100000_cpq_offering_merge_retired_deprecated.ts +27 -0
  457. package/src/modules/cpq/migrations/Migration20260514110000_cpq_list_search_indexes.ts +82 -0
  458. package/src/modules/cpq/migrations/Migration20260515000000_cpq_inventory_subscriptions_search_indexes.ts +52 -0
  459. package/src/modules/cpq/services/__tests__/_helpers/mockEm.ts +59 -0
  460. package/src/modules/cpq/services/__tests__/cpqBundleService.test.ts +661 -0
  461. package/src/modules/cpq/services/__tests__/cpqInventoryService.arc.test.ts +357 -0
  462. package/src/modules/cpq/services/__tests__/cpqInventoryService.test.ts +718 -0
  463. package/src/modules/cpq/services/__tests__/cpqOrderService.test.ts +603 -0
  464. package/src/modules/cpq/services/__tests__/cpqPricingService.test.ts +1012 -0
  465. package/src/modules/cpq/services/__tests__/cpqProductService.test.ts +603 -0
  466. package/src/modules/cpq/services/__tests__/cpqQuotingService.arc.test.ts +143 -0
  467. package/src/modules/cpq/services/__tests__/cpqQuotingService.test.ts +658 -0
  468. package/src/modules/cpq/services/__tests__/cpqValidationService.test.ts +811 -0
  469. package/src/modules/cpq/services/__tests__/cpqWizardService.test.ts +389 -0
  470. package/src/modules/cpq/services/__tests__/types.test.ts +359 -0
  471. package/src/modules/cpq/services/cpqBundleService.ts +671 -0
  472. package/src/modules/cpq/services/cpqInventoryService.ts +1929 -0
  473. package/src/modules/cpq/services/cpqOrderService.ts +1230 -0
  474. package/src/modules/cpq/services/cpqPricingService.ts +412 -0
  475. package/src/modules/cpq/services/cpqProductService.ts +311 -0
  476. package/src/modules/cpq/services/cpqQuotingService.ts +2638 -0
  477. package/src/modules/cpq/services/cpqValidationService.ts +323 -0
  478. package/src/modules/cpq/services/cpqWizardService.ts +204 -0
  479. package/src/modules/cpq/services/types.ts +303 -0
  480. package/src/modules/cpq/setup.ts +63 -0
  481. package/src/modules/cpq/subscribers/subscription-amended-log.ts +20 -0
  482. package/src/modules/cpq/subscribers/subscription-cancelled-log.ts +19 -0
  483. package/src/modules/cpq/subscribers/subscription-merged-log.ts +22 -0
  484. package/src/modules/cpq/subscribers/subscription-renewed-log.ts +18 -0
  485. package/src/modules/cpq/subscribers/subscription-superseded-log.ts +19 -0
  486. package/src/modules/cpq/widgets/injection/customer-inventory/widget.client.tsx +339 -0
  487. package/src/modules/cpq/widgets/injection/customer-inventory/widget.ts +16 -0
  488. package/src/modules/cpq/widgets/injection/order-cpq-tab/widget.client.tsx +96 -0
  489. package/src/modules/cpq/widgets/injection/order-cpq-tab/widget.ts +16 -0
  490. package/src/modules/cpq/widgets/injection/quote-configurator/widget.client.tsx +265 -0
  491. package/src/modules/cpq/widgets/injection/quote-configurator/widget.ts +16 -0
  492. package/src/modules/cpq/widgets/injection-table.ts +42 -0
  493. package/src/modules/cpq/workflows/WizardRunner.tsx +158 -0
  494. package/src/modules/cpq/workflows/WizardTrigger.tsx +142 -0
  495. package/src/modules/cpq/workflows/engine.tsx +278 -0
  496. package/src/modules/cpq/workflows/registry.ts +15 -0
  497. package/src/modules/cpq/workflows/steps/CustomerSelectStep.tsx +136 -0
  498. package/src/modules/cpq/workflows/steps/InventorySelectStep.tsx +34 -0
  499. package/src/modules/cpq/workflows/steps/ItemListStep.tsx +146 -0
  500. package/src/modules/cpq/workflows/steps/OfferingSelectStep.tsx +438 -0
  501. package/src/modules/cpq/workflows/steps/ProductConfigureStep.tsx +287 -0
  502. package/src/modules/cpq/workflows/steps/ReviewStep.tsx +219 -0
  503. package/src/modules/cpq/workflows/steps/index.ts +51 -0
  504. package/src/modules/cpq/workflows/types.ts +102 -0
@@ -0,0 +1,51 @@
1
+ import { Migration } from '@mikro-orm/migrations'
2
+
3
+ export class Migration20260220220000_cpq extends Migration {
4
+ async up(): Promise<void> {
5
+ // cpq_data_centres
6
+ this.addSql(`create table "cpq_data_centres" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "code" text not null, "name" text not null, "city" text null, "country" text null, "address" text null, "capabilities" jsonb null, "is_active" boolean not null default true, "metadata" jsonb null, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, constraint "cpq_data_centres_pkey" primary key ("id"));`)
7
+ this.addSql(`create index "cpq_data_centres_scope_idx" on "cpq_data_centres" ("organization_id", "tenant_id");`)
8
+ this.addSql(`alter table "cpq_data_centres" add constraint "cpq_data_centres_code_unique" unique ("organization_id", "tenant_id", "code");`)
9
+
10
+ // cpq_product_attributes
11
+ this.addSql(`create table "cpq_product_attributes" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "product_id" uuid not null, "code" text not null, "name" text not null, "attribute_type" text not null, "options" jsonb null, "constraints" jsonb null, "sort_order" int not null default 0, "is_required" boolean not null default true, "is_active" boolean not null default true, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, constraint "cpq_product_attributes_pkey" primary key ("id"));`)
12
+ this.addSql(`create index "cpq_product_attributes_scope_idx" on "cpq_product_attributes" ("organization_id", "tenant_id", "product_id");`)
13
+ this.addSql(`alter table "cpq_product_attributes" add constraint "cpq_product_attributes_code_unique" unique ("organization_id", "tenant_id", "product_id", "code");`)
14
+
15
+ // cpq_pricing_tables
16
+ this.addSql(`create table "cpq_pricing_tables" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "code" text not null, "name" text not null, "description" text null, "product_id" uuid null, "dimensions" jsonb not null, "price_columns" jsonb not null, "pricing_model" text not null, "currency_code" text not null default 'USD', "is_active" boolean not null default true, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, constraint "cpq_pricing_tables_pkey" primary key ("id"));`)
17
+ this.addSql(`create index "cpq_pricing_tables_scope_idx" on "cpq_pricing_tables" ("organization_id", "tenant_id");`)
18
+ this.addSql(`alter table "cpq_pricing_tables" add constraint "cpq_pricing_tables_code_unique" unique ("organization_id", "tenant_id", "code");`)
19
+
20
+ // cpq_pricing_table_entries
21
+ this.addSql(`create table "cpq_pricing_table_entries" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "pricing_table_id" uuid not null, "dimension_values" jsonb not null, "tier_number" int null, "range_from" numeric null, "range_to" numeric null, "prices" jsonb not null, "is_active" boolean not null default true, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, constraint "cpq_pricing_table_entries_pkey" primary key ("id"));`)
22
+ this.addSql(`create index "cpq_pricing_table_entries_scope_idx" on "cpq_pricing_table_entries" ("organization_id", "tenant_id", "pricing_table_id");`)
23
+ this.addSql(`create index "cpq_pricing_table_entries_dim_gin_idx" on "cpq_pricing_table_entries" using gin ("dimension_values");`)
24
+
25
+ // cpq_product_charges
26
+ this.addSql(`create table "cpq_product_charges" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "product_id" uuid not null, "code" text not null, "name" text not null, "charge_type" text not null, "pricing_method" text not null, "pricing_table_id" uuid null, "price_column_key" text null, "quantity_attribute_code" text null, "applicability_condition" jsonb null, "sort_order" int not null default 0, "is_active" boolean not null default true, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, constraint "cpq_product_charges_pkey" primary key ("id"));`)
27
+ this.addSql(`create index "cpq_product_charges_scope_idx" on "cpq_product_charges" ("organization_id", "tenant_id", "product_id");`)
28
+ this.addSql(`alter table "cpq_product_charges" add constraint "cpq_product_charges_code_unique" unique ("organization_id", "tenant_id", "product_id", "code");`)
29
+
30
+ // cpq_inventory_items
31
+ this.addSql(`create table "cpq_inventory_items" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "customer_id" uuid not null, "product_id" uuid not null, "parent_inventory_item_id" uuid null, "status" text not null default 'pending', "configuration" jsonb not null, "charges" jsonb null, "data_centre_id" uuid null, "currency_code" text not null default 'USD', "activated_at" timestamptz null, "terminated_at" timestamptz null, "source_quote_id" uuid null, "source_order_id" uuid null, "metadata" jsonb null, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, constraint "cpq_inventory_items_pkey" primary key ("id"));`)
32
+ this.addSql(`create index "cpq_inventory_items_customer_idx" on "cpq_inventory_items" ("organization_id", "tenant_id", "customer_id");`)
33
+ this.addSql(`create index "cpq_inventory_items_parent_idx" on "cpq_inventory_items" ("organization_id", "tenant_id", "parent_inventory_item_id");`)
34
+ this.addSql(`create index "cpq_inventory_items_status_idx" on "cpq_inventory_items" ("customer_id", "status");`)
35
+ this.addSql(`create index "cpq_inventory_items_config_gin_idx" on "cpq_inventory_items" using gin ("configuration");`)
36
+
37
+ // cpq_quote_configurations
38
+ this.addSql(`create table "cpq_quote_configurations" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "quote_id" uuid not null, "customer_id" uuid not null, "quote_type" text not null, "selected_parent_inventory_item_id" uuid null, "primary_item_configuration" jsonb null, "child_item_configurations" jsonb null, "validation_result" jsonb null, "pricing_summary" jsonb null, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, constraint "cpq_quote_configurations_pkey" primary key ("id"));`)
39
+ this.addSql(`alter table "cpq_quote_configurations" add constraint "cpq_quote_configurations_quote_unique" unique ("organization_id", "tenant_id", "quote_id");`)
40
+ }
41
+
42
+ async down(): Promise<void> {
43
+ this.addSql(`drop table if exists "cpq_quote_configurations" cascade;`)
44
+ this.addSql(`drop table if exists "cpq_inventory_items" cascade;`)
45
+ this.addSql(`drop table if exists "cpq_product_charges" cascade;`)
46
+ this.addSql(`drop table if exists "cpq_pricing_table_entries" cascade;`)
47
+ this.addSql(`drop table if exists "cpq_pricing_tables" cascade;`)
48
+ this.addSql(`drop table if exists "cpq_product_attributes" cascade;`)
49
+ this.addSql(`drop table if exists "cpq_data_centres" cascade;`)
50
+ }
51
+ }
@@ -0,0 +1,70 @@
1
+ import { Migration } from '@mikro-orm/migrations'
2
+
3
+ export class Migration20260330000000_cpq_product_domain extends Migration {
4
+ async up(): Promise<void> {
5
+ // ─── New tables ──────────────────────────────────────────────────
6
+
7
+ // cpq_product_specifications
8
+ this.addSql(`create table "cpq_product_specifications" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "product_id" uuid not null, "code" text not null, "name" text not null, "description" text null, "lifecycle_status" text not null default 'draft', "version" int not null default 1, "effective_from" timestamptz null, "effective_to" timestamptz null, "metadata" jsonb null, "is_active" boolean not null default true, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, constraint "cpq_product_specifications_pkey" primary key ("id"));`)
9
+ this.addSql(`alter table "cpq_product_specifications" add constraint "cpq_product_specifications_product_unique" unique ("organization_id", "tenant_id", "product_id");`)
10
+ this.addSql(`alter table "cpq_product_specifications" add constraint "cpq_product_specifications_code_unique" unique ("organization_id", "tenant_id", "code");`)
11
+ this.addSql(`create index "cpq_product_specifications_lifecycle_idx" on "cpq_product_specifications" ("organization_id", "tenant_id", "lifecycle_status");`)
12
+
13
+ // cpq_product_offerings
14
+ this.addSql(`create table "cpq_product_offerings" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "spec_id" uuid not null, "catalog_offer_id" uuid null, "code" text not null, "name" text not null, "description" text null, "design_time_values" jsonb not null default '{}', "lifecycle_status" text not null default 'draft', "effective_from" timestamptz null, "effective_to" timestamptz null, "metadata" jsonb null, "is_active" boolean not null default true, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, constraint "cpq_product_offerings_pkey" primary key ("id"));`)
15
+ this.addSql(`alter table "cpq_product_offerings" add constraint "cpq_product_offerings_code_unique" unique ("organization_id", "tenant_id", "code");`)
16
+ this.addSql(`create index "cpq_product_offerings_spec_idx" on "cpq_product_offerings" ("organization_id", "tenant_id", "spec_id");`)
17
+ this.addSql(`create index "cpq_product_offerings_lifecycle_idx" on "cpq_product_offerings" ("organization_id", "tenant_id", "lifecycle_status");`)
18
+
19
+ // cpq_product_relationships
20
+ this.addSql(`create table "cpq_product_relationships" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "source_spec_id" uuid not null, "target_spec_id" uuid not null, "relationship_type" text not null, "cardinality_min" int not null default 0, "cardinality_max" int null, "condition" jsonb null, "metadata" jsonb null, "is_active" boolean not null default true, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, constraint "cpq_product_relationships_pkey" primary key ("id"));`)
21
+ this.addSql(`alter table "cpq_product_relationships" add constraint "cpq_product_relationships_unique" unique ("organization_id", "tenant_id", "source_spec_id", "target_spec_id", "relationship_type");`)
22
+ this.addSql(`create index "cpq_product_relationships_source_idx" on "cpq_product_relationships" ("organization_id", "tenant_id", "source_spec_id");`)
23
+ this.addSql(`create index "cpq_product_relationships_target_idx" on "cpq_product_relationships" ("organization_id", "tenant_id", "target_spec_id");`)
24
+
25
+ // ─── Alter existing tables ───────────────────────────────────────
26
+
27
+ // cpq_product_attributes — add v2 columns
28
+ this.addSql(`alter table "cpq_product_attributes" add column "spec_id" uuid null;`)
29
+ this.addSql(`alter table "cpq_product_attributes" add column "resolution_time" text not null default 'run_time';`)
30
+ this.addSql(`alter table "cpq_product_attributes" add column "reference_entity" text null;`)
31
+ this.addSql(`alter table "cpq_product_attributes" add column "reference_filter" jsonb null;`)
32
+ this.addSql(`alter table "cpq_product_attributes" add column "depends_on" jsonb null;`)
33
+ this.addSql(`alter table "cpq_product_attributes" add column "default_value" jsonb null;`)
34
+ this.addSql(`alter table "cpq_product_attributes" add column "help_text" text null;`)
35
+ this.addSql(`create index "cpq_product_attributes_spec_idx" on "cpq_product_attributes" ("organization_id", "tenant_id", "spec_id");`)
36
+ this.addSql(`create index "cpq_product_attributes_spec_resolution_idx" on "cpq_product_attributes" ("organization_id", "tenant_id", "spec_id", "resolution_time");`)
37
+
38
+ // cpq_product_charges — add v2 columns
39
+ this.addSql(`alter table "cpq_product_charges" add column "offering_id" uuid null;`)
40
+ this.addSql(`alter table "cpq_product_charges" add column "fixed_price" numeric null;`)
41
+ this.addSql(`alter table "cpq_product_charges" add column "currency_code" text null;`)
42
+ this.addSql(`alter table "cpq_product_charges" add column "description" text null;`)
43
+ this.addSql(`create index "cpq_product_charges_offering_idx" on "cpq_product_charges" ("organization_id", "tenant_id", "offering_id");`)
44
+ }
45
+
46
+ async down(): Promise<void> {
47
+ // Drop new tables
48
+ this.addSql(`drop table if exists "cpq_product_relationships" cascade;`)
49
+ this.addSql(`drop table if exists "cpq_product_offerings" cascade;`)
50
+ this.addSql(`drop table if exists "cpq_product_specifications" cascade;`)
51
+
52
+ // Remove added columns from cpq_product_attributes
53
+ this.addSql(`drop index if exists "cpq_product_attributes_spec_idx";`)
54
+ this.addSql(`drop index if exists "cpq_product_attributes_spec_resolution_idx";`)
55
+ this.addSql(`alter table "cpq_product_attributes" drop column if exists "spec_id";`)
56
+ this.addSql(`alter table "cpq_product_attributes" drop column if exists "resolution_time";`)
57
+ this.addSql(`alter table "cpq_product_attributes" drop column if exists "reference_entity";`)
58
+ this.addSql(`alter table "cpq_product_attributes" drop column if exists "reference_filter";`)
59
+ this.addSql(`alter table "cpq_product_attributes" drop column if exists "depends_on";`)
60
+ this.addSql(`alter table "cpq_product_attributes" drop column if exists "default_value";`)
61
+ this.addSql(`alter table "cpq_product_attributes" drop column if exists "help_text";`)
62
+
63
+ // Remove added columns from cpq_product_charges
64
+ this.addSql(`drop index if exists "cpq_product_charges_offering_idx";`)
65
+ this.addSql(`alter table "cpq_product_charges" drop column if exists "offering_id";`)
66
+ this.addSql(`alter table "cpq_product_charges" drop column if exists "fixed_price";`)
67
+ this.addSql(`alter table "cpq_product_charges" drop column if exists "currency_code";`)
68
+ this.addSql(`alter table "cpq_product_charges" drop column if exists "description";`)
69
+ }
70
+ }
@@ -0,0 +1,15 @@
1
+ import { Migration } from '@mikro-orm/migrations'
2
+
3
+ export class Migration20260331000000_cpq_charge_unique_per_offering extends Migration {
4
+ async up(): Promise<void> {
5
+ // Drop the old unique constraint scoped to product_id
6
+ this.addSql(`alter table "cpq_product_charges" drop constraint if exists "cpq_product_charges_code_unique";`)
7
+ // Add new unique constraint scoped to offering_id (for v2 charges)
8
+ this.addSql(`alter table "cpq_product_charges" add constraint "cpq_product_charges_offering_code_unique" unique ("organization_id", "tenant_id", "offering_id", "code");`)
9
+ }
10
+
11
+ async down(): Promise<void> {
12
+ this.addSql(`alter table "cpq_product_charges" drop constraint if exists "cpq_product_charges_offering_code_unique";`)
13
+ this.addSql(`alter table "cpq_product_charges" add constraint "cpq_product_charges_code_unique" unique ("organization_id", "tenant_id", "product_id", "code");`)
14
+ }
15
+ }
@@ -0,0 +1,73 @@
1
+ import { Migration } from '@mikro-orm/migrations'
2
+
3
+ export class Migration20260401000000_cpq_quoting_v2 extends Migration {
4
+ async up(): Promise<void> {
5
+ // ─── New table: cpq_quote_line_configurations ──────────────────
6
+ this.addSql(`create table "cpq_quote_line_configurations" (
7
+ "id" uuid not null default gen_random_uuid(),
8
+ "organization_id" uuid not null,
9
+ "tenant_id" uuid not null,
10
+ "quote_line_id" uuid not null,
11
+ "quote_configuration_id" uuid not null,
12
+ "offering_id" uuid null,
13
+ "product_id" uuid null,
14
+ "spec_id" uuid null,
15
+ "action" text not null default 'add',
16
+ "parent_line_id" uuid null,
17
+ "start_date" date null,
18
+ "term_months" int null,
19
+ "end_date" date null,
20
+ "configuration" jsonb not null default '{}',
21
+ "quantity" int not null default 1,
22
+ "charges" jsonb null,
23
+ "nrc_total" numeric(18, 4) not null default 0,
24
+ "mrc_total" numeric(18, 4) not null default 0,
25
+ "usage_estimates" jsonb null,
26
+ "usage_total_estimated" numeric(18, 4) null,
27
+ "validation_errors" jsonb null,
28
+ "is_configured" boolean not null default false,
29
+ "created_at" timestamptz not null,
30
+ "updated_at" timestamptz not null,
31
+ "deleted_at" timestamptz null,
32
+ constraint "cpq_quote_line_configurations_pkey" primary key ("id")
33
+ );`)
34
+
35
+ this.addSql(`alter table "cpq_quote_line_configurations" add constraint "cpq_qlc_quote_line_unique" unique ("organization_id", "tenant_id", "quote_line_id");`)
36
+ this.addSql(`create index "cpq_qlc_quote_config_idx" on "cpq_quote_line_configurations" ("organization_id", "tenant_id", "quote_configuration_id");`)
37
+ this.addSql(`create index "cpq_qlc_parent_line_idx" on "cpq_quote_line_configurations" ("organization_id", "tenant_id", "parent_line_id");`)
38
+
39
+ // ─── Alter cpq_quote_configurations: add v2 columns ───────────
40
+ this.addSql(`alter table "cpq_quote_configurations" add column "cpq_status" text not null default 'new';`)
41
+ this.addSql(`alter table "cpq_quote_configurations" add column "version" int not null default 1;`)
42
+ this.addSql(`alter table "cpq_quote_configurations" add column "parent_quote_id" uuid null;`)
43
+ this.addSql(`alter table "cpq_quote_configurations" add column "currency_code" text not null default 'USD';`)
44
+ this.addSql(`alter table "cpq_quote_configurations" add column "quote_context" jsonb null;`)
45
+
46
+ // ─── Backfill existing records ────────────────────────────────
47
+ this.addSql(`update "cpq_quote_configurations" set "cpq_status" = 'ready' where "pricing_summary" is not null;`)
48
+
49
+ // ─── Drop v1 columns from cpq_quote_configurations ────────────
50
+ this.addSql(`alter table "cpq_quote_configurations" drop column if exists "quote_type";`)
51
+ this.addSql(`alter table "cpq_quote_configurations" drop column if exists "selected_parent_inventory_item_id";`)
52
+ this.addSql(`alter table "cpq_quote_configurations" drop column if exists "primary_item_configuration";`)
53
+ this.addSql(`alter table "cpq_quote_configurations" drop column if exists "child_item_configurations";`)
54
+ }
55
+
56
+ async down(): Promise<void> {
57
+ // Re-add v1 columns
58
+ this.addSql(`alter table "cpq_quote_configurations" add column "quote_type" text not null default 'new_primary';`)
59
+ this.addSql(`alter table "cpq_quote_configurations" add column "selected_parent_inventory_item_id" uuid null;`)
60
+ this.addSql(`alter table "cpq_quote_configurations" add column "primary_item_configuration" jsonb null;`)
61
+ this.addSql(`alter table "cpq_quote_configurations" add column "child_item_configurations" jsonb null;`)
62
+
63
+ // Drop v2 columns
64
+ this.addSql(`alter table "cpq_quote_configurations" drop column if exists "cpq_status";`)
65
+ this.addSql(`alter table "cpq_quote_configurations" drop column if exists "version";`)
66
+ this.addSql(`alter table "cpq_quote_configurations" drop column if exists "parent_quote_id";`)
67
+ this.addSql(`alter table "cpq_quote_configurations" drop column if exists "currency_code";`)
68
+ this.addSql(`alter table "cpq_quote_configurations" drop column if exists "quote_context";`)
69
+
70
+ // Drop new table
71
+ this.addSql(`drop table if exists "cpq_quote_line_configurations" cascade;`)
72
+ }
73
+ }
@@ -0,0 +1,59 @@
1
+ import { Migration } from '@mikro-orm/migrations'
2
+
3
+ export class Migration20260402000000_cpq_workflows extends Migration {
4
+ async up(): Promise<void> {
5
+ // ─── New table: cpq_workflow_definitions ───────────────────────
6
+ this.addSql(`create table "cpq_workflow_definitions" (
7
+ "id" uuid not null default gen_random_uuid(),
8
+ "organization_id" uuid not null,
9
+ "tenant_id" uuid not null,
10
+ "code" text not null,
11
+ "name" text not null,
12
+ "description" text null,
13
+ "version" int not null default 1,
14
+ "steps" jsonb not null default '[]',
15
+ "applicability" jsonb null,
16
+ "surface" text not null default 'backend',
17
+ "is_active" boolean not null default true,
18
+ "metadata" jsonb null,
19
+ "created_at" timestamptz not null,
20
+ "updated_at" timestamptz not null,
21
+ "deleted_at" timestamptz null,
22
+ constraint "cpq_workflow_definitions_pkey" primary key ("id")
23
+ );`)
24
+
25
+ this.addSql(`alter table "cpq_workflow_definitions" add constraint "cpq_workflow_definitions_code_unique" unique ("organization_id", "tenant_id", "code");`)
26
+ this.addSql(`create index "cpq_workflow_definitions_active_idx" on "cpq_workflow_definitions" ("organization_id", "tenant_id", "is_active");`)
27
+ this.addSql(`create index "cpq_workflow_definitions_surface_idx" on "cpq_workflow_definitions" ("organization_id", "tenant_id", "surface");`)
28
+
29
+ // ─── New table: cpq_workflow_instances ─────────────────────────
30
+ this.addSql(`create table "cpq_workflow_instances" (
31
+ "id" uuid not null default gen_random_uuid(),
32
+ "organization_id" uuid not null,
33
+ "tenant_id" uuid not null,
34
+ "workflow_definition_id" uuid not null,
35
+ "definition_version" int not null,
36
+ "quote_id" uuid null,
37
+ "quote_configuration_id" uuid null,
38
+ "customer_id" uuid null,
39
+ "current_step_id" text not null,
40
+ "completed_steps" jsonb not null default '[]',
41
+ "step_data" jsonb not null default '{}',
42
+ "status" text not null default 'active',
43
+ "started_by" uuid null,
44
+ "created_at" timestamptz not null,
45
+ "updated_at" timestamptz not null,
46
+ constraint "cpq_workflow_instances_pkey" primary key ("id")
47
+ );`)
48
+
49
+ this.addSql(`create index "cpq_workflow_instances_def_idx" on "cpq_workflow_instances" ("organization_id", "tenant_id", "workflow_definition_id");`)
50
+ this.addSql(`create index "cpq_workflow_instances_quote_idx" on "cpq_workflow_instances" ("organization_id", "tenant_id", "quote_id");`)
51
+ this.addSql(`create index "cpq_workflow_instances_user_idx" on "cpq_workflow_instances" ("organization_id", "tenant_id", "started_by", "status");`)
52
+ this.addSql(`create index "cpq_workflow_instances_customer_idx" on "cpq_workflow_instances" ("organization_id", "tenant_id", "customer_id");`)
53
+ }
54
+
55
+ async down(): Promise<void> {
56
+ this.addSql(`drop table if exists "cpq_workflow_instances";`)
57
+ this.addSql(`drop table if exists "cpq_workflow_definitions";`)
58
+ }
59
+ }
@@ -0,0 +1,30 @@
1
+ import { Migration } from '@mikro-orm/migrations'
2
+
3
+ export class Migration20260407000000_cpq_pricing_tables_v2 extends Migration {
4
+ async up(): Promise<void> {
5
+ // CpqPricingTable: add currency_code_list, migrate data from currency_code, drop obsolete columns
6
+ this.addSql(`alter table "cpq_pricing_tables" add column "currency_code_list" jsonb;`)
7
+ this.addSql(`update "cpq_pricing_tables" set "currency_code_list" = jsonb_build_array(coalesce("currency_code", 'USD'));`)
8
+ this.addSql(`alter table "cpq_pricing_tables" alter column "currency_code_list" set not null;`)
9
+ this.addSql(`alter table "cpq_pricing_tables" drop column if exists "currency_code";`)
10
+ this.addSql(`alter table "cpq_pricing_tables" drop column if exists "pricing_model";`)
11
+ this.addSql(`alter table "cpq_pricing_tables" drop column if exists "product_id";`)
12
+ this.addSql(`alter table "cpq_pricing_tables" drop column if exists "description";`)
13
+
14
+ // CpqPricingTableEntry: add currency_code with default for existing rows
15
+ this.addSql(`alter table "cpq_pricing_table_entries" add column "currency_code" text not null default 'USD';`)
16
+ }
17
+
18
+ async down(): Promise<void> {
19
+ // Reverse entry changes
20
+ this.addSql(`alter table "cpq_pricing_table_entries" drop column if exists "currency_code";`)
21
+
22
+ // Reverse table changes: restore old columns, migrate data back
23
+ this.addSql(`alter table "cpq_pricing_tables" add column "description" text null;`)
24
+ this.addSql(`alter table "cpq_pricing_tables" add column "product_id" uuid null;`)
25
+ this.addSql(`alter table "cpq_pricing_tables" add column "pricing_model" text not null default 'flat';`)
26
+ this.addSql(`alter table "cpq_pricing_tables" add column "currency_code" text not null default 'USD';`)
27
+ this.addSql(`update "cpq_pricing_tables" set "currency_code" = coalesce("currency_code_list"->>0, 'USD');`)
28
+ this.addSql(`alter table "cpq_pricing_tables" drop column if exists "currency_code_list";`)
29
+ }
30
+ }
@@ -0,0 +1,36 @@
1
+ import { Migration } from '@mikro-orm/migrations'
2
+
3
+ export class Migration20260407100000_cpq_price_rules extends Migration {
4
+ override async up(): Promise<void> {
5
+ this.addSql(`
6
+ create table "cpq_price_rules" (
7
+ "id" uuid not null default gen_random_uuid(),
8
+ "organization_id" uuid not null,
9
+ "tenant_id" uuid not null,
10
+ "code" text not null,
11
+ "name" text not null,
12
+ "description" text null,
13
+ "product_offering_id" uuid null,
14
+ "rule_type" text not null,
15
+ "value" numeric not null,
16
+ "charge_code_filter" text null,
17
+ "charge_type_filter" text null,
18
+ "applicability_condition" jsonb null,
19
+ "sort_order" integer not null default 0,
20
+ "is_active" boolean not null default true,
21
+ "created_at" timestamptz not null default now(),
22
+ "updated_at" timestamptz not null default now(),
23
+ "deleted_at" timestamptz null,
24
+ constraint "cpq_price_rules_pkey" primary key ("id")
25
+ );
26
+ `)
27
+
28
+ this.addSql(`create index "cpq_price_rules_scope_idx" on "cpq_price_rules" ("organization_id", "tenant_id");`)
29
+ this.addSql(`create unique index "cpq_price_rules_code_unique" on "cpq_price_rules" ("organization_id", "tenant_id", "code");`)
30
+ this.addSql(`create index "cpq_price_rules_product_idx" on "cpq_price_rules" ("organization_id", "tenant_id", "product_offering_id");`)
31
+ }
32
+
33
+ override async down(): Promise<void> {
34
+ this.addSql(`drop table if exists "cpq_price_rules" cascade;`)
35
+ }
36
+ }
@@ -0,0 +1,33 @@
1
+ import { Migration } from '@mikro-orm/migrations'
2
+
3
+ export class Migration20260408000000_cpq_price_rules extends Migration {
4
+ async up(): Promise<void> {
5
+ this.addSql(`create table if not exists "cpq_price_rules" (
6
+ "id" uuid not null default gen_random_uuid(),
7
+ "organization_id" uuid not null,
8
+ "tenant_id" uuid not null,
9
+ "code" text not null,
10
+ "name" text not null,
11
+ "description" text null,
12
+ "product_offering_id" uuid null,
13
+ "rule_type" text not null,
14
+ "value" numeric not null,
15
+ "charge_code_filter" text null,
16
+ "charge_type_filter" text null,
17
+ "applicability_condition" jsonb null,
18
+ "sort_order" int not null default 0,
19
+ "is_active" boolean not null default true,
20
+ "created_at" timestamptz not null,
21
+ "updated_at" timestamptz not null,
22
+ "deleted_at" timestamptz null,
23
+ constraint "cpq_price_rules_pkey" primary key ("id")
24
+ );`)
25
+ this.addSql(`create index if not exists "cpq_price_rules_scope_idx" on "cpq_price_rules" ("organization_id", "tenant_id");`)
26
+ this.addSql(`create unique index if not exists "cpq_price_rules_code_unique" on "cpq_price_rules" ("organization_id", "tenant_id", "code");`)
27
+ this.addSql(`create index if not exists "cpq_price_rules_product_idx" on "cpq_price_rules" ("organization_id", "tenant_id", "product_offering_id");`)
28
+ }
29
+
30
+ async down(): Promise<void> {
31
+ this.addSql(`drop table if exists "cpq_price_rules" cascade;`)
32
+ }
33
+ }
@@ -0,0 +1,22 @@
1
+ import { Migration } from '@mikro-orm/migrations'
2
+
3
+ export class Migration20260410000000_cpq_drop_datacentres_inventory extends Migration {
4
+ async up(): Promise<void> {
5
+ this.addSql(`drop table if exists "cpq_inventory_items" cascade;`)
6
+ this.addSql(`drop table if exists "cpq_data_centres" cascade;`)
7
+ }
8
+
9
+ async down(): Promise<void> {
10
+ // cpq_data_centres
11
+ this.addSql(`create table "cpq_data_centres" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "code" text not null, "name" text not null, "city" text null, "country" text null, "address" text null, "capabilities" jsonb null, "is_active" boolean not null default true, "metadata" jsonb null, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, constraint "cpq_data_centres_pkey" primary key ("id"));`)
12
+ this.addSql(`create index "cpq_data_centres_scope_idx" on "cpq_data_centres" ("organization_id", "tenant_id");`)
13
+ this.addSql(`alter table "cpq_data_centres" add constraint "cpq_data_centres_code_unique" unique ("organization_id", "tenant_id", "code");`)
14
+
15
+ // cpq_inventory_items
16
+ this.addSql(`create table "cpq_inventory_items" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "customer_id" uuid not null, "product_id" uuid not null, "parent_inventory_item_id" uuid null, "status" text not null default 'pending', "configuration" jsonb not null, "charges" jsonb null, "data_centre_id" uuid null, "currency_code" text not null default 'USD', "activated_at" timestamptz null, "terminated_at" timestamptz null, "source_quote_id" uuid null, "source_order_id" uuid null, "metadata" jsonb null, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, constraint "cpq_inventory_items_pkey" primary key ("id"));`)
17
+ this.addSql(`create index "cpq_inventory_items_customer_idx" on "cpq_inventory_items" ("organization_id", "tenant_id", "customer_id");`)
18
+ this.addSql(`create index "cpq_inventory_items_parent_idx" on "cpq_inventory_items" ("organization_id", "tenant_id", "parent_inventory_item_id");`)
19
+ this.addSql(`create index "cpq_inventory_items_status_idx" on "cpq_inventory_items" ("customer_id", "status");`)
20
+ this.addSql(`create index "cpq_inventory_items_config_gin_idx" on "cpq_inventory_items" using gin ("configuration");`)
21
+ }
22
+ }
@@ -0,0 +1,56 @@
1
+ import { Migration } from '@mikro-orm/migrations'
2
+
3
+ export class Migration20260410000000_cpq_wizard_rename extends Migration {
4
+ async up(): Promise<void> {
5
+ // ─── Drop workflow instances table (no longer persisted) ───────
6
+ this.addSql(`drop table if exists "cpq_workflow_instances";`)
7
+
8
+ // ─── Rename cpq_workflow_definitions → cpq_wizard_definitions ──
9
+ this.addSql(`alter table "cpq_workflow_definitions" rename to "cpq_wizard_definitions";`)
10
+
11
+ // ─── Rename constraints and indexes ───────────────────────────
12
+ this.addSql(`alter table "cpq_wizard_definitions" rename constraint "cpq_workflow_definitions_pkey" to "cpq_wizard_definitions_pkey";`)
13
+ this.addSql(`alter table "cpq_wizard_definitions" rename constraint "cpq_workflow_definitions_code_unique" to "cpq_wizard_definitions_code_unique";`)
14
+ this.addSql(`alter index "cpq_workflow_definitions_active_idx" rename to "cpq_wizard_definitions_active_idx";`)
15
+ this.addSql(`alter index "cpq_workflow_definitions_surface_idx" rename to "cpq_wizard_definitions_surface_idx";`)
16
+
17
+ // ─── Add params_schema column ─────────────────────────────────
18
+ this.addSql(`alter table "cpq_wizard_definitions" add column "params_schema" jsonb null;`)
19
+ }
20
+
21
+ async down(): Promise<void> {
22
+ // ─── Remove params_schema column ──────────────────────────────
23
+ this.addSql(`alter table "cpq_wizard_definitions" drop column if exists "params_schema";`)
24
+
25
+ // ─── Rename back ──────────────────────────────────────────────
26
+ this.addSql(`alter index "cpq_wizard_definitions_active_idx" rename to "cpq_workflow_definitions_active_idx";`)
27
+ this.addSql(`alter index "cpq_wizard_definitions_surface_idx" rename to "cpq_workflow_definitions_surface_idx";`)
28
+ this.addSql(`alter table "cpq_wizard_definitions" rename constraint "cpq_wizard_definitions_code_unique" to "cpq_workflow_definitions_code_unique";`)
29
+ this.addSql(`alter table "cpq_wizard_definitions" rename constraint "cpq_wizard_definitions_pkey" to "cpq_workflow_definitions_pkey";`)
30
+ this.addSql(`alter table "cpq_wizard_definitions" rename to "cpq_workflow_definitions";`)
31
+
32
+ // ─── Recreate workflow instances table ─────────────────────────
33
+ this.addSql(`create table "cpq_workflow_instances" (
34
+ "id" uuid not null default gen_random_uuid(),
35
+ "organization_id" uuid not null,
36
+ "tenant_id" uuid not null,
37
+ "workflow_definition_id" uuid not null,
38
+ "definition_version" int not null,
39
+ "quote_id" uuid null,
40
+ "quote_configuration_id" uuid null,
41
+ "customer_id" uuid null,
42
+ "current_step_id" text not null,
43
+ "completed_steps" jsonb not null default '[]',
44
+ "step_data" jsonb not null default '{}',
45
+ "status" text not null default 'active',
46
+ "started_by" uuid null,
47
+ "created_at" timestamptz not null,
48
+ "updated_at" timestamptz not null,
49
+ constraint "cpq_workflow_instances_pkey" primary key ("id")
50
+ );`)
51
+ this.addSql(`create index "cpq_workflow_instances_def_idx" on "cpq_workflow_instances" ("organization_id", "tenant_id", "workflow_definition_id");`)
52
+ this.addSql(`create index "cpq_workflow_instances_quote_idx" on "cpq_workflow_instances" ("organization_id", "tenant_id", "quote_id");`)
53
+ this.addSql(`create index "cpq_workflow_instances_user_idx" on "cpq_workflow_instances" ("organization_id", "tenant_id", "started_by", "status");`)
54
+ this.addSql(`create index "cpq_workflow_instances_customer_idx" on "cpq_workflow_instances" ("organization_id", "tenant_id", "customer_id");`)
55
+ }
56
+ }
@@ -0,0 +1,118 @@
1
+ import { Migration } from '@mikro-orm/migrations'
2
+
3
+ export class Migration20260410100000_cpq_inventory extends Migration {
4
+ async up(): Promise<void> {
5
+ this.addSql(`create table if not exists "cpq_inventory_subscriptions" (
6
+ "id" uuid not null default gen_random_uuid(),
7
+ "organization_id" uuid not null,
8
+ "tenant_id" uuid not null,
9
+ "customer_id" uuid not null,
10
+ "code" text not null,
11
+ "name" text not null,
12
+ "description" text null,
13
+ "status" text not null default 'pending',
14
+ "billing_cycle" text not null default 'monthly',
15
+ "currency_code" text not null default 'USD',
16
+ "mrc_amount" numeric(18, 4) not null default 0,
17
+ "nrc_amount" numeric(18, 4) not null default 0,
18
+ "start_date" date null,
19
+ "current_term_end" date null,
20
+ "term_months" int null,
21
+ "auto_renew" boolean not null default true,
22
+ "activated_at" timestamptz null,
23
+ "suspended_at" timestamptz null,
24
+ "terminated_at" timestamptz null,
25
+ "pricing_summary" jsonb null,
26
+ "source_quote_id" uuid null,
27
+ "source_order_id" uuid null,
28
+ "metadata" jsonb null,
29
+ "created_at" timestamptz not null,
30
+ "updated_at" timestamptz not null,
31
+ "deleted_at" timestamptz null,
32
+ constraint "cpq_inventory_subscriptions_pkey" primary key ("id")
33
+ );`)
34
+ this.addSql(`create index if not exists "cpq_inventory_subscriptions_scope_idx" on "cpq_inventory_subscriptions" ("organization_id", "tenant_id");`)
35
+ this.addSql(`create unique index if not exists "cpq_inventory_subscriptions_code_unique" on "cpq_inventory_subscriptions" ("organization_id", "tenant_id", "code");`)
36
+ this.addSql(`create index if not exists "cpq_inventory_subscriptions_customer_idx" on "cpq_inventory_subscriptions" ("organization_id", "tenant_id", "customer_id");`)
37
+ this.addSql(`create index if not exists "cpq_inventory_subscriptions_status_idx" on "cpq_inventory_subscriptions" ("organization_id", "tenant_id", "status");`)
38
+ this.addSql(`create index if not exists "cpq_inventory_subscriptions_source_quote_idx" on "cpq_inventory_subscriptions" ("organization_id", "tenant_id", "source_quote_id");`)
39
+
40
+ this.addSql(`create table if not exists "cpq_inventory_subscription_items" (
41
+ "id" uuid not null default gen_random_uuid(),
42
+ "organization_id" uuid not null,
43
+ "tenant_id" uuid not null,
44
+ "subscription_id" uuid not null,
45
+ "customer_id" uuid not null,
46
+ "parent_item_id" uuid null,
47
+ "product_id" uuid null,
48
+ "offering_id" uuid null,
49
+ "spec_id" uuid null,
50
+ "name" text not null,
51
+ "status" text not null default 'pending',
52
+ "configuration" jsonb not null default '{}',
53
+ "charges" jsonb null,
54
+ "mrc_amount" numeric(18, 4) not null default 0,
55
+ "nrc_amount" numeric(18, 4) not null default 0,
56
+ "currency_code" text not null default 'USD',
57
+ "quantity" int not null default 1,
58
+ "capacity_total" numeric(18, 4) null,
59
+ "capacity_used" numeric(18, 4) null,
60
+ "capacity_unit" text null,
61
+ "source_quote_line_id" uuid null,
62
+ "metadata" jsonb null,
63
+ "sort_order" int not null default 0,
64
+ "created_at" timestamptz not null,
65
+ "updated_at" timestamptz not null,
66
+ "deleted_at" timestamptz null,
67
+ constraint "cpq_inventory_subscription_items_pkey" primary key ("id")
68
+ );`)
69
+ this.addSql(`create index if not exists "cpq_inventory_subscription_items_scope_idx" on "cpq_inventory_subscription_items" ("organization_id", "tenant_id", "subscription_id");`)
70
+ this.addSql(`create index if not exists "cpq_inventory_subscription_items_customer_idx" on "cpq_inventory_subscription_items" ("organization_id", "tenant_id", "customer_id");`)
71
+ this.addSql(`create index if not exists "cpq_inventory_subscription_items_parent_idx" on "cpq_inventory_subscription_items" ("organization_id", "tenant_id", "parent_item_id");`)
72
+ this.addSql(`create index if not exists "cpq_inventory_subscription_items_status_idx" on "cpq_inventory_subscription_items" ("organization_id", "tenant_id", "status");`)
73
+
74
+ this.addSql(`create table if not exists "cpq_inventory_assets" (
75
+ "id" uuid not null default gen_random_uuid(),
76
+ "organization_id" uuid not null,
77
+ "tenant_id" uuid not null,
78
+ "customer_id" uuid not null,
79
+ "subscription_id" uuid null,
80
+ "subscription_item_id" uuid null,
81
+ "product_id" uuid null,
82
+ "offering_id" uuid null,
83
+ "spec_id" uuid null,
84
+ "code" text not null,
85
+ "name" text not null,
86
+ "description" text null,
87
+ "status" text not null default 'pending',
88
+ "asset_type" text not null default 'one_time',
89
+ "currency_code" text not null default 'USD',
90
+ "purchase_price" numeric(18, 4) not null default 0,
91
+ "quantity" int not null default 1,
92
+ "purchase_date" date null,
93
+ "delivery_date" date null,
94
+ "configuration" jsonb not null default '{}',
95
+ "charges" jsonb null,
96
+ "source_quote_id" uuid null,
97
+ "source_order_id" uuid null,
98
+ "source_quote_line_id" uuid null,
99
+ "metadata" jsonb null,
100
+ "created_at" timestamptz not null,
101
+ "updated_at" timestamptz not null,
102
+ "deleted_at" timestamptz null,
103
+ constraint "cpq_inventory_assets_pkey" primary key ("id")
104
+ );`)
105
+ this.addSql(`create index if not exists "cpq_inventory_assets_scope_idx" on "cpq_inventory_assets" ("organization_id", "tenant_id");`)
106
+ this.addSql(`create unique index if not exists "cpq_inventory_assets_code_unique" on "cpq_inventory_assets" ("organization_id", "tenant_id", "code");`)
107
+ this.addSql(`create index if not exists "cpq_inventory_assets_customer_idx" on "cpq_inventory_assets" ("organization_id", "tenant_id", "customer_id");`)
108
+ this.addSql(`create index if not exists "cpq_inventory_assets_status_idx" on "cpq_inventory_assets" ("organization_id", "tenant_id", "status");`)
109
+ this.addSql(`create index if not exists "cpq_inventory_assets_subscription_idx" on "cpq_inventory_assets" ("organization_id", "tenant_id", "subscription_id");`)
110
+ this.addSql(`create index if not exists "cpq_inventory_assets_item_idx" on "cpq_inventory_assets" ("organization_id", "tenant_id", "subscription_item_id");`)
111
+ }
112
+
113
+ async down(): Promise<void> {
114
+ this.addSql(`drop table if exists "cpq_inventory_assets" cascade;`)
115
+ this.addSql(`drop table if exists "cpq_inventory_subscription_items" cascade;`)
116
+ this.addSql(`drop table if exists "cpq_inventory_subscriptions" cascade;`)
117
+ }
118
+ }