@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,118 @@
1
+ import { Migration } from "@mikro-orm/migrations";
2
+ class Migration20260410100000_cpq_inventory extends Migration {
3
+ async up() {
4
+ this.addSql(`create table if not exists "cpq_inventory_subscriptions" (
5
+ "id" uuid not null default gen_random_uuid(),
6
+ "organization_id" uuid not null,
7
+ "tenant_id" uuid not null,
8
+ "customer_id" uuid not null,
9
+ "code" text not null,
10
+ "name" text not null,
11
+ "description" text null,
12
+ "status" text not null default 'pending',
13
+ "billing_cycle" text not null default 'monthly',
14
+ "currency_code" text not null default 'USD',
15
+ "mrc_amount" numeric(18, 4) not null default 0,
16
+ "nrc_amount" numeric(18, 4) not null default 0,
17
+ "start_date" date null,
18
+ "current_term_end" date null,
19
+ "term_months" int null,
20
+ "auto_renew" boolean not null default true,
21
+ "activated_at" timestamptz null,
22
+ "suspended_at" timestamptz null,
23
+ "terminated_at" timestamptz null,
24
+ "pricing_summary" jsonb null,
25
+ "source_quote_id" uuid null,
26
+ "source_order_id" uuid null,
27
+ "metadata" jsonb null,
28
+ "created_at" timestamptz not null,
29
+ "updated_at" timestamptz not null,
30
+ "deleted_at" timestamptz null,
31
+ constraint "cpq_inventory_subscriptions_pkey" primary key ("id")
32
+ );`);
33
+ this.addSql(`create index if not exists "cpq_inventory_subscriptions_scope_idx" on "cpq_inventory_subscriptions" ("organization_id", "tenant_id");`);
34
+ this.addSql(`create unique index if not exists "cpq_inventory_subscriptions_code_unique" on "cpq_inventory_subscriptions" ("organization_id", "tenant_id", "code");`);
35
+ this.addSql(`create index if not exists "cpq_inventory_subscriptions_customer_idx" on "cpq_inventory_subscriptions" ("organization_id", "tenant_id", "customer_id");`);
36
+ this.addSql(`create index if not exists "cpq_inventory_subscriptions_status_idx" on "cpq_inventory_subscriptions" ("organization_id", "tenant_id", "status");`);
37
+ this.addSql(`create index if not exists "cpq_inventory_subscriptions_source_quote_idx" on "cpq_inventory_subscriptions" ("organization_id", "tenant_id", "source_quote_id");`);
38
+ this.addSql(`create table if not exists "cpq_inventory_subscription_items" (
39
+ "id" uuid not null default gen_random_uuid(),
40
+ "organization_id" uuid not null,
41
+ "tenant_id" uuid not null,
42
+ "subscription_id" uuid not null,
43
+ "customer_id" uuid not null,
44
+ "parent_item_id" uuid null,
45
+ "product_id" uuid null,
46
+ "offering_id" uuid null,
47
+ "spec_id" uuid null,
48
+ "name" text not null,
49
+ "status" text not null default 'pending',
50
+ "configuration" jsonb not null default '{}',
51
+ "charges" jsonb null,
52
+ "mrc_amount" numeric(18, 4) not null default 0,
53
+ "nrc_amount" numeric(18, 4) not null default 0,
54
+ "currency_code" text not null default 'USD',
55
+ "quantity" int not null default 1,
56
+ "capacity_total" numeric(18, 4) null,
57
+ "capacity_used" numeric(18, 4) null,
58
+ "capacity_unit" text null,
59
+ "source_quote_line_id" uuid null,
60
+ "metadata" jsonb null,
61
+ "sort_order" int not null default 0,
62
+ "created_at" timestamptz not null,
63
+ "updated_at" timestamptz not null,
64
+ "deleted_at" timestamptz null,
65
+ constraint "cpq_inventory_subscription_items_pkey" primary key ("id")
66
+ );`);
67
+ this.addSql(`create index if not exists "cpq_inventory_subscription_items_scope_idx" on "cpq_inventory_subscription_items" ("organization_id", "tenant_id", "subscription_id");`);
68
+ this.addSql(`create index if not exists "cpq_inventory_subscription_items_customer_idx" on "cpq_inventory_subscription_items" ("organization_id", "tenant_id", "customer_id");`);
69
+ 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");`);
70
+ this.addSql(`create index if not exists "cpq_inventory_subscription_items_status_idx" on "cpq_inventory_subscription_items" ("organization_id", "tenant_id", "status");`);
71
+ this.addSql(`create table if not exists "cpq_inventory_assets" (
72
+ "id" uuid not null default gen_random_uuid(),
73
+ "organization_id" uuid not null,
74
+ "tenant_id" uuid not null,
75
+ "customer_id" uuid not null,
76
+ "subscription_id" uuid null,
77
+ "subscription_item_id" uuid null,
78
+ "product_id" uuid null,
79
+ "offering_id" uuid null,
80
+ "spec_id" uuid null,
81
+ "code" text not null,
82
+ "name" text not null,
83
+ "description" text null,
84
+ "status" text not null default 'pending',
85
+ "asset_type" text not null default 'one_time',
86
+ "currency_code" text not null default 'USD',
87
+ "purchase_price" numeric(18, 4) not null default 0,
88
+ "quantity" int not null default 1,
89
+ "purchase_date" date null,
90
+ "delivery_date" date null,
91
+ "configuration" jsonb not null default '{}',
92
+ "charges" jsonb null,
93
+ "source_quote_id" uuid null,
94
+ "source_order_id" uuid null,
95
+ "source_quote_line_id" uuid null,
96
+ "metadata" jsonb null,
97
+ "created_at" timestamptz not null,
98
+ "updated_at" timestamptz not null,
99
+ "deleted_at" timestamptz null,
100
+ constraint "cpq_inventory_assets_pkey" primary key ("id")
101
+ );`);
102
+ this.addSql(`create index if not exists "cpq_inventory_assets_scope_idx" on "cpq_inventory_assets" ("organization_id", "tenant_id");`);
103
+ this.addSql(`create unique index if not exists "cpq_inventory_assets_code_unique" on "cpq_inventory_assets" ("organization_id", "tenant_id", "code");`);
104
+ this.addSql(`create index if not exists "cpq_inventory_assets_customer_idx" on "cpq_inventory_assets" ("organization_id", "tenant_id", "customer_id");`);
105
+ this.addSql(`create index if not exists "cpq_inventory_assets_status_idx" on "cpq_inventory_assets" ("organization_id", "tenant_id", "status");`);
106
+ this.addSql(`create index if not exists "cpq_inventory_assets_subscription_idx" on "cpq_inventory_assets" ("organization_id", "tenant_id", "subscription_id");`);
107
+ this.addSql(`create index if not exists "cpq_inventory_assets_item_idx" on "cpq_inventory_assets" ("organization_id", "tenant_id", "subscription_item_id");`);
108
+ }
109
+ async down() {
110
+ this.addSql(`drop table if exists "cpq_inventory_assets" cascade;`);
111
+ this.addSql(`drop table if exists "cpq_inventory_subscription_items" cascade;`);
112
+ this.addSql(`drop table if exists "cpq_inventory_subscriptions" cascade;`);
113
+ }
114
+ }
115
+ export {
116
+ Migration20260410100000_cpq_inventory
117
+ };
118
+ //# sourceMappingURL=Migration20260410100000_cpq_inventory.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/cpq/migrations/Migration20260410100000_cpq_inventory.ts"],
4
+ "sourcesContent": ["import { Migration } from '@mikro-orm/migrations'\n\nexport class Migration20260410100000_cpq_inventory extends Migration {\n async up(): Promise<void> {\n this.addSql(`create table if not exists \"cpq_inventory_subscriptions\" (\n \"id\" uuid not null default gen_random_uuid(),\n \"organization_id\" uuid not null,\n \"tenant_id\" uuid not null,\n \"customer_id\" uuid not null,\n \"code\" text not null,\n \"name\" text not null,\n \"description\" text null,\n \"status\" text not null default 'pending',\n \"billing_cycle\" text not null default 'monthly',\n \"currency_code\" text not null default 'USD',\n \"mrc_amount\" numeric(18, 4) not null default 0,\n \"nrc_amount\" numeric(18, 4) not null default 0,\n \"start_date\" date null,\n \"current_term_end\" date null,\n \"term_months\" int null,\n \"auto_renew\" boolean not null default true,\n \"activated_at\" timestamptz null,\n \"suspended_at\" timestamptz null,\n \"terminated_at\" timestamptz null,\n \"pricing_summary\" jsonb null,\n \"source_quote_id\" uuid null,\n \"source_order_id\" uuid null,\n \"metadata\" jsonb null,\n \"created_at\" timestamptz not null,\n \"updated_at\" timestamptz not null,\n \"deleted_at\" timestamptz null,\n constraint \"cpq_inventory_subscriptions_pkey\" primary key (\"id\")\n );`)\n this.addSql(`create index if not exists \"cpq_inventory_subscriptions_scope_idx\" on \"cpq_inventory_subscriptions\" (\"organization_id\", \"tenant_id\");`)\n this.addSql(`create unique index if not exists \"cpq_inventory_subscriptions_code_unique\" on \"cpq_inventory_subscriptions\" (\"organization_id\", \"tenant_id\", \"code\");`)\n this.addSql(`create index if not exists \"cpq_inventory_subscriptions_customer_idx\" on \"cpq_inventory_subscriptions\" (\"organization_id\", \"tenant_id\", \"customer_id\");`)\n this.addSql(`create index if not exists \"cpq_inventory_subscriptions_status_idx\" on \"cpq_inventory_subscriptions\" (\"organization_id\", \"tenant_id\", \"status\");`)\n this.addSql(`create index if not exists \"cpq_inventory_subscriptions_source_quote_idx\" on \"cpq_inventory_subscriptions\" (\"organization_id\", \"tenant_id\", \"source_quote_id\");`)\n\n this.addSql(`create table if not exists \"cpq_inventory_subscription_items\" (\n \"id\" uuid not null default gen_random_uuid(),\n \"organization_id\" uuid not null,\n \"tenant_id\" uuid not null,\n \"subscription_id\" uuid not null,\n \"customer_id\" uuid not null,\n \"parent_item_id\" uuid null,\n \"product_id\" uuid null,\n \"offering_id\" uuid null,\n \"spec_id\" uuid null,\n \"name\" text not null,\n \"status\" text not null default 'pending',\n \"configuration\" jsonb not null default '{}',\n \"charges\" jsonb null,\n \"mrc_amount\" numeric(18, 4) not null default 0,\n \"nrc_amount\" numeric(18, 4) not null default 0,\n \"currency_code\" text not null default 'USD',\n \"quantity\" int not null default 1,\n \"capacity_total\" numeric(18, 4) null,\n \"capacity_used\" numeric(18, 4) null,\n \"capacity_unit\" text null,\n \"source_quote_line_id\" uuid null,\n \"metadata\" jsonb null,\n \"sort_order\" int not null default 0,\n \"created_at\" timestamptz not null,\n \"updated_at\" timestamptz not null,\n \"deleted_at\" timestamptz null,\n constraint \"cpq_inventory_subscription_items_pkey\" primary key (\"id\")\n );`)\n this.addSql(`create index if not exists \"cpq_inventory_subscription_items_scope_idx\" on \"cpq_inventory_subscription_items\" (\"organization_id\", \"tenant_id\", \"subscription_id\");`)\n this.addSql(`create index if not exists \"cpq_inventory_subscription_items_customer_idx\" on \"cpq_inventory_subscription_items\" (\"organization_id\", \"tenant_id\", \"customer_id\");`)\n 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\");`)\n this.addSql(`create index if not exists \"cpq_inventory_subscription_items_status_idx\" on \"cpq_inventory_subscription_items\" (\"organization_id\", \"tenant_id\", \"status\");`)\n\n this.addSql(`create table if not exists \"cpq_inventory_assets\" (\n \"id\" uuid not null default gen_random_uuid(),\n \"organization_id\" uuid not null,\n \"tenant_id\" uuid not null,\n \"customer_id\" uuid not null,\n \"subscription_id\" uuid null,\n \"subscription_item_id\" uuid null,\n \"product_id\" uuid null,\n \"offering_id\" uuid null,\n \"spec_id\" uuid null,\n \"code\" text not null,\n \"name\" text not null,\n \"description\" text null,\n \"status\" text not null default 'pending',\n \"asset_type\" text not null default 'one_time',\n \"currency_code\" text not null default 'USD',\n \"purchase_price\" numeric(18, 4) not null default 0,\n \"quantity\" int not null default 1,\n \"purchase_date\" date null,\n \"delivery_date\" date null,\n \"configuration\" jsonb not null default '{}',\n \"charges\" jsonb null,\n \"source_quote_id\" uuid null,\n \"source_order_id\" uuid null,\n \"source_quote_line_id\" uuid null,\n \"metadata\" jsonb null,\n \"created_at\" timestamptz not null,\n \"updated_at\" timestamptz not null,\n \"deleted_at\" timestamptz null,\n constraint \"cpq_inventory_assets_pkey\" primary key (\"id\")\n );`)\n this.addSql(`create index if not exists \"cpq_inventory_assets_scope_idx\" on \"cpq_inventory_assets\" (\"organization_id\", \"tenant_id\");`)\n this.addSql(`create unique index if not exists \"cpq_inventory_assets_code_unique\" on \"cpq_inventory_assets\" (\"organization_id\", \"tenant_id\", \"code\");`)\n this.addSql(`create index if not exists \"cpq_inventory_assets_customer_idx\" on \"cpq_inventory_assets\" (\"organization_id\", \"tenant_id\", \"customer_id\");`)\n this.addSql(`create index if not exists \"cpq_inventory_assets_status_idx\" on \"cpq_inventory_assets\" (\"organization_id\", \"tenant_id\", \"status\");`)\n this.addSql(`create index if not exists \"cpq_inventory_assets_subscription_idx\" on \"cpq_inventory_assets\" (\"organization_id\", \"tenant_id\", \"subscription_id\");`)\n this.addSql(`create index if not exists \"cpq_inventory_assets_item_idx\" on \"cpq_inventory_assets\" (\"organization_id\", \"tenant_id\", \"subscription_item_id\");`)\n }\n\n async down(): Promise<void> {\n this.addSql(`drop table if exists \"cpq_inventory_assets\" cascade;`)\n this.addSql(`drop table if exists \"cpq_inventory_subscription_items\" cascade;`)\n this.addSql(`drop table if exists \"cpq_inventory_subscriptions\" cascade;`)\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAEnB,MAAM,8CAA8C,UAAU;AAAA,EACnE,MAAM,KAAoB;AACxB,SAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OA4BT;AACH,SAAK,OAAO,uIAAuI;AACnJ,SAAK,OAAO,wJAAwJ;AACpK,SAAK,OAAO,yJAAyJ;AACrK,SAAK,OAAO,kJAAkJ;AAC9J,SAAK,OAAO,iKAAiK;AAE7K,SAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OA4BT;AACH,SAAK,OAAO,oKAAoK;AAChL,SAAK,OAAO,mKAAmK;AAC/K,SAAK,OAAO,oKAAoK;AAChL,SAAK,OAAO,4JAA4J;AAExK,SAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OA8BT;AACH,SAAK,OAAO,yHAAyH;AACrI,SAAK,OAAO,0IAA0I;AACtJ,SAAK,OAAO,2IAA2I;AACvJ,SAAK,OAAO,oIAAoI;AAChJ,SAAK,OAAO,mJAAmJ;AAC/J,SAAK,OAAO,gJAAgJ;AAAA,EAC9J;AAAA,EAEA,MAAM,OAAsB;AAC1B,SAAK,OAAO,sDAAsD;AAClE,SAAK,OAAO,kEAAkE;AAC9E,SAAK,OAAO,6DAA6D;AAAA,EAC3E;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,63 @@
1
+ import { Migration } from "@mikro-orm/migrations";
2
+ class Migration20260411000000_cpq_orders extends Migration {
3
+ async up() {
4
+ this.addSql(`create table if not exists "cpq_order_configurations" (
5
+ "id" uuid not null default gen_random_uuid(),
6
+ "organization_id" uuid not null,
7
+ "tenant_id" uuid not null,
8
+ "order_id" uuid not null,
9
+ "source_quote_id" uuid null,
10
+ "customer_id" uuid not null,
11
+ "cpq_status" text not null default 'draft',
12
+ "currency_code" text not null default 'USD',
13
+ "pricing_summary" jsonb null,
14
+ "metadata" jsonb null,
15
+ "activated_at" timestamptz null,
16
+ "created_at" timestamptz not null,
17
+ "updated_at" timestamptz not null,
18
+ "deleted_at" timestamptz null,
19
+ constraint "cpq_order_configurations_pkey" primary key ("id")
20
+ );`);
21
+ this.addSql(`create unique index if not exists "cpq_order_configurations_order_unique" on "cpq_order_configurations" ("organization_id", "tenant_id", "order_id");`);
22
+ this.addSql(`create index if not exists "cpq_order_configurations_scope_idx" on "cpq_order_configurations" ("organization_id", "tenant_id");`);
23
+ this.addSql(`create index if not exists "cpq_order_configurations_customer_idx" on "cpq_order_configurations" ("organization_id", "tenant_id", "customer_id");`);
24
+ this.addSql(`create index if not exists "cpq_order_configurations_source_quote_idx" on "cpq_order_configurations" ("organization_id", "tenant_id", "source_quote_id");`);
25
+ this.addSql(`create index if not exists "cpq_order_configurations_status_idx" on "cpq_order_configurations" ("organization_id", "tenant_id", "cpq_status");`);
26
+ this.addSql(`create table if not exists "cpq_order_line_configurations" (
27
+ "id" uuid not null default gen_random_uuid(),
28
+ "organization_id" uuid not null,
29
+ "tenant_id" uuid not null,
30
+ "order_line_id" uuid not null,
31
+ "order_configuration_id" uuid not null,
32
+ "offering_id" uuid null,
33
+ "product_id" uuid null,
34
+ "spec_id" uuid null,
35
+ "action" text not null default 'add',
36
+ "parent_line_id" uuid null,
37
+ "start_date" date null,
38
+ "term_months" int null,
39
+ "end_date" date null,
40
+ "configuration" jsonb not null default '{}',
41
+ "quantity" int not null default 1,
42
+ "charges" jsonb null,
43
+ "nrc_total" numeric(18, 4) not null default 0,
44
+ "mrc_total" numeric(18, 4) not null default 0,
45
+ "source_quote_line_id" uuid null,
46
+ "created_at" timestamptz not null,
47
+ "updated_at" timestamptz not null,
48
+ "deleted_at" timestamptz null,
49
+ constraint "cpq_order_line_configurations_pkey" primary key ("id")
50
+ );`);
51
+ this.addSql(`create unique index if not exists "cpq_olc_order_line_unique" on "cpq_order_line_configurations" ("organization_id", "tenant_id", "order_line_id");`);
52
+ this.addSql(`create index if not exists "cpq_olc_order_config_idx" on "cpq_order_line_configurations" ("organization_id", "tenant_id", "order_configuration_id");`);
53
+ this.addSql(`create index if not exists "cpq_olc_parent_line_idx" on "cpq_order_line_configurations" ("organization_id", "tenant_id", "parent_line_id");`);
54
+ }
55
+ async down() {
56
+ this.addSql(`drop table if exists "cpq_order_line_configurations" cascade;`);
57
+ this.addSql(`drop table if exists "cpq_order_configurations" cascade;`);
58
+ }
59
+ }
60
+ export {
61
+ Migration20260411000000_cpq_orders
62
+ };
63
+ //# sourceMappingURL=Migration20260411000000_cpq_orders.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/cpq/migrations/Migration20260411000000_cpq_orders.ts"],
4
+ "sourcesContent": ["import { Migration } from '@mikro-orm/migrations'\n\nexport class Migration20260411000000_cpq_orders extends Migration {\n async up(): Promise<void> {\n this.addSql(`create table if not exists \"cpq_order_configurations\" (\n \"id\" uuid not null default gen_random_uuid(),\n \"organization_id\" uuid not null,\n \"tenant_id\" uuid not null,\n \"order_id\" uuid not null,\n \"source_quote_id\" uuid null,\n \"customer_id\" uuid not null,\n \"cpq_status\" text not null default 'draft',\n \"currency_code\" text not null default 'USD',\n \"pricing_summary\" jsonb null,\n \"metadata\" jsonb null,\n \"activated_at\" timestamptz null,\n \"created_at\" timestamptz not null,\n \"updated_at\" timestamptz not null,\n \"deleted_at\" timestamptz null,\n constraint \"cpq_order_configurations_pkey\" primary key (\"id\")\n );`)\n this.addSql(`create unique index if not exists \"cpq_order_configurations_order_unique\" on \"cpq_order_configurations\" (\"organization_id\", \"tenant_id\", \"order_id\");`)\n this.addSql(`create index if not exists \"cpq_order_configurations_scope_idx\" on \"cpq_order_configurations\" (\"organization_id\", \"tenant_id\");`)\n this.addSql(`create index if not exists \"cpq_order_configurations_customer_idx\" on \"cpq_order_configurations\" (\"organization_id\", \"tenant_id\", \"customer_id\");`)\n this.addSql(`create index if not exists \"cpq_order_configurations_source_quote_idx\" on \"cpq_order_configurations\" (\"organization_id\", \"tenant_id\", \"source_quote_id\");`)\n this.addSql(`create index if not exists \"cpq_order_configurations_status_idx\" on \"cpq_order_configurations\" (\"organization_id\", \"tenant_id\", \"cpq_status\");`)\n\n this.addSql(`create table if not exists \"cpq_order_line_configurations\" (\n \"id\" uuid not null default gen_random_uuid(),\n \"organization_id\" uuid not null,\n \"tenant_id\" uuid not null,\n \"order_line_id\" uuid not null,\n \"order_configuration_id\" uuid not null,\n \"offering_id\" uuid null,\n \"product_id\" uuid null,\n \"spec_id\" uuid null,\n \"action\" text not null default 'add',\n \"parent_line_id\" uuid null,\n \"start_date\" date null,\n \"term_months\" int null,\n \"end_date\" date null,\n \"configuration\" jsonb not null default '{}',\n \"quantity\" int not null default 1,\n \"charges\" jsonb null,\n \"nrc_total\" numeric(18, 4) not null default 0,\n \"mrc_total\" numeric(18, 4) not null default 0,\n \"source_quote_line_id\" uuid null,\n \"created_at\" timestamptz not null,\n \"updated_at\" timestamptz not null,\n \"deleted_at\" timestamptz null,\n constraint \"cpq_order_line_configurations_pkey\" primary key (\"id\")\n );`)\n this.addSql(`create unique index if not exists \"cpq_olc_order_line_unique\" on \"cpq_order_line_configurations\" (\"organization_id\", \"tenant_id\", \"order_line_id\");`)\n this.addSql(`create index if not exists \"cpq_olc_order_config_idx\" on \"cpq_order_line_configurations\" (\"organization_id\", \"tenant_id\", \"order_configuration_id\");`)\n this.addSql(`create index if not exists \"cpq_olc_parent_line_idx\" on \"cpq_order_line_configurations\" (\"organization_id\", \"tenant_id\", \"parent_line_id\");`)\n }\n\n async down(): Promise<void> {\n this.addSql(`drop table if exists \"cpq_order_line_configurations\" cascade;`)\n this.addSql(`drop table if exists \"cpq_order_configurations\" cascade;`)\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAEnB,MAAM,2CAA2C,UAAU;AAAA,EAChE,MAAM,KAAoB;AACxB,SAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAgBT;AACH,SAAK,OAAO,uJAAuJ;AACnK,SAAK,OAAO,iIAAiI;AAC7I,SAAK,OAAO,mJAAmJ;AAC/J,SAAK,OAAO,2JAA2J;AACvK,SAAK,OAAO,gJAAgJ;AAE5J,SAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAwBT;AACH,SAAK,OAAO,qJAAqJ;AACjK,SAAK,OAAO,sJAAsJ;AAClK,SAAK,OAAO,6IAA6I;AAAA,EAC3J;AAAA,EAEA,MAAM,OAAsB;AAC1B,SAAK,OAAO,+DAA+D;AAC3E,SAAK,OAAO,0DAA0D;AAAA,EACxE;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,28 @@
1
+ import { Migration } from "@mikro-orm/migrations";
2
+ class Migration20260412000000_cpq_bundled_offerings extends Migration {
3
+ async up() {
4
+ this.addSql(`alter table "cpq_product_specifications" add column "spec_type" text not null default 'simple';`);
5
+ this.addSql(`alter table "cpq_product_specifications" add column "is_assetizable" boolean not null default false;`);
6
+ this.addSql(`alter table "cpq_product_offerings" add column "offering_type" text not null default 'simple';`);
7
+ this.addSql(`create table "cpq_bundle_slots" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "spec_id" uuid not null, "target_spec_id" uuid not null, "component_group" text not null, "name" text not null, "description" text null, "cardinality_min" integer not null default 0, "cardinality_max" integer null, "sort_order" integer not null default 0, "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_bundle_slots_pkey" primary key ("id"));`);
8
+ this.addSql(`create index "cpq_bundle_slot_spec_idx" on "cpq_bundle_slots" ("organization_id", "tenant_id", "spec_id");`);
9
+ this.addSql(`create index "cpq_bundle_slot_target_idx" on "cpq_bundle_slots" ("organization_id", "tenant_id", "target_spec_id");`);
10
+ this.addSql(`create index "cpq_bundle_slot_group_idx" on "cpq_bundle_slots" ("organization_id", "tenant_id", "spec_id", "component_group");`);
11
+ this.addSql(`create table "cpq_offering_components" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "offering_id" uuid not null, "slot_id" uuid not null, "child_offering_id" uuid not null, "is_default" boolean not null default false, "sort_order" integer not null default 0, "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_offering_components_pkey" primary key ("id"));`);
12
+ this.addSql(`create index "cpq_off_comp_offering_idx" on "cpq_offering_components" ("organization_id", "tenant_id", "offering_id");`);
13
+ this.addSql(`create index "cpq_off_comp_slot_idx" on "cpq_offering_components" ("organization_id", "tenant_id", "offering_id", "slot_id");`);
14
+ this.addSql(`create index "cpq_off_comp_child_idx" on "cpq_offering_components" ("organization_id", "tenant_id", "child_offering_id");`);
15
+ this.addSql(`alter table "cpq_offering_components" add constraint "cpq_off_comp_unique" unique ("organization_id", "tenant_id", "offering_id", "child_offering_id");`);
16
+ }
17
+ async down() {
18
+ this.addSql(`drop table if exists "cpq_offering_components" cascade;`);
19
+ this.addSql(`drop table if exists "cpq_bundle_slots" cascade;`);
20
+ this.addSql(`alter table "cpq_product_offerings" drop column if exists "offering_type";`);
21
+ this.addSql(`alter table "cpq_product_specifications" drop column if exists "is_assetizable";`);
22
+ this.addSql(`alter table "cpq_product_specifications" drop column if exists "spec_type";`);
23
+ }
24
+ }
25
+ export {
26
+ Migration20260412000000_cpq_bundled_offerings
27
+ };
28
+ //# sourceMappingURL=Migration20260412000000_cpq_bundled_offerings.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/cpq/migrations/Migration20260412000000_cpq_bundled_offerings.ts"],
4
+ "sourcesContent": ["import { Migration } from '@mikro-orm/migrations'\n\nexport class Migration20260412000000_cpq_bundled_offerings extends Migration {\n async up(): Promise<void> {\n // Extend CpqProductSpecification with spec_type and is_assetizable\n this.addSql(`alter table \"cpq_product_specifications\" add column \"spec_type\" text not null default 'simple';`)\n this.addSql(`alter table \"cpq_product_specifications\" add column \"is_assetizable\" boolean not null default false;`)\n\n // Extend CpqProductOffering with offering_type\n this.addSql(`alter table \"cpq_product_offerings\" add column \"offering_type\" text not null default 'simple';`)\n\n // CpqBundleSlot \u2014 structural slot within a bundle specification\n this.addSql(`create table \"cpq_bundle_slots\" (\"id\" uuid not null default gen_random_uuid(), \"organization_id\" uuid not null, \"tenant_id\" uuid not null, \"spec_id\" uuid not null, \"target_spec_id\" uuid not null, \"component_group\" text not null, \"name\" text not null, \"description\" text null, \"cardinality_min\" integer not null default 0, \"cardinality_max\" integer null, \"sort_order\" integer not null default 0, \"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_bundle_slots_pkey\" primary key (\"id\"));`)\n this.addSql(`create index \"cpq_bundle_slot_spec_idx\" on \"cpq_bundle_slots\" (\"organization_id\", \"tenant_id\", \"spec_id\");`)\n this.addSql(`create index \"cpq_bundle_slot_target_idx\" on \"cpq_bundle_slots\" (\"organization_id\", \"tenant_id\", \"target_spec_id\");`)\n this.addSql(`create index \"cpq_bundle_slot_group_idx\" on \"cpq_bundle_slots\" (\"organization_id\", \"tenant_id\", \"spec_id\", \"component_group\");`)\n\n // CpqOfferingComponent \u2014 links bundle offering to component offerings\n this.addSql(`create table \"cpq_offering_components\" (\"id\" uuid not null default gen_random_uuid(), \"organization_id\" uuid not null, \"tenant_id\" uuid not null, \"offering_id\" uuid not null, \"slot_id\" uuid not null, \"child_offering_id\" uuid not null, \"is_default\" boolean not null default false, \"sort_order\" integer not null default 0, \"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_offering_components_pkey\" primary key (\"id\"));`)\n this.addSql(`create index \"cpq_off_comp_offering_idx\" on \"cpq_offering_components\" (\"organization_id\", \"tenant_id\", \"offering_id\");`)\n this.addSql(`create index \"cpq_off_comp_slot_idx\" on \"cpq_offering_components\" (\"organization_id\", \"tenant_id\", \"offering_id\", \"slot_id\");`)\n this.addSql(`create index \"cpq_off_comp_child_idx\" on \"cpq_offering_components\" (\"organization_id\", \"tenant_id\", \"child_offering_id\");`)\n this.addSql(`alter table \"cpq_offering_components\" add constraint \"cpq_off_comp_unique\" unique (\"organization_id\", \"tenant_id\", \"offering_id\", \"child_offering_id\");`)\n }\n\n async down(): Promise<void> {\n this.addSql(`drop table if exists \"cpq_offering_components\" cascade;`)\n this.addSql(`drop table if exists \"cpq_bundle_slots\" cascade;`)\n this.addSql(`alter table \"cpq_product_offerings\" drop column if exists \"offering_type\";`)\n this.addSql(`alter table \"cpq_product_specifications\" drop column if exists \"is_assetizable\";`)\n this.addSql(`alter table \"cpq_product_specifications\" drop column if exists \"spec_type\";`)\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAEnB,MAAM,sDAAsD,UAAU;AAAA,EAC3E,MAAM,KAAoB;AAExB,SAAK,OAAO,iGAAiG;AAC7G,SAAK,OAAO,sGAAsG;AAGlH,SAAK,OAAO,gGAAgG;AAG5G,SAAK,OAAO,2mBAA2mB;AACvnB,SAAK,OAAO,4GAA4G;AACxH,SAAK,OAAO,qHAAqH;AACjI,SAAK,OAAO,gIAAgI;AAG5I,SAAK,OAAO,wiBAAwiB;AACpjB,SAAK,OAAO,wHAAwH;AACpI,SAAK,OAAO,+HAA+H;AAC3I,SAAK,OAAO,2HAA2H;AACvI,SAAK,OAAO,yJAAyJ;AAAA,EACvK;AAAA,EAEA,MAAM,OAAsB;AAC1B,SAAK,OAAO,yDAAyD;AACrE,SAAK,OAAO,kDAAkD;AAC9D,SAAK,OAAO,4EAA4E;AACxF,SAAK,OAAO,kFAAkF;AAC9F,SAAK,OAAO,6EAA6E;AAAA,EAC3F;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,36 @@
1
+ import { Migration } from "@mikro-orm/migrations";
2
+ class Migration20260504064621_cpq_arc extends Migration {
3
+ async up() {
4
+ this.addSql(`create table "cpq_quote_target_subscriptions" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "quote_id" uuid not null, "subscription_id" uuid not null, "quote_type" text not null, "merge_action" text null, "new_term_start" date null, "new_term_end" date null, "new_term_months" int null, "created_at" timestamptz not null, "updated_at" timestamptz not null, "deleted_at" timestamptz null, constraint "cpq_quote_target_subscriptions_pkey" primary key ("id"));`);
5
+ this.addSql(`create index "cpq_qts_sub_type_idx" on "cpq_quote_target_subscriptions" ("organization_id", "tenant_id", "subscription_id", "quote_type");`);
6
+ this.addSql(`create index "cpq_qts_quote_idx" on "cpq_quote_target_subscriptions" ("organization_id", "tenant_id", "quote_id");`);
7
+ this.addSql(`alter table "cpq_quote_target_subscriptions" add constraint "cpq_qts_quote_sub_unique" unique ("organization_id", "tenant_id", "quote_id", "subscription_id");`);
8
+ this.addSql(`create table "cpq_subscription_change_logs" ("id" uuid not null default gen_random_uuid(), "organization_id" uuid not null, "tenant_id" uuid not null, "subscription_id" uuid not null, "change_type" text not null, "source_quote_id" uuid null, "source_order_id" uuid null, "performed_by_user_id" uuid null, "effective_at" timestamptz not null, "before_snapshot" jsonb null, "after_snapshot" jsonb null, "line_changes" jsonb null, "term_change" jsonb null, "merged_into_subscription_id" uuid null, "merged_from_subscription_ids" jsonb null, "reason_code" text null, "reason_text" text null, "etf_amount" numeric(18, 4) null, "etf_currency" text null, "created_at" timestamptz not null, "deleted_at" timestamptz null, constraint "cpq_subscription_change_logs_pkey" primary key ("id"));`);
9
+ this.addSql(`create index "cpq_scl_merged_into_idx" on "cpq_subscription_change_logs" ("merged_into_subscription_id");`);
10
+ this.addSql(`create index "cpq_scl_source_order_idx" on "cpq_subscription_change_logs" ("source_order_id");`);
11
+ this.addSql(`create index "cpq_scl_sub_history_idx" on "cpq_subscription_change_logs" ("organization_id", "tenant_id", "subscription_id", "created_at");`);
12
+ this.addSql(`alter table "cpq_subscription_change_logs" add constraint "cpq_scl_order_sub_unique" unique ("source_order_id", "subscription_id");`);
13
+ this.addSql(`alter table "cpq_inventory_subscriptions" add column "current_term_start" date null, add column "merged_into_subscription_id" uuid null, add column "last_change_log_id" uuid null, add column "version" int not null default 1;`);
14
+ this.addSql(`create index "cpq_inventory_subscriptions_merged_into_idx" on "cpq_inventory_subscriptions" ("organization_id", "tenant_id", "merged_into_subscription_id");`);
15
+ this.addSql(`create index "cpq_inventory_subscriptions_term_end_idx" on "cpq_inventory_subscriptions" ("organization_id", "tenant_id", "current_term_end");`);
16
+ this.addSql(`alter table "cpq_quote_configurations" add column "quote_type" text not null default 'new', add column "arc_reason_code" text null, add column "arc_reason_text" text null, add column "arc_etf_amount" numeric(18, 4) null, add column "arc_etf_currency" text null, add column "arc_merge_new_term_start" date null, add column "arc_merge_new_term_end" date null, add column "arc_merge_new_term_months" int null, add column "arc_merge_new_sub_code" text null, add column "arc_merge_new_sub_name" text null;`);
17
+ this.addSql(`create index "cpq_quote_configurations_quote_type_idx" on "cpq_quote_configurations" ("organization_id", "tenant_id", "quote_type");`);
18
+ this.addSql(`alter table "cpq_quote_line_configurations" add column "target_subscription_id" uuid null, add column "source_subscription_item_id" uuid null;`);
19
+ this.addSql(`create index "cpq_qlc_target_sub_idx" on "cpq_quote_line_configurations" ("organization_id", "tenant_id", "target_subscription_id");`);
20
+ }
21
+ async down() {
22
+ this.addSql(`drop index "cpq_qlc_target_sub_idx";`);
23
+ this.addSql(`alter table "cpq_quote_line_configurations" drop column "target_subscription_id", drop column "source_subscription_item_id";`);
24
+ this.addSql(`drop index "cpq_quote_configurations_quote_type_idx";`);
25
+ this.addSql(`alter table "cpq_quote_configurations" drop column "quote_type", drop column "arc_reason_code", drop column "arc_reason_text", drop column "arc_etf_amount", drop column "arc_etf_currency", drop column "arc_merge_new_term_start", drop column "arc_merge_new_term_end", drop column "arc_merge_new_term_months", drop column "arc_merge_new_sub_code", drop column "arc_merge_new_sub_name";`);
26
+ this.addSql(`drop index "cpq_inventory_subscriptions_merged_into_idx";`);
27
+ this.addSql(`drop index "cpq_inventory_subscriptions_term_end_idx";`);
28
+ this.addSql(`alter table "cpq_inventory_subscriptions" drop column "current_term_start", drop column "merged_into_subscription_id", drop column "last_change_log_id", drop column "version";`);
29
+ this.addSql(`drop table if exists "cpq_subscription_change_logs" cascade;`);
30
+ this.addSql(`drop table if exists "cpq_quote_target_subscriptions" cascade;`);
31
+ }
32
+ }
33
+ export {
34
+ Migration20260504064621_cpq_arc
35
+ };
36
+ //# sourceMappingURL=Migration20260504064621_cpq_arc.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/cpq/migrations/Migration20260504064621_cpq_arc.ts"],
4
+ "sourcesContent": ["import { Migration } from '@mikro-orm/migrations'\n\n/**\n * XD-250 ARC (Amend / Renew / Cancel) \u2014 Phase 1 schema.\n *\n * Adds:\n * - `cpq_quote_target_subscriptions` (junction quote \u2194 subscription target)\n * - `cpq_subscription_change_logs` (append-only audit per ARC operation)\n * - ARC discriminator + meta columns on `cpq_quote_configurations`\n * - per-line target / source-item columns on `cpq_quote_line_configurations`\n * - term-start, merged-into, last-change-log + optimistic-lock `version`\n * on `cpq_inventory_subscriptions`\n */\nexport class Migration20260504064621_cpq_arc extends Migration {\n\n override async up(): Promise<void> {\n // \u2500\u2500 New table: cpq_quote_target_subscriptions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n this.addSql(`create table \"cpq_quote_target_subscriptions\" (\"id\" uuid not null default gen_random_uuid(), \"organization_id\" uuid not null, \"tenant_id\" uuid not null, \"quote_id\" uuid not null, \"subscription_id\" uuid not null, \"quote_type\" text not null, \"merge_action\" text null, \"new_term_start\" date null, \"new_term_end\" date null, \"new_term_months\" int null, \"created_at\" timestamptz not null, \"updated_at\" timestamptz not null, \"deleted_at\" timestamptz null, constraint \"cpq_quote_target_subscriptions_pkey\" primary key (\"id\"));`)\n this.addSql(`create index \"cpq_qts_sub_type_idx\" on \"cpq_quote_target_subscriptions\" (\"organization_id\", \"tenant_id\", \"subscription_id\", \"quote_type\");`)\n this.addSql(`create index \"cpq_qts_quote_idx\" on \"cpq_quote_target_subscriptions\" (\"organization_id\", \"tenant_id\", \"quote_id\");`)\n this.addSql(`alter table \"cpq_quote_target_subscriptions\" add constraint \"cpq_qts_quote_sub_unique\" unique (\"organization_id\", \"tenant_id\", \"quote_id\", \"subscription_id\");`)\n\n // \u2500\u2500 New table: cpq_subscription_change_logs (append-only audit) \u2500\u2500\n this.addSql(`create table \"cpq_subscription_change_logs\" (\"id\" uuid not null default gen_random_uuid(), \"organization_id\" uuid not null, \"tenant_id\" uuid not null, \"subscription_id\" uuid not null, \"change_type\" text not null, \"source_quote_id\" uuid null, \"source_order_id\" uuid null, \"performed_by_user_id\" uuid null, \"effective_at\" timestamptz not null, \"before_snapshot\" jsonb null, \"after_snapshot\" jsonb null, \"line_changes\" jsonb null, \"term_change\" jsonb null, \"merged_into_subscription_id\" uuid null, \"merged_from_subscription_ids\" jsonb null, \"reason_code\" text null, \"reason_text\" text null, \"etf_amount\" numeric(18, 4) null, \"etf_currency\" text null, \"created_at\" timestamptz not null, \"deleted_at\" timestamptz null, constraint \"cpq_subscription_change_logs_pkey\" primary key (\"id\"));`)\n this.addSql(`create index \"cpq_scl_merged_into_idx\" on \"cpq_subscription_change_logs\" (\"merged_into_subscription_id\");`)\n this.addSql(`create index \"cpq_scl_source_order_idx\" on \"cpq_subscription_change_logs\" (\"source_order_id\");`)\n this.addSql(`create index \"cpq_scl_sub_history_idx\" on \"cpq_subscription_change_logs\" (\"organization_id\", \"tenant_id\", \"subscription_id\", \"created_at\");`)\n // Activation idempotency: PostgreSQL treats NULLs as distinct, so multiple\n // rows with NULL source_order_id can coexist for the same subscription.\n this.addSql(`alter table \"cpq_subscription_change_logs\" add constraint \"cpq_scl_order_sub_unique\" unique (\"source_order_id\", \"subscription_id\");`)\n\n // \u2500\u2500 Existing table: cpq_inventory_subscriptions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // currentTermStart complements existing currentTermEnd; mergedIntoSubscriptionId\n // is set only when this row is a merge source; lastChangeLogId is a\n // convenience pointer; version is a MikroORM optimistic-lock counter.\n this.addSql(`alter table \"cpq_inventory_subscriptions\" add column \"current_term_start\" date null, add column \"merged_into_subscription_id\" uuid null, add column \"last_change_log_id\" uuid null, add column \"version\" int not null default 1;`)\n this.addSql(`create index \"cpq_inventory_subscriptions_merged_into_idx\" on \"cpq_inventory_subscriptions\" (\"organization_id\", \"tenant_id\", \"merged_into_subscription_id\");`)\n this.addSql(`create index \"cpq_inventory_subscriptions_term_end_idx\" on \"cpq_inventory_subscriptions\" (\"organization_id\", \"tenant_id\", \"current_term_end\");`)\n\n // \u2500\u2500 Existing table: cpq_quote_configurations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // quote_type discriminates ARC quotes; arc_reason_*/etf_*/merge_* fields\n // carry ARC meta forward to order activation.\n this.addSql(`alter table \"cpq_quote_configurations\" add column \"quote_type\" text not null default 'new', add column \"arc_reason_code\" text null, add column \"arc_reason_text\" text null, add column \"arc_etf_amount\" numeric(18, 4) null, add column \"arc_etf_currency\" text null, add column \"arc_merge_new_term_start\" date null, add column \"arc_merge_new_term_end\" date null, add column \"arc_merge_new_term_months\" int null, add column \"arc_merge_new_sub_code\" text null, add column \"arc_merge_new_sub_name\" text null;`)\n this.addSql(`create index \"cpq_quote_configurations_quote_type_idx\" on \"cpq_quote_configurations\" (\"organization_id\", \"tenant_id\", \"quote_type\");`)\n\n // \u2500\u2500 Existing table: cpq_quote_line_configurations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // target_subscription_id identifies which target sub the line affects;\n // source_subscription_item_id points at the item being changed for\n // cancel/modify lines.\n this.addSql(`alter table \"cpq_quote_line_configurations\" add column \"target_subscription_id\" uuid null, add column \"source_subscription_item_id\" uuid null;`)\n this.addSql(`create index \"cpq_qlc_target_sub_idx\" on \"cpq_quote_line_configurations\" (\"organization_id\", \"tenant_id\", \"target_subscription_id\");`)\n }\n\n override async down(): Promise<void> {\n this.addSql(`drop index \"cpq_qlc_target_sub_idx\";`)\n this.addSql(`alter table \"cpq_quote_line_configurations\" drop column \"target_subscription_id\", drop column \"source_subscription_item_id\";`)\n\n this.addSql(`drop index \"cpq_quote_configurations_quote_type_idx\";`)\n this.addSql(`alter table \"cpq_quote_configurations\" drop column \"quote_type\", drop column \"arc_reason_code\", drop column \"arc_reason_text\", drop column \"arc_etf_amount\", drop column \"arc_etf_currency\", drop column \"arc_merge_new_term_start\", drop column \"arc_merge_new_term_end\", drop column \"arc_merge_new_term_months\", drop column \"arc_merge_new_sub_code\", drop column \"arc_merge_new_sub_name\";`)\n\n this.addSql(`drop index \"cpq_inventory_subscriptions_merged_into_idx\";`)\n this.addSql(`drop index \"cpq_inventory_subscriptions_term_end_idx\";`)\n this.addSql(`alter table \"cpq_inventory_subscriptions\" drop column \"current_term_start\", drop column \"merged_into_subscription_id\", drop column \"last_change_log_id\", drop column \"version\";`)\n\n this.addSql(`drop table if exists \"cpq_subscription_change_logs\" cascade;`)\n this.addSql(`drop table if exists \"cpq_quote_target_subscriptions\" cascade;`)\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAanB,MAAM,wCAAwC,UAAU;AAAA,EAE7D,MAAe,KAAoB;AAEjC,SAAK,OAAO,wgBAAwgB;AACphB,SAAK,OAAO,4IAA4I;AACxJ,SAAK,OAAO,oHAAoH;AAChI,SAAK,OAAO,gKAAgK;AAG5K,SAAK,OAAO,+wBAA+wB;AAC3xB,SAAK,OAAO,2GAA2G;AACvH,SAAK,OAAO,gGAAgG;AAC5G,SAAK,OAAO,6IAA6I;AAGzJ,SAAK,OAAO,qIAAqI;AAMjJ,SAAK,OAAO,kOAAkO;AAC9O,SAAK,OAAO,8JAA8J;AAC1K,SAAK,OAAO,gJAAgJ;AAK5J,SAAK,OAAO,sfAAsf;AAClgB,SAAK,OAAO,sIAAsI;AAMlJ,SAAK,OAAO,gJAAgJ;AAC5J,SAAK,OAAO,sIAAsI;AAAA,EACpJ;AAAA,EAEA,MAAe,OAAsB;AACnC,SAAK,OAAO,sCAAsC;AAClD,SAAK,OAAO,8HAA8H;AAE1I,SAAK,OAAO,uDAAuD;AACnE,SAAK,OAAO,iYAAiY;AAE7Y,SAAK,OAAO,2DAA2D;AACvE,SAAK,OAAO,wDAAwD;AACpE,SAAK,OAAO,iLAAiL;AAE7L,SAAK,OAAO,8DAA8D;AAC1E,SAAK,OAAO,gEAAgE;AAAA,EAC9E;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,14 @@
1
+ import { Migration } from "@mikro-orm/migrations";
2
+ class Migration20260514000000_cpq_spec_merge_retired_deprecated extends Migration {
3
+ async up() {
4
+ this.addSql(
5
+ `update "cpq_product_specifications" set "lifecycle_status" = 'deprecated' where "lifecycle_status" = 'retired';`
6
+ );
7
+ }
8
+ async down() {
9
+ }
10
+ }
11
+ export {
12
+ Migration20260514000000_cpq_spec_merge_retired_deprecated
13
+ };
14
+ //# sourceMappingURL=Migration20260514000000_cpq_spec_merge_retired_deprecated.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/cpq/migrations/Migration20260514000000_cpq_spec_merge_retired_deprecated.ts"],
4
+ "sourcesContent": ["import { Migration } from '@mikro-orm/migrations'\n\n/**\n * Merge the `retired` lifecycle status into `deprecated` for product\n * specifications. Reviewers found the two states redundant for spec\n * semantics (`deprecated` already conveys \"do not use for new work\").\n *\n * Scope: ONLY `cpq_product_specifications`. Offerings keep four states\n * because the user-facing semantics differ \u2014 a `retired` offering cannot\n * be sold at all, while `deprecated` offerings can still be sold but are\n * discouraged. That distinction does not apply at the specification\n * level (specs describe the product shape, not the sellability).\n *\n * Data-only migration: the underlying column is `text` so no schema\n * change is required. The Zod validator on the API now rejects\n * `'retired'` for new writes.\n */\nexport class Migration20260514000000_cpq_spec_merge_retired_deprecated extends Migration {\n async up(): Promise<void> {\n this.addSql(\n `update \"cpq_product_specifications\" set \"lifecycle_status\" = 'deprecated' where \"lifecycle_status\" = 'retired';`,\n )\n }\n\n async down(): Promise<void> {\n // Lossy: there's no way to know which rows were originally `retired`\n // vs originally `deprecated` once the merge runs. Down() is a no-op\n // so a rollback doesn't silently fabricate a status.\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAiBnB,MAAM,kEAAkE,UAAU;AAAA,EACvF,MAAM,KAAoB;AACxB,SAAK;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAsB;AAAA,EAI5B;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,14 @@
1
+ import { Migration } from "@mikro-orm/migrations";
2
+ class Migration20260514100000_cpq_offering_merge_retired_deprecated extends Migration {
3
+ async up() {
4
+ this.addSql(
5
+ `update "cpq_product_offerings" set "lifecycle_status" = 'deprecated' where "lifecycle_status" = 'retired';`
6
+ );
7
+ }
8
+ async down() {
9
+ }
10
+ }
11
+ export {
12
+ Migration20260514100000_cpq_offering_merge_retired_deprecated
13
+ };
14
+ //# sourceMappingURL=Migration20260514100000_cpq_offering_merge_retired_deprecated.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/cpq/migrations/Migration20260514100000_cpq_offering_merge_retired_deprecated.ts"],
4
+ "sourcesContent": ["import { Migration } from '@mikro-orm/migrations'\n\n/**\n * Merge the `retired` lifecycle status into `deprecated` for product\n * offerings \u2014 same call as the earlier specifications merge\n * (`Migration20260514000000`). Reviewer wanted the offering UI to mirror\n * the specification's 3-state ladder, so we collapse the redundant state\n * and unify both surfaces through the single `LifecycleStatus` type and\n * `lifecycleStatusMap` in `components/statusMaps.ts`.\n *\n * Data-only migration: the underlying column is `text` so no schema\n * change is required. The Zod validator on the API now rejects\n * `'retired'` for new offering writes.\n */\nexport class Migration20260514100000_cpq_offering_merge_retired_deprecated extends Migration {\n async up(): Promise<void> {\n this.addSql(\n `update \"cpq_product_offerings\" set \"lifecycle_status\" = 'deprecated' where \"lifecycle_status\" = 'retired';`,\n )\n }\n\n async down(): Promise<void> {\n // Lossy: there's no way to tell which rows were originally `retired`\n // vs originally `deprecated` once merged. Same rationale as the\n // specifications merge \u2014 leave down() as a no-op.\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAcnB,MAAM,sEAAsE,UAAU;AAAA,EAC3F,MAAM,KAAoB;AACxB,SAAK;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAsB;AAAA,EAI5B;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,58 @@
1
+ import { Migration } from "@mikro-orm/migrations";
2
+ class Migration20260514110000_cpq_list_search_indexes extends Migration {
3
+ async up() {
4
+ this.addSql(`create extension if not exists "pg_trgm";`);
5
+ this.addSql(
6
+ `create index if not exists "cpq_product_offerings_code_trgm_idx"
7
+ on "cpq_product_offerings" using gin ("code" gin_trgm_ops)
8
+ where "deleted_at" is null;`
9
+ );
10
+ this.addSql(
11
+ `create index if not exists "cpq_product_offerings_name_trgm_idx"
12
+ on "cpq_product_offerings" using gin ("name" gin_trgm_ops)
13
+ where "deleted_at" is null;`
14
+ );
15
+ this.addSql(
16
+ `create index if not exists "cpq_product_offerings_description_trgm_idx"
17
+ on "cpq_product_offerings" using gin ("description" gin_trgm_ops)
18
+ where "deleted_at" is null and "description" is not null;`
19
+ );
20
+ this.addSql(
21
+ `create index if not exists "cpq_product_offerings_list_created_idx"
22
+ on "cpq_product_offerings" ("organization_id", "tenant_id", "deleted_at", "created_at" desc);`
23
+ );
24
+ this.addSql(
25
+ `create index if not exists "cpq_product_specifications_code_trgm_idx"
26
+ on "cpq_product_specifications" using gin ("code" gin_trgm_ops)
27
+ where "deleted_at" is null;`
28
+ );
29
+ this.addSql(
30
+ `create index if not exists "cpq_product_specifications_name_trgm_idx"
31
+ on "cpq_product_specifications" using gin ("name" gin_trgm_ops)
32
+ where "deleted_at" is null;`
33
+ );
34
+ this.addSql(
35
+ `create index if not exists "cpq_product_specifications_description_trgm_idx"
36
+ on "cpq_product_specifications" using gin ("description" gin_trgm_ops)
37
+ where "deleted_at" is null and "description" is not null;`
38
+ );
39
+ this.addSql(
40
+ `create index if not exists "cpq_product_specifications_list_created_idx"
41
+ on "cpq_product_specifications" ("organization_id", "tenant_id", "deleted_at", "created_at" desc);`
42
+ );
43
+ }
44
+ async down() {
45
+ this.addSql(`drop index if exists "cpq_product_specifications_list_created_idx";`);
46
+ this.addSql(`drop index if exists "cpq_product_specifications_description_trgm_idx";`);
47
+ this.addSql(`drop index if exists "cpq_product_specifications_name_trgm_idx";`);
48
+ this.addSql(`drop index if exists "cpq_product_specifications_code_trgm_idx";`);
49
+ this.addSql(`drop index if exists "cpq_product_offerings_list_created_idx";`);
50
+ this.addSql(`drop index if exists "cpq_product_offerings_description_trgm_idx";`);
51
+ this.addSql(`drop index if exists "cpq_product_offerings_name_trgm_idx";`);
52
+ this.addSql(`drop index if exists "cpq_product_offerings_code_trgm_idx";`);
53
+ }
54
+ }
55
+ export {
56
+ Migration20260514110000_cpq_list_search_indexes
57
+ };
58
+ //# sourceMappingURL=Migration20260514110000_cpq_list_search_indexes.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/cpq/migrations/Migration20260514110000_cpq_list_search_indexes.ts"],
4
+ "sourcesContent": ["import { Migration } from '@mikro-orm/migrations'\n\n/**\n * Scale-prep indexes for the two highest-traffic CPQ list pages\n * (`/backend/cpq/offerings` and `/backend/cpq/specifications`).\n *\n * Why: both endpoints implement free-text search as\n * `$ilike '%term%'` against `code`, `name`, and `description`, which\n * forces a sequential scan on every request once row counts grow.\n * The default sort (`createdAt DESC`) also has no covering index, so\n * pagination of a filtered set degrades linearly with table size.\n *\n * Target: keep both lists snappy at 10k+ rows per tenant \u2014 production\n * customers are expected to import multiple thousands of offerings on\n * day one. Hand-written because MikroORM's schema generator does not\n * emit `pg_trgm` GIN operator classes or partial-index predicates.\n *\n * Indexes added per table (`cpq_product_offerings`, `cpq_product_specifications`):\n * - GIN trigram on `code`, `name`, `description` (partial: `deleted_at IS NULL`)\n * - B-tree `(organization_id, tenant_id, deleted_at, created_at DESC)`\n * to cover the default-list scan + sort path.\n */\nexport class Migration20260514110000_cpq_list_search_indexes extends Migration {\n async up(): Promise<void> {\n this.addSql(`create extension if not exists \"pg_trgm\";`)\n\n // \u2500\u2500 Offerings \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n this.addSql(\n `create index if not exists \"cpq_product_offerings_code_trgm_idx\"\n on \"cpq_product_offerings\" using gin (\"code\" gin_trgm_ops)\n where \"deleted_at\" is null;`,\n )\n this.addSql(\n `create index if not exists \"cpq_product_offerings_name_trgm_idx\"\n on \"cpq_product_offerings\" using gin (\"name\" gin_trgm_ops)\n where \"deleted_at\" is null;`,\n )\n this.addSql(\n `create index if not exists \"cpq_product_offerings_description_trgm_idx\"\n on \"cpq_product_offerings\" using gin (\"description\" gin_trgm_ops)\n where \"deleted_at\" is null and \"description\" is not null;`,\n )\n this.addSql(\n `create index if not exists \"cpq_product_offerings_list_created_idx\"\n on \"cpq_product_offerings\" (\"organization_id\", \"tenant_id\", \"deleted_at\", \"created_at\" desc);`,\n )\n\n // \u2500\u2500 Specifications \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n this.addSql(\n `create index if not exists \"cpq_product_specifications_code_trgm_idx\"\n on \"cpq_product_specifications\" using gin (\"code\" gin_trgm_ops)\n where \"deleted_at\" is null;`,\n )\n this.addSql(\n `create index if not exists \"cpq_product_specifications_name_trgm_idx\"\n on \"cpq_product_specifications\" using gin (\"name\" gin_trgm_ops)\n where \"deleted_at\" is null;`,\n )\n this.addSql(\n `create index if not exists \"cpq_product_specifications_description_trgm_idx\"\n on \"cpq_product_specifications\" using gin (\"description\" gin_trgm_ops)\n where \"deleted_at\" is null and \"description\" is not null;`,\n )\n this.addSql(\n `create index if not exists \"cpq_product_specifications_list_created_idx\"\n on \"cpq_product_specifications\" (\"organization_id\", \"tenant_id\", \"deleted_at\", \"created_at\" desc);`,\n )\n }\n\n async down(): Promise<void> {\n this.addSql(`drop index if exists \"cpq_product_specifications_list_created_idx\";`)\n this.addSql(`drop index if exists \"cpq_product_specifications_description_trgm_idx\";`)\n this.addSql(`drop index if exists \"cpq_product_specifications_name_trgm_idx\";`)\n this.addSql(`drop index if exists \"cpq_product_specifications_code_trgm_idx\";`)\n\n this.addSql(`drop index if exists \"cpq_product_offerings_list_created_idx\";`)\n this.addSql(`drop index if exists \"cpq_product_offerings_description_trgm_idx\";`)\n this.addSql(`drop index if exists \"cpq_product_offerings_name_trgm_idx\";`)\n this.addSql(`drop index if exists \"cpq_product_offerings_code_trgm_idx\";`)\n // Extension left in place \u2014 other modules may also rely on it.\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAsBnB,MAAM,wDAAwD,UAAU;AAAA,EAC7E,MAAM,KAAoB;AACxB,SAAK,OAAO,2CAA2C;AAGvD,SAAK;AAAA,MACH;AAAA;AAAA;AAAA,IAGF;AACA,SAAK;AAAA,MACH;AAAA;AAAA;AAAA,IAGF;AACA,SAAK;AAAA,MACH;AAAA;AAAA;AAAA,IAGF;AACA,SAAK;AAAA,MACH;AAAA;AAAA,IAEF;AAGA,SAAK;AAAA,MACH;AAAA;AAAA;AAAA,IAGF;AACA,SAAK;AAAA,MACH;AAAA;AAAA;AAAA,IAGF;AACA,SAAK;AAAA,MACH;AAAA;AAAA;AAAA,IAGF;AACA,SAAK;AAAA,MACH;AAAA;AAAA,IAEF;AAAA,EACF;AAAA,EAEA,MAAM,OAAsB;AAC1B,SAAK,OAAO,qEAAqE;AACjF,SAAK,OAAO,yEAAyE;AACrF,SAAK,OAAO,kEAAkE;AAC9E,SAAK,OAAO,kEAAkE;AAE9E,SAAK,OAAO,gEAAgE;AAC5E,SAAK,OAAO,oEAAoE;AAChF,SAAK,OAAO,6DAA6D;AACzE,SAAK,OAAO,6DAA6D;AAAA,EAE3E;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,29 @@
1
+ import { Migration } from "@mikro-orm/migrations";
2
+ class Migration20260515000000_cpq_inventory_subscriptions_search_indexes extends Migration {
3
+ async up() {
4
+ this.addSql(`create extension if not exists "pg_trgm";`);
5
+ this.addSql(
6
+ `create index if not exists "cpq_inventory_subscriptions_code_trgm_idx"
7
+ on "cpq_inventory_subscriptions" using gin ("code" gin_trgm_ops)
8
+ where "deleted_at" is null;`
9
+ );
10
+ this.addSql(
11
+ `create index if not exists "cpq_inventory_subscriptions_name_trgm_idx"
12
+ on "cpq_inventory_subscriptions" using gin ("name" gin_trgm_ops)
13
+ where "deleted_at" is null;`
14
+ );
15
+ this.addSql(
16
+ `create index if not exists "cpq_inventory_subscriptions_list_created_idx"
17
+ on "cpq_inventory_subscriptions" ("organization_id", "tenant_id", "deleted_at", "created_at" desc);`
18
+ );
19
+ }
20
+ async down() {
21
+ this.addSql(`drop index if exists "cpq_inventory_subscriptions_list_created_idx";`);
22
+ this.addSql(`drop index if exists "cpq_inventory_subscriptions_name_trgm_idx";`);
23
+ this.addSql(`drop index if exists "cpq_inventory_subscriptions_code_trgm_idx";`);
24
+ }
25
+ }
26
+ export {
27
+ Migration20260515000000_cpq_inventory_subscriptions_search_indexes
28
+ };
29
+ //# sourceMappingURL=Migration20260515000000_cpq_inventory_subscriptions_search_indexes.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/cpq/migrations/Migration20260515000000_cpq_inventory_subscriptions_search_indexes.ts"],
4
+ "sourcesContent": ["import { Migration } from '@mikro-orm/migrations'\n\n/**\n * Scale-prep indexes for the customer-inventory subscriptions list.\n *\n * `/backend/cpq/inventory` (Subscriptions tab) lets operators search by\n * code or name with `$ilike '%term%'`, which forces a sequential scan as\n * soon as a tenant accumulates a few thousand subscriptions. The new\n * \"Expiring within X days\" perspective filters by `currentTermEnd` \u2014\n * already covered by `cpq_inventory_subscriptions_term_end_idx`, but\n * the default sort path `(organization_id, tenant_id, deleted_at,\n * created_at DESC)` had no covering index either.\n *\n * Target: keep the subscriptions list snappy at 10k+ subs per tenant\n * (production telecom-style customers easily hit that).\n *\n * Indexes added (`cpq_inventory_subscriptions`):\n * - GIN trigram on `code` (partial: `deleted_at IS NULL`)\n * - GIN trigram on `name` (partial: `deleted_at IS NULL`)\n * - B-tree `(organization_id, tenant_id, deleted_at, created_at DESC)`\n *\n * Hand-written because MikroORM's schema generator can't emit\n * `gin_trgm_ops` or partial-index predicates. `pg_trgm` is already\n * installed by `Migration20260514110000_cpq_list_search_indexes`.\n */\nexport class Migration20260515000000_cpq_inventory_subscriptions_search_indexes extends Migration {\n async up(): Promise<void> {\n this.addSql(`create extension if not exists \"pg_trgm\";`)\n\n this.addSql(\n `create index if not exists \"cpq_inventory_subscriptions_code_trgm_idx\"\n on \"cpq_inventory_subscriptions\" using gin (\"code\" gin_trgm_ops)\n where \"deleted_at\" is null;`,\n )\n this.addSql(\n `create index if not exists \"cpq_inventory_subscriptions_name_trgm_idx\"\n on \"cpq_inventory_subscriptions\" using gin (\"name\" gin_trgm_ops)\n where \"deleted_at\" is null;`,\n )\n this.addSql(\n `create index if not exists \"cpq_inventory_subscriptions_list_created_idx\"\n on \"cpq_inventory_subscriptions\" (\"organization_id\", \"tenant_id\", \"deleted_at\", \"created_at\" desc);`,\n )\n }\n\n async down(): Promise<void> {\n this.addSql(`drop index if exists \"cpq_inventory_subscriptions_list_created_idx\";`)\n this.addSql(`drop index if exists \"cpq_inventory_subscriptions_name_trgm_idx\";`)\n this.addSql(`drop index if exists \"cpq_inventory_subscriptions_code_trgm_idx\";`)\n // pg_trgm extension left in place \u2014 owned by the earlier migration.\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAyBnB,MAAM,2EAA2E,UAAU;AAAA,EAChG,MAAM,KAAoB;AACxB,SAAK,OAAO,2CAA2C;AAEvD,SAAK;AAAA,MACH;AAAA;AAAA;AAAA,IAGF;AACA,SAAK;AAAA,MACH;AAAA;AAAA;AAAA,IAGF;AACA,SAAK;AAAA,MACH;AAAA;AAAA,IAEF;AAAA,EACF;AAAA,EAEA,MAAM,OAAsB;AAC1B,SAAK,OAAO,sEAAsE;AAClF,SAAK,OAAO,mEAAmE;AAC/E,SAAK,OAAO,mEAAmE;AAAA,EAEjF;AACF;",
6
+ "names": []
7
+ }