@dainamite/cpq 0.5.0 → 0.6.0

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 (233) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/MIGRATION.md +74 -0
  3. package/dist/modules/cpq/acl.js +1 -0
  4. package/dist/modules/cpq/acl.js.map +2 -2
  5. package/dist/modules/cpq/api/_helpers/adjustmentCommandRoute.js +45 -0
  6. package/dist/modules/cpq/api/_helpers/adjustmentCommandRoute.js.map +7 -0
  7. package/dist/modules/cpq/api/_helpers/quoteMutationGuard.js +23 -0
  8. package/dist/modules/cpq/api/_helpers/quoteMutationGuard.js.map +7 -0
  9. package/dist/modules/cpq/api/_helpers/quoteRouteOpenApi.js +19 -0
  10. package/dist/modules/cpq/api/_helpers/quoteRouteOpenApi.js.map +7 -0
  11. package/dist/modules/cpq/api/orders/[orderId]/route.js +17 -1
  12. package/dist/modules/cpq/api/orders/[orderId]/route.js.map +2 -2
  13. package/dist/modules/cpq/api/orders/route.js +47 -2
  14. package/dist/modules/cpq/api/orders/route.js.map +2 -2
  15. package/dist/modules/cpq/api/quotes/[quoteId]/items/[lineId]/restore/route.js +54 -0
  16. package/dist/modules/cpq/api/quotes/[quoteId]/items/[lineId]/restore/route.js.map +7 -0
  17. package/dist/modules/cpq/api/quotes/[quoteId]/items/[lineId]/route.js +42 -2
  18. package/dist/modules/cpq/api/quotes/[quoteId]/items/[lineId]/route.js.map +2 -2
  19. package/dist/modules/cpq/api/quotes/[quoteId]/items/route.js +27 -2
  20. package/dist/modules/cpq/api/quotes/[quoteId]/items/route.js.map +2 -2
  21. package/dist/modules/cpq/api/quotes/[quoteId]/price-adjustments/[adjustmentId]/route.js +47 -0
  22. package/dist/modules/cpq/api/quotes/[quoteId]/price-adjustments/[adjustmentId]/route.js.map +7 -0
  23. package/dist/modules/cpq/api/quotes/[quoteId]/price-adjustments/preview/route.js +30 -0
  24. package/dist/modules/cpq/api/quotes/[quoteId]/price-adjustments/preview/route.js.map +7 -0
  25. package/dist/modules/cpq/api/quotes/[quoteId]/price-adjustments/route.js +47 -0
  26. package/dist/modules/cpq/api/quotes/[quoteId]/price-adjustments/route.js.map +7 -0
  27. package/dist/modules/cpq/api/quotes/[quoteId]/recalculate/route.js +32 -2
  28. package/dist/modules/cpq/api/quotes/[quoteId]/recalculate/route.js.map +2 -2
  29. package/dist/modules/cpq/api/quotes/[quoteId]/status/route.js +33 -2
  30. package/dist/modules/cpq/api/quotes/[quoteId]/status/route.js.map +2 -2
  31. package/dist/modules/cpq/api/quotes/price/route.js +43 -3
  32. package/dist/modules/cpq/api/quotes/price/route.js.map +2 -2
  33. package/dist/modules/cpq/backend/cpq/inventory/page.meta.js +1 -1
  34. package/dist/modules/cpq/backend/cpq/inventory/page.meta.js.map +1 -1
  35. package/dist/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.js +22 -8
  36. package/dist/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.js.map +2 -2
  37. package/dist/modules/cpq/backend/cpq/orders/[id]/page.js +89 -232
  38. package/dist/modules/cpq/backend/cpq/orders/[id]/page.js.map +2 -2
  39. package/dist/modules/cpq/backend/cpq/orders/page.meta.js +1 -1
  40. package/dist/modules/cpq/backend/cpq/orders/page.meta.js.map +1 -1
  41. package/dist/modules/cpq/backend/cpq/quotes/[id]/_components/PriceAdjustmentDialog.js +205 -0
  42. package/dist/modules/cpq/backend/cpq/quotes/[id]/_components/PriceAdjustmentDialog.js.map +7 -0
  43. package/dist/modules/cpq/backend/cpq/quotes/[id]/_components/PriceAdjustmentsPanel.js +79 -0
  44. package/dist/modules/cpq/backend/cpq/quotes/[id]/_components/PriceAdjustmentsPanel.js.map +7 -0
  45. package/dist/modules/cpq/backend/cpq/quotes/[id]/_components/arcLineRemoval.js +53 -0
  46. package/dist/modules/cpq/backend/cpq/quotes/[id]/_components/arcLineRemoval.js.map +7 -0
  47. package/dist/modules/cpq/backend/cpq/quotes/[id]/_components/priceAdjustmentContext.js +107 -0
  48. package/dist/modules/cpq/backend/cpq/quotes/[id]/_components/priceAdjustmentContext.js.map +7 -0
  49. package/dist/modules/cpq/backend/cpq/quotes/[id]/_components/usePriceAdjustments.js +130 -0
  50. package/dist/modules/cpq/backend/cpq/quotes/[id]/_components/usePriceAdjustments.js.map +7 -0
  51. package/dist/modules/cpq/backend/cpq/quotes/[id]/page.js +144 -221
  52. package/dist/modules/cpq/backend/cpq/quotes/[id]/page.js.map +3 -3
  53. package/dist/modules/cpq/backend/cpq/quotes/page.meta.js +1 -1
  54. package/dist/modules/cpq/backend/cpq/quotes/page.meta.js.map +1 -1
  55. package/dist/modules/cpq/ce.js +8 -0
  56. package/dist/modules/cpq/ce.js.map +2 -2
  57. package/dist/modules/cpq/cli.js +34 -1
  58. package/dist/modules/cpq/cli.js.map +2 -2
  59. package/dist/modules/cpq/commands/price-adjustments.js +107 -0
  60. package/dist/modules/cpq/commands/price-adjustments.js.map +7 -0
  61. package/dist/modules/cpq/components/ArcLineDiff.js +53 -0
  62. package/dist/modules/cpq/components/ArcLineDiff.js.map +7 -0
  63. package/dist/modules/cpq/components/ChargeBreakdownTable.js +154 -0
  64. package/dist/modules/cpq/components/ChargeBreakdownTable.js.map +7 -0
  65. package/dist/modules/cpq/components/PriceWaterfall.js +66 -0
  66. package/dist/modules/cpq/components/PriceWaterfall.js.map +7 -0
  67. package/dist/modules/cpq/components/PricingSummaryCard.js +117 -0
  68. package/dist/modules/cpq/components/PricingSummaryCard.js.map +7 -0
  69. package/dist/modules/cpq/components/useGrantedFeatures.js +27 -0
  70. package/dist/modules/cpq/components/useGrantedFeatures.js.map +7 -0
  71. package/dist/modules/cpq/data/entities.js +97 -0
  72. package/dist/modules/cpq/data/entities.js.map +2 -2
  73. package/dist/modules/cpq/data/price-adjustments.js +70 -0
  74. package/dist/modules/cpq/data/price-adjustments.js.map +7 -0
  75. package/dist/modules/cpq/data/validators.js +4 -0
  76. package/dist/modules/cpq/data/validators.js.map +2 -2
  77. package/dist/modules/cpq/di.js +6 -0
  78. package/dist/modules/cpq/di.js.map +2 -2
  79. package/dist/modules/cpq/events.js +47 -0
  80. package/dist/modules/cpq/events.js.map +2 -2
  81. package/dist/modules/cpq/index.js +1 -1
  82. package/dist/modules/cpq/index.js.map +2 -2
  83. package/dist/modules/cpq/lib/auditActor.js +10 -0
  84. package/dist/modules/cpq/lib/auditActor.js.map +7 -0
  85. package/dist/modules/cpq/lib/formatMoney.js +7 -0
  86. package/dist/modules/cpq/lib/formatMoney.js.map +7 -0
  87. package/dist/modules/cpq/lib/priceAdjustmentDefaults.js +60 -0
  88. package/dist/modules/cpq/lib/priceAdjustmentDefaults.js.map +7 -0
  89. package/dist/modules/cpq/lib/priceAdjustmentView.js +169 -0
  90. package/dist/modules/cpq/lib/priceAdjustmentView.js.map +7 -0
  91. package/dist/modules/cpq/lib/quotePermissions.js +13 -0
  92. package/dist/modules/cpq/lib/quotePermissions.js.map +7 -0
  93. package/dist/modules/cpq/lib/quoteSummaryView.js +28 -0
  94. package/dist/modules/cpq/lib/quoteSummaryView.js.map +7 -0
  95. package/dist/modules/cpq/migrations/Migration20261110213052.js +22 -0
  96. package/dist/modules/cpq/migrations/Migration20261110213052.js.map +7 -0
  97. package/dist/modules/cpq/services/arcLineRemoval.js +53 -0
  98. package/dist/modules/cpq/services/arcLineRemoval.js.map +7 -0
  99. package/dist/modules/cpq/services/arcPriceFreeze.js +79 -0
  100. package/dist/modules/cpq/services/arcPriceFreeze.js.map +7 -0
  101. package/dist/modules/cpq/services/cpqOrderService.js +25 -28
  102. package/dist/modules/cpq/services/cpqOrderService.js.map +2 -2
  103. package/dist/modules/cpq/services/cpqPricingService.js +7 -0
  104. package/dist/modules/cpq/services/cpqPricingService.js.map +2 -2
  105. package/dist/modules/cpq/services/cpqQuotingService.js +330 -109
  106. package/dist/modules/cpq/services/cpqQuotingService.js.map +2 -2
  107. package/dist/modules/cpq/services/orderPricingSummary.js +26 -0
  108. package/dist/modules/cpq/services/orderPricingSummary.js.map +7 -0
  109. package/dist/modules/cpq/services/priceAdjustments/adjustmentService.js +264 -0
  110. package/dist/modules/cpq/services/priceAdjustments/adjustmentService.js.map +7 -0
  111. package/dist/modules/cpq/services/priceAdjustments/chargeWaterfall.js +25 -0
  112. package/dist/modules/cpq/services/priceAdjustments/chargeWaterfall.js.map +7 -0
  113. package/dist/modules/cpq/services/priceAdjustments/loadQuoteAdjustments.js +38 -0
  114. package/dist/modules/cpq/services/priceAdjustments/loadQuoteAdjustments.js.map +7 -0
  115. package/dist/modules/cpq/services/priceAdjustments/pricingSnapshot.js +104 -0
  116. package/dist/modules/cpq/services/priceAdjustments/pricingSnapshot.js.map +7 -0
  117. package/dist/modules/cpq/services/priceAdjustments/quoteAdjustmentLifecycle.js +102 -0
  118. package/dist/modules/cpq/services/priceAdjustments/quoteAdjustmentLifecycle.js.map +7 -0
  119. package/dist/modules/cpq/services/priceAdjustments/quotePricingEvents.js +52 -0
  120. package/dist/modules/cpq/services/priceAdjustments/quotePricingEvents.js.map +7 -0
  121. package/dist/modules/cpq/services/priceAdjustments/quotePricingWrite.js +37 -0
  122. package/dist/modules/cpq/services/priceAdjustments/quotePricingWrite.js.map +7 -0
  123. package/dist/modules/cpq/services/priceAdjustments/resolveManualAdjustments.js +107 -0
  124. package/dist/modules/cpq/services/priceAdjustments/resolveManualAdjustments.js.map +7 -0
  125. package/dist/modules/cpq/services/priceAdjustments/storedAdjustmentFailure.js +30 -0
  126. package/dist/modules/cpq/services/priceAdjustments/storedAdjustmentFailure.js.map +7 -0
  127. package/dist/modules/cpq/services/types.js.map +2 -2
  128. package/dist/modules/cpq/setup.js +6 -0
  129. package/dist/modules/cpq/setup.js.map +2 -2
  130. package/package.json +1 -1
  131. package/src/modules/cpq/__integration__/TC-CPQ-ARC-012.spec.ts +134 -0
  132. package/src/modules/cpq/acl.ts +1 -0
  133. package/src/modules/cpq/api/__tests__/adjustmentRoutes.test.ts +79 -0
  134. package/src/modules/cpq/api/__tests__/quoteWriteGuards.test.ts +100 -0
  135. package/src/modules/cpq/api/_helpers/__tests__/quoteMutationGuard.test.ts +48 -0
  136. package/src/modules/cpq/api/_helpers/adjustmentCommandRoute.ts +45 -0
  137. package/src/modules/cpq/api/_helpers/quoteMutationGuard.ts +38 -0
  138. package/src/modules/cpq/api/_helpers/quoteRouteOpenApi.ts +19 -0
  139. package/src/modules/cpq/api/orders/[orderId]/route.ts +18 -0
  140. package/src/modules/cpq/api/orders/route.ts +51 -1
  141. package/src/modules/cpq/api/quotes/[quoteId]/items/[lineId]/restore/route.ts +56 -0
  142. package/src/modules/cpq/api/quotes/[quoteId]/items/[lineId]/route.ts +48 -1
  143. package/src/modules/cpq/api/quotes/[quoteId]/items/route.ts +31 -1
  144. package/src/modules/cpq/api/quotes/[quoteId]/price-adjustments/[adjustmentId]/route.ts +39 -0
  145. package/src/modules/cpq/api/quotes/[quoteId]/price-adjustments/preview/route.ts +24 -0
  146. package/src/modules/cpq/api/quotes/[quoteId]/price-adjustments/route.ts +40 -0
  147. package/src/modules/cpq/api/quotes/[quoteId]/recalculate/__tests__/route.test.ts +95 -0
  148. package/src/modules/cpq/api/quotes/[quoteId]/recalculate/route.ts +40 -1
  149. package/src/modules/cpq/api/quotes/[quoteId]/status/__tests__/route.test.ts +74 -0
  150. package/src/modules/cpq/api/quotes/[quoteId]/status/route.ts +37 -1
  151. package/src/modules/cpq/api/quotes/price/__tests__/route.test.ts +37 -0
  152. package/src/modules/cpq/api/quotes/price/route.ts +28 -2
  153. package/src/modules/cpq/backend/cpq/inventory/page.meta.ts +1 -1
  154. package/src/modules/cpq/backend/cpq/inventory/subscriptions/[id]/page.tsx +32 -10
  155. package/src/modules/cpq/backend/cpq/orders/[id]/page.tsx +60 -269
  156. package/src/modules/cpq/backend/cpq/orders/page.meta.ts +1 -1
  157. package/src/modules/cpq/backend/cpq/quotes/[id]/_components/PriceAdjustmentDialog.tsx +260 -0
  158. package/src/modules/cpq/backend/cpq/quotes/[id]/_components/PriceAdjustmentsPanel.tsx +124 -0
  159. package/src/modules/cpq/backend/cpq/quotes/[id]/_components/__tests__/PriceAdjustmentsPanel.test.tsx +76 -0
  160. package/src/modules/cpq/backend/cpq/quotes/[id]/_components/arcLineRemoval.tsx +76 -0
  161. package/src/modules/cpq/backend/cpq/quotes/[id]/_components/priceAdjustmentContext.tsx +133 -0
  162. package/src/modules/cpq/backend/cpq/quotes/[id]/_components/usePriceAdjustments.tsx +165 -0
  163. package/src/modules/cpq/backend/cpq/quotes/[id]/page.tsx +174 -263
  164. package/src/modules/cpq/backend/cpq/quotes/page.meta.ts +1 -1
  165. package/src/modules/cpq/ce.ts +8 -0
  166. package/src/modules/cpq/cli.ts +48 -1
  167. package/src/modules/cpq/commands/__tests__/price-adjustments.test.ts +54 -0
  168. package/src/modules/cpq/commands/price-adjustments.ts +90 -0
  169. package/src/modules/cpq/components/ArcLineDiff.tsx +87 -0
  170. package/src/modules/cpq/components/ChargeBreakdownTable.tsx +201 -0
  171. package/src/modules/cpq/components/PriceWaterfall.tsx +94 -0
  172. package/src/modules/cpq/components/PricingSummaryCard.tsx +128 -0
  173. package/src/modules/cpq/components/__tests__/PriceWaterfall.test.tsx +38 -0
  174. package/src/modules/cpq/components/useGrantedFeatures.ts +35 -0
  175. package/src/modules/cpq/data/__tests__/price-adjustment-migration.test.ts +11 -0
  176. package/src/modules/cpq/data/__tests__/price-adjustments.test.ts +26 -0
  177. package/src/modules/cpq/data/entities.ts +83 -0
  178. package/src/modules/cpq/data/price-adjustments.ts +67 -0
  179. package/src/modules/cpq/data/validators.ts +3 -0
  180. package/src/modules/cpq/di.ts +6 -0
  181. package/src/modules/cpq/events.ts +53 -2
  182. package/src/modules/cpq/index.ts +1 -1
  183. package/src/modules/cpq/lib/__tests__/auditActor.test.ts +12 -0
  184. package/src/modules/cpq/lib/__tests__/priceAdjustmentDefaults.test.ts +37 -0
  185. package/src/modules/cpq/lib/__tests__/priceAdjustmentView.test.ts +152 -0
  186. package/src/modules/cpq/lib/__tests__/quotePermissions.test.ts +30 -0
  187. package/src/modules/cpq/lib/__tests__/quoteSummaryView.test.ts +56 -0
  188. package/src/modules/cpq/lib/auditActor.ts +13 -0
  189. package/src/modules/cpq/lib/formatMoney.ts +4 -0
  190. package/src/modules/cpq/lib/priceAdjustmentDefaults.ts +36 -0
  191. package/src/modules/cpq/lib/priceAdjustmentView.ts +259 -0
  192. package/src/modules/cpq/lib/quotePermissions.ts +22 -0
  193. package/src/modules/cpq/lib/quoteSummaryView.ts +51 -0
  194. package/src/modules/cpq/migrations/.snapshot-open-mercato.json +3298 -2423
  195. package/src/modules/cpq/migrations/Migration20261110213052.ts +22 -0
  196. package/src/modules/cpq/services/__tests__/_helpers/mockEm.ts +9 -2
  197. package/src/modules/cpq/services/__tests__/adjustmentService.test.ts +183 -0
  198. package/src/modules/cpq/services/__tests__/arcLineRemoval.test.ts +109 -0
  199. package/src/modules/cpq/services/__tests__/arcPriceFreeze.test.ts +141 -0
  200. package/src/modules/cpq/services/__tests__/chargeWaterfall.test.ts +28 -0
  201. package/src/modules/cpq/services/__tests__/cpqOrderService.test.ts +35 -2
  202. package/src/modules/cpq/services/__tests__/cpqPricingService.test.ts +57 -0
  203. package/src/modules/cpq/services/__tests__/cpqQuotingService.arc.test.ts +237 -0
  204. package/src/modules/cpq/services/__tests__/cpqQuotingService.test.ts +58 -3
  205. package/src/modules/cpq/services/__tests__/orderPricingSummary.test.ts +50 -0
  206. package/src/modules/cpq/services/__tests__/pricingSnapshot.test.ts +62 -0
  207. package/src/modules/cpq/services/__tests__/quoteAdjustmentLifecycle.test.ts +35 -0
  208. package/src/modules/cpq/services/__tests__/quoteAdjustmentPricing.test.ts +65 -0
  209. package/src/modules/cpq/services/__tests__/quoteCloneAdjustments.test.ts +45 -0
  210. package/src/modules/cpq/services/__tests__/quoteDetachTargetAdjustments.test.ts +54 -0
  211. package/src/modules/cpq/services/__tests__/quoteEventsService.test.ts +72 -0
  212. package/src/modules/cpq/services/__tests__/quotePricingEvents.test.ts +126 -0
  213. package/src/modules/cpq/services/__tests__/quotePricingIsolation.test.ts +52 -0
  214. package/src/modules/cpq/services/__tests__/quotePricingWrite.test.ts +74 -0
  215. package/src/modules/cpq/services/__tests__/resolveManualAdjustments.test.ts +90 -0
  216. package/src/modules/cpq/services/__tests__/storedAdjustmentFailure.test.ts +9 -0
  217. package/src/modules/cpq/services/arcLineRemoval.ts +87 -0
  218. package/src/modules/cpq/services/arcPriceFreeze.ts +165 -0
  219. package/src/modules/cpq/services/cpqOrderService.ts +22 -28
  220. package/src/modules/cpq/services/cpqPricingService.ts +8 -0
  221. package/src/modules/cpq/services/cpqQuotingService.ts +374 -125
  222. package/src/modules/cpq/services/orderPricingSummary.ts +47 -0
  223. package/src/modules/cpq/services/priceAdjustments/adjustmentService.ts +249 -0
  224. package/src/modules/cpq/services/priceAdjustments/chargeWaterfall.ts +28 -0
  225. package/src/modules/cpq/services/priceAdjustments/loadQuoteAdjustments.ts +25 -0
  226. package/src/modules/cpq/services/priceAdjustments/pricingSnapshot.ts +86 -0
  227. package/src/modules/cpq/services/priceAdjustments/quoteAdjustmentLifecycle.ts +68 -0
  228. package/src/modules/cpq/services/priceAdjustments/quotePricingEvents.ts +94 -0
  229. package/src/modules/cpq/services/priceAdjustments/quotePricingWrite.ts +51 -0
  230. package/src/modules/cpq/services/priceAdjustments/resolveManualAdjustments.ts +116 -0
  231. package/src/modules/cpq/services/priceAdjustments/storedAdjustmentFailure.ts +31 -0
  232. package/src/modules/cpq/services/types.ts +34 -1
  233. package/src/modules/cpq/setup.ts +7 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/cpq/data/price-adjustments.ts"],
4
+ "sourcesContent": ["import { z } from 'zod'\n\nexport const adjustmentTypeSchema = z.enum(['discount_percent', 'discount_absolute', 'price_override'])\nconst adjustmentFields = {\n adjustmentType: adjustmentTypeSchema,\n // Match numeric(18,4), so saving never silently rounds the previewed input.\n value: z.number().finite().min(0).max(99_999_999_999_999).multipleOf(0.0001),\n currencyCode: z.string().regex(/^[A-Z]{3}$/).nullish(),\n chargeTypeFilter: z.enum(['nrc', 'mrc']).nullish(),\n reasonCode: z.string().trim().min(1).max(100),\n reasonNote: z.string().trim().max(500).nullish(),\n expectedRevision: z.number().int().min(0).optional(),\n}\nexport const cpqPriceAdjustmentInputSchema = z.object({\n ...adjustmentFields,\n level: z.enum(['charge', 'line']),\n quoteLineId: z.string().uuid(),\n chargeCode: z.string().trim().min(1).max(255).nullish(),\n windowKind: z.literal('relative').optional(),\n fromMonth: z.literal(1).optional(),\n toMonth: z.null().optional(),\n}).strict().superRefine((input, ctx) => {\n const error = (path: string, message: string) => ctx.addIssue({ code: 'custom', path: [path], message })\n if (input.level === 'charge' && !input.chargeCode) error('chargeCode', 'TARGET_NOT_FOUND')\n if (input.level === 'charge' && input.chargeTypeFilter) error('chargeTypeFilter', 'TYPE_NOT_ALLOWED')\n if (input.level === 'line' && input.chargeCode) error('chargeCode', 'TYPE_NOT_ALLOWED')\n if (input.level === 'line' && input.adjustmentType !== 'discount_percent') error('adjustmentType', 'TYPE_NOT_ALLOWED')\n if (input.adjustmentType === 'discount_percent' && (input.value <= 0 || input.value > 100)) error('value', 'INVALID_PERCENT')\n if (input.adjustmentType === 'discount_absolute' && input.value <= 0) error('value', 'INVALID_AMOUNT')\n if (input.adjustmentType !== 'discount_percent' && !input.currencyCode) error('currencyCode', 'CURRENCY_REQUIRED')\n if (input.reasonCode === 'other' && !input.reasonNote) error('reasonNote', 'REASON_NOTE_REQUIRED')\n})\nexport const cpqPriceAdjustmentPatchSchema = z.object(adjustmentFields).partial().strict()\nexport type PriceAdjustmentInput = z.infer<typeof cpqPriceAdjustmentInputSchema>\nexport type PriceAdjustmentPatch = z.infer<typeof cpqPriceAdjustmentPatchSchema>\n\n/** Pure pricing representation; persistence metadata stays outside the resolver. */\nexport const resolvedPriceAdjustmentSchema = z.object({\n ...cpqPriceAdjustmentInputSchema.shape,\n id: z.string().uuid(),\n createdByUserId: z.string().uuid().optional(),\n})\nexport type PriceAdjustment = z.infer<typeof resolvedPriceAdjustmentSchema>\nexport const adjustmentErrorSchema = z.object({\n adjustmentId: z.string(),\n quoteLineId: z.string(),\n chargeCode: z.string().optional(),\n code: z.enum(['ADJUSTMENT_TARGET_MISSING', 'TARGET_AMBIGUOUS', 'ABOVE_STANDARD', 'CURRENCY_MISMATCH', 'TYPE_NOT_ALLOWED', 'LINE_NOT_ELIGIBLE', 'ADJUSTMENT_OVERLAP']),\n})\nexport type AdjustmentError = z.infer<typeof adjustmentErrorSchema>\n\nexport const cpqPriceAdjustmentPreviewSchema = z.object({\n draft: cpqPriceAdjustmentInputSchema,\n replaceAdjustmentId: z.string().uuid().optional(),\n}).strict()\n\nexport const ADJUSTMENT_TOGGLE = 'cpq.manual_price_adjustments'\nexport const REASON_DICTIONARY = 'cpq.price_adjustment_reason'\nexport const DEFAULT_ADJUSTMENT_REASONS = [\n { value: 'competitive_match', label: 'Competitive match' },\n { value: 'volume_commitment', label: 'Volume commitment' },\n { value: 'loyalty', label: 'Loyalty' },\n { value: 'promotion', label: 'Promotion' },\n { value: 'strategic_deal', label: 'Strategic deal' },\n { value: 'price_correction', label: 'Price correction' },\n { value: 'other', label: 'Other' },\n] as const\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -278,6 +278,7 @@ const cpqPricePreviewItemSchema = z.object({
278
278
  { message: "One of offeringId or productId is required" }
279
279
  );
280
280
  const cpqPricePreviewSchema = z.object({
281
+ includeWaterfall: z.boolean().optional().default(false),
281
282
  primaryItem: cpqPricePreviewItemSchema.nullish(),
282
283
  childItems: z.array(cpqPricePreviewItemSchema),
283
284
  currencyCode: z.string().min(1).optional()
@@ -541,6 +542,7 @@ const cpqConvertQuoteToOrderSchema = z.object({
541
542
  const cpqOrderStatusTransitionSchema = z.object({
542
543
  targetStatus: z.string().min(1)
543
544
  });
545
+ import { cpqPriceAdjustmentInputSchema, cpqPriceAdjustmentPatchSchema } from "./price-adjustments.js";
544
546
  export {
545
547
  cpqAddQuoteItemSchema,
546
548
  cpqArcQuoteTypeEnum,
@@ -566,6 +568,8 @@ export {
566
568
  cpqOfferingComponentCreateSchema,
567
569
  cpqOfferingComponentUpdateSchema,
568
570
  cpqOrderStatusTransitionSchema,
571
+ cpqPriceAdjustmentInputSchema,
572
+ cpqPriceAdjustmentPatchSchema,
569
573
  cpqPricePreviewSchema,
570
574
  cpqPriceRuleCreateSchema,
571
575
  cpqPriceRuleUpdateSchema,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/cpq/data/validators.ts"],
4
- "sourcesContent": ["import { z } from 'zod'\nimport { normalizeChargePricing } from './charge-pricing'\n\n// \u2500\u2500\u2500 Product Specification \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\nexport const cpqProductSpecificationCreateSchema = z.object({\n productId: z.string().uuid().optional(),\n code: z.string().min(1),\n name: z.string().min(1),\n description: z.string().nullish(),\n specType: z.enum(['simple', 'bundle']).optional().default('simple'),\n isAssetizable: z.boolean().optional().default(false),\n // `retired` was merged into `deprecated` \u2014 see migration\n // `<timestamp>-merge-spec-retired-into-deprecated.ts`. Offerings still have\n // four states because the user-facing semantics there are different\n // (a retired offering can't be re-sold; a deprecated one can but is\n // discouraged).\n lifecycleStatus: z.enum(['draft', 'active', 'deprecated']).optional().default('draft'),\n version: z.number().int().optional().default(1),\n effectiveFrom: z.string().datetime().nullish(),\n effectiveTo: z.string().datetime().nullish(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n isActive: z.boolean().optional().default(true),\n})\n\nexport const cpqProductSpecificationUpdateSchema = cpqProductSpecificationCreateSchema.partial().extend({\n id: z.string().uuid(),\n})\n\n// \u2500\u2500\u2500 Product Offering \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\nexport const cpqProductOfferingCreateSchema = z.object({\n specId: z.string().uuid(),\n catalogOfferId: z.string().uuid().nullish(),\n code: z.string().min(1),\n name: z.string().min(1),\n description: z.string().nullish(),\n offeringType: z.enum(['simple', 'bundle']).optional().default('simple'),\n designTimeValues: z.record(z.string(), z.unknown()).optional().default({}),\n // `retired` was merged into `deprecated` \u2014 see migration\n // `<timestamp>-merge-offering-retired-into-deprecated.ts`. Aligned with\n // specifications: a single 3-state lifecycle keeps the UX uniform.\n lifecycleStatus: z.enum(['draft', 'active', 'deprecated']).optional().default('draft'),\n effectiveFrom: z.string().datetime().nullish(),\n effectiveTo: z.string().datetime().nullish(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n isActive: z.boolean().optional().default(true),\n})\n\nexport const cpqProductOfferingUpdateSchema = cpqProductOfferingCreateSchema.partial().extend({\n id: z.string().uuid(),\n})\n\n// \u2500\u2500\u2500 Bundle Slot \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\u2500\n\nexport const cpqBundleSlotCreateSchema = z.object({\n specId: z.string().uuid(),\n targetSpecId: z.string().uuid(),\n componentGroup: z.string().min(1),\n name: z.string().min(1),\n description: z.string().nullish(),\n cardinalityMin: z.number().int().min(0).optional().default(0),\n cardinalityMax: z.number().int().min(0).nullish(),\n sortOrder: z.number().int().optional().default(0),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n})\n\nexport const cpqBundleSlotUpdateSchema = z.object({\n id: z.string().uuid(),\n componentGroup: z.string().min(1).optional(),\n name: z.string().min(1).optional(),\n description: z.string().nullish(),\n cardinalityMin: z.number().int().min(0).optional(),\n cardinalityMax: z.number().int().min(0).nullish(),\n sortOrder: z.number().int().optional(),\n isActive: z.boolean().optional(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n})\n\n// \u2500\u2500\u2500 Offering Component \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\nexport const cpqOfferingComponentCreateSchema = z.object({\n offeringId: z.string().uuid(),\n slotId: z.string().uuid(),\n childOfferingId: z.string().uuid(),\n isDefault: z.boolean().optional().default(false),\n sortOrder: z.number().int().optional().default(0),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n})\n\nexport const cpqOfferingComponentUpdateSchema = z.object({\n id: z.string().uuid(),\n isDefault: z.boolean().optional(),\n sortOrder: z.number().int().optional(),\n isActive: z.boolean().optional(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n})\n\n// \u2500\u2500\u2500 Product Relationship \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\nexport const cpqProductRelationshipCreateSchema = z.object({\n sourceSpecId: z.string().uuid(),\n targetSpecId: z.string().uuid(),\n relationshipType: z.enum(['parent_child', 'requires', 'excludes']),\n cardinalityMin: z.number().int().optional().default(0),\n cardinalityMax: z.number().int().nullish(),\n condition: z.record(z.string(), z.unknown()).nullish(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n isActive: z.boolean().optional().default(true),\n})\n\nexport const cpqProductRelationshipUpdateSchema = cpqProductRelationshipCreateSchema.partial().extend({\n id: z.string().uuid(),\n})\n\n// \u2500\u2500\u2500 Product Attribute \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\nexport const cpqProductAttributeCreateSchema = z.object({\n productId: z.string().uuid().optional(),\n specId: z.string().uuid().nullish(),\n code: z.string().min(1),\n name: z.string().min(1),\n attributeType: z.enum(['enum', 'number', 'text', 'boolean', 'select', 'multi-select', 'reference']),\n resolutionTime: z.enum(['design_time', 'run_time']).optional().default('run_time'),\n options: z.array(z.object({ value: z.string(), label: z.string() })).nullish(),\n constraints: z.record(z.string(), z.unknown()).nullish(),\n referenceEntity: z.string().nullish(),\n referenceFilter: z.record(z.string(), z.unknown()).nullish(),\n dependsOn: z.record(z.string(), z.unknown()).nullish(),\n defaultValue: z.unknown().nullish(),\n helpText: z.string().nullish(),\n sortOrder: z.number().int().optional().default(0),\n isRequired: z.boolean().optional().default(true),\n isActive: z.boolean().optional().default(true),\n})\n\nexport const cpqProductAttributeUpdateSchema = cpqProductAttributeCreateSchema.partial().extend({\n id: z.string().uuid(),\n})\n\n// `fixed` is a legacy alias for `flat` \u2014 older seeds (`demo_puffin`,\n// `demo_gix`) emit it directly and ~30+ rows in prod use it. The pricing\n// service treats them identically (fixedPrice + currencyCode, no table\n// lookup). XD-297 splits the charge \"shape\" into two axes \u2014 chargeModel\n// (flat | per_unit | volume | tiered) and pricingMethod (fixed | table).\n// Input accepts either the new split OR a legacy combined pricingMethod\n// (flat | per_unit | tiered); normalizeChargePricing() collapses both to a\n// canonical {model, source} that the route persists.\nconst cpqChargeModelEnum = z.enum(['flat', 'per_unit', 'volume', 'tiered'])\n// New sources (fixed | table) plus the legacy combined values for back-compat.\nconst cpqChargePricingMethodEnum = z.enum(['fixed', 'table', 'flat', 'tiered', 'per_unit'])\n\nconst requireField = (\n ctx: z.RefinementCtx,\n value: unknown,\n path: string,\n msg: string,\n) => {\n if (value === undefined || value === null || value === '') {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [path], message: msg })\n }\n}\n\nconst forbidField = (\n ctx: z.RefinementCtx,\n value: unknown,\n path: string,\n msg: string,\n) => {\n if (value !== undefined && value !== null && value !== '') {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [path], message: msg })\n }\n}\n\n// Shared shape between create/update so the refinement logic stays in one\n// place. Update is `.partial()` so its refinement runs only when fields\n// are present.\nconst cpqProductChargeBase = z.object({\n productId: z.string().uuid().optional(),\n offeringId: z.string().uuid().nullish(),\n code: z.string().min(1),\n name: z.string().min(1),\n description: z.string().nullish(),\n chargeType: z.enum(['nrc', 'mrc', 'usage']),\n chargeModel: cpqChargeModelEnum.optional(),\n pricingMethod: cpqChargePricingMethodEnum,\n pricingTableId: z.string().uuid().nullish(),\n priceColumnKey: z.string().nullish(),\n fixedPrice: z.union([z.string(), z.number().transform(String)]).nullish(),\n currencyCode: z.string().nullish(),\n quantityAttributeCode: z.string().nullish(),\n applicabilityCondition: z.record(z.string(), z.unknown()).nullish(),\n sortOrder: z.number().int().optional().default(0),\n isActive: z.boolean().optional().default(true),\n})\n\n// V-CHG-1: the (chargeModel \u00D7 pricingMethod) combination must match the fields.\n// fixed \u2192 fixedPrice + currencyCode required; table fields forbidden.\n// flat: no quantity attr; per_unit: quantity attr required.\n// volume / tiered + fixed is not a valid combination.\n// table \u2192 pricingTableId + priceColumnKey required; fixedPrice forbidden.\n// flat: no quantity attr; per_unit / volume / tiered: quantity attr required.\nconst refineChargePricingShape = (\n ctx: z.RefinementCtx,\n charge: {\n chargeModel?: 'flat' | 'per_unit' | 'volume' | 'tiered'\n pricingMethod?: 'fixed' | 'table' | 'flat' | 'tiered' | 'per_unit'\n pricingTableId?: string | null\n priceColumnKey?: string | null\n fixedPrice?: string | null\n currencyCode?: string | null\n quantityAttributeCode?: string | null\n },\n) => {\n if (charge.pricingMethod === undefined && charge.chargeModel === undefined) return\n const { model, source } = normalizeChargePricing(charge)\n\n if (source === 'fixed') {\n if (model === 'volume' || model === 'tiered') {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['pricingMethod'],\n message: `V-CHG-1: ${model} pricing requires Table Lookup, not a fixed price`,\n })\n return\n }\n requireField(ctx, charge.fixedPrice, 'fixedPrice', 'V-CHG-1: fixedPrice is required for a fixed price')\n requireField(ctx, charge.currencyCode, 'currencyCode', 'V-CHG-1: currencyCode is required for a fixed price')\n forbidField(ctx, charge.pricingTableId, 'pricingTableId', 'V-CHG-1: pricingTableId must be empty for a fixed price')\n forbidField(ctx, charge.priceColumnKey, 'priceColumnKey', 'V-CHG-1: priceColumnKey must be empty for a fixed price')\n if (model === 'per_unit') {\n requireField(ctx, charge.quantityAttributeCode, 'quantityAttributeCode', 'V-CHG-1: quantityAttributeCode is required for per-unit pricing')\n } else {\n forbidField(ctx, charge.quantityAttributeCode, 'quantityAttributeCode', 'V-CHG-1: quantityAttributeCode must be empty for a flat fixed price')\n }\n return\n }\n\n // source === 'table'\n requireField(ctx, charge.pricingTableId, 'pricingTableId', 'V-CHG-1: pricingTableId is required for table lookup')\n requireField(ctx, charge.priceColumnKey, 'priceColumnKey', 'V-CHG-1: priceColumnKey is required for table lookup')\n forbidField(ctx, charge.fixedPrice, 'fixedPrice', 'V-CHG-1: fixedPrice must be empty for table lookup \u2014 price comes from the table')\n if (model === 'flat') {\n forbidField(ctx, charge.quantityAttributeCode, 'quantityAttributeCode', 'V-CHG-1: quantityAttributeCode must be empty for a flat table price')\n } else {\n requireField(ctx, charge.quantityAttributeCode, 'quantityAttributeCode', `V-CHG-1: quantityAttributeCode is required for ${model} pricing`)\n }\n}\n\nexport const cpqProductChargeCreateSchema = cpqProductChargeBase.superRefine((data, ctx) => {\n refineChargePricingShape(ctx, data)\n})\n\nexport const cpqProductChargeUpdateSchema = cpqProductChargeBase.partial().extend({\n id: z.string().uuid(),\n}).superRefine((data, ctx) => {\n // Enforce shape whenever either pricing axis is being changed \u2014 a\n // chargeModel-only PATCH (e.g. flat \u2192 per_unit) still alters the required\n // fields, so it must validate rather than silently persist a broken charge.\n if (data.pricingMethod !== undefined || data.chargeModel !== undefined) {\n refineChargePricingShape(ctx, data)\n }\n})\n\n// \u2500\u2500\u2500 Price Rule \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\u2500\u2500\n\nexport const cpqPriceRuleCreateSchema = z.object({\n code: z.string().min(1),\n name: z.string().min(1),\n description: z.string().nullish(),\n productOfferingId: z.string().uuid().nullish(),\n ruleType: z.enum(['discount_percent', 'discount_absolute', 'surcharge_percent', 'surcharge_absolute', 'price_override']),\n value: z.number().min(0),\n chargeCodeFilter: z.string().nullish(),\n chargeTypeFilter: z.enum(['nrc', 'mrc', 'usage']).nullish(),\n applicabilityCondition: z.record(z.string(), z.unknown()).nullish(),\n sortOrder: z.number().int().optional().default(0),\n isActive: z.boolean().optional().default(true),\n})\n\nexport const cpqPriceRuleUpdateSchema = cpqPriceRuleCreateSchema.partial().extend({\n id: z.string().uuid(),\n})\n\n// \u2500\u2500\u2500 Pricing Table \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\n// V-PT-1: every dimension / price column needs a non-empty key + label,\n// and keys must be unique within their list (charges reference them by\n// key \u2014 duplicates would make lookup ambiguous).\nconst keyLabelItem = z.object({\n key: z.string().min(1, 'Key is required'),\n label: z.string().min(1, 'Label is required'),\n})\n\nconst uniqueKeys = (label: string) =>\n (items: Array<{ key: string }>, ctx: z.RefinementCtx) => {\n const seen = new Set<string>()\n items.forEach((item, idx) => {\n if (seen.has(item.key)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [idx, 'key'],\n message: `V-PT-1: duplicate ${label} key \"${item.key}\"`,\n })\n }\n seen.add(item.key)\n })\n }\n\nexport const cpqPricingTableCreateSchema = z.object({\n code: z.string().min(1),\n name: z.string().min(1),\n dimensions: z.array(keyLabelItem).superRefine(uniqueKeys('dimension')),\n priceColumns: z.array(keyLabelItem).superRefine(uniqueKeys('price column')),\n currencyCodeList: z.array(z.string().min(1)).min(1),\n isActive: z.boolean().optional().default(true),\n})\n\nexport const cpqPricingTableUpdateSchema = cpqPricingTableCreateSchema.partial().extend({\n id: z.string().uuid(),\n})\n\nexport const cpqPricingTableEntryCreateSchema = z.object({\n pricingTableId: z.string().uuid(),\n dimensionValues: z.record(z.string(), z.string()),\n tierNumber: z.number().int().nullish(),\n rangeFrom: z.number().nullish(),\n rangeTo: z.number().nullish(),\n currencyCode: z.string().min(1).optional().default('USD'),\n prices: z.record(z.string(), z.number()),\n isActive: z.boolean().optional().default(true),\n})\n\nexport const cpqPricingTableEntryUpdateSchema = cpqPricingTableEntryCreateSchema.partial().extend({\n id: z.string().uuid(),\n})\n\n// \u2500\u2500\u2500 Quoting v2 \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\u2500\n\nexport const cpqQuoteTypeEnum = z.enum(['new', 'amend', 'renew', 'cancel'])\nexport const cpqArcQuoteTypeEnum = z.enum(['amend', 'renew', 'cancel'])\nexport const cpqMergeActionEnum = z.enum(['standalone', 'absorb'])\nexport const cpqArcReasonCodeEnum = z.enum([\n 'upgrade',\n 'downgrade',\n 'config-change',\n 'price-adjustment',\n 'term-extension',\n 'term-reduction',\n 'consolidation',\n 'customer-request',\n 'non-payment',\n 'contract-breach',\n 'other',\n])\n\nexport const cpqCreateQuoteSchema = z.object({\n customerId: z.string().uuid(),\n quoteId: z.string().uuid().optional(), // Link to existing SalesQuote\n dealId: z.string().uuid().optional(),\n currencyCode: z.string().min(1).optional(),\n quoteType: cpqQuoteTypeEnum.optional().default('new'),\n})\n\n// Server enforces the one-way rule (new \u2192 amend|renew|cancel only) in the\n// service layer; the schema just shapes the body.\nexport const cpqUpdateQuoteSchema = z.object({\n quoteType: cpqQuoteTypeEnum.optional(),\n})\n\nconst cpqPricePreviewItemSchema = z.object({\n offeringId: z.string().uuid().nullish(),\n productId: z.string().uuid().nullish(),\n configuration: z.record(z.string(), z.unknown()),\n}).refine(\n (item) => item.offeringId || item.productId,\n { message: 'One of offeringId or productId is required' },\n)\n\nexport const cpqPricePreviewSchema = z.object({\n primaryItem: cpqPricePreviewItemSchema.nullish(),\n childItems: z.array(cpqPricePreviewItemSchema),\n currencyCode: z.string().min(1).optional(),\n})\n\nexport const cpqAddQuoteItemSchema = z.object({\n offeringId: z.string().uuid().optional(),\n productId: z.string().uuid().optional(),\n configuration: z.record(z.string(), z.unknown()).default({}),\n quantity: z.number().int().min(1).optional().default(1),\n usageEstimates: z\n .array(\n z.object({\n chargeCode: z.string().min(1),\n estimatedQuantity: z.number().min(0),\n }),\n )\n .optional(),\n action: z.enum(['add', 'modify', 'cancel']).optional().default('add'),\n parentLineId: z.string().uuid().optional(),\n startDate: z.string().optional(),\n termMonths: z.number().int().min(1).optional(),\n endDate: z.string().optional(),\n // ARC (XD-250): per-line target sub for amend / renew (standalone) / cancel.\n targetSubscriptionId: z.string().uuid().nullish(),\n // ARC (XD-250): existing item being changed by cancel/modify lines.\n sourceSubscriptionItemId: z.string().uuid().nullish(),\n})\n\nexport const cpqUpdateQuoteItemSchema = z.object({\n configuration: z.record(z.string(), z.unknown()),\n quantity: z.number().int().min(1).optional(),\n usageEstimates: z\n .array(\n z.object({\n chargeCode: z.string().min(1),\n estimatedQuantity: z.number().min(0),\n }),\n )\n .optional(),\n startDate: z.string().optional(),\n termMonths: z.number().int().min(1).optional(),\n endDate: z.string().optional(),\n targetSubscriptionId: z.string().uuid().nullish(),\n sourceSubscriptionItemId: z.string().uuid().nullish(),\n})\n\n// \u2500\u2500\u2500 ARC (Amend / Renew / Cancel) \u2014 XD-250 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const cpqCreateQuoteFromSubscriptionSchema = z.object({\n subscriptionId: z.string().uuid(),\n type: cpqArcQuoteTypeEnum,\n renewTerm: z\n .object({\n newTermStart: z.string().min(1),\n newTermEnd: z.string().min(1),\n newTermMonths: z.number().int().min(1).optional(),\n })\n .optional(),\n})\n\nexport const cpqAttachTargetSubscriptionSchema = z.object({\n subscriptionId: z.string().uuid(),\n quoteType: cpqArcQuoteTypeEnum,\n mergeAction: cpqMergeActionEnum.optional(),\n newTermStart: z.string().min(1).optional(),\n newTermEnd: z.string().min(1).optional(),\n newTermMonths: z.number().int().min(1).optional(),\n})\n\nexport const cpqUpdateTargetSubscriptionSchema = z.object({\n mergeAction: cpqMergeActionEnum.optional(),\n newTermStart: z.string().min(1).nullish(),\n newTermEnd: z.string().min(1).nullish(),\n newTermMonths: z.number().int().min(1).nullish(),\n})\n\nexport const cpqCancelMetaSchema = z.object({\n reasonCode: cpqArcReasonCodeEnum,\n reasonText: z.string().nullish(),\n etfAmount: z\n .union([z.string(), z.number().transform(String)])\n .nullish(),\n etfCurrency: z.string().min(1).max(3).nullish(),\n})\n\nexport const cpqMergeMetaSchema = z.object({\n newTermStart: z.string().min(1),\n newTermEnd: z.string().min(1),\n newTermMonths: z.number().int().min(1).optional(),\n newSubCode: z.string().min(1).nullish(),\n newSubName: z.string().min(1).nullish(),\n})\n\nexport const cpqExpiringSubscriptionsQuerySchema = z.object({\n withinDays: z.coerce.number().int().min(1).max(365).optional().default(30),\n customerId: z.string().uuid().optional(),\n billingCycle: z.enum(['monthly', 'quarterly', 'annually']).optional(),\n status: z.string().optional().default('active'),\n page: z.coerce.number().int().min(1).optional().default(1),\n pageSize: z.coerce.number().int().min(1).max(100).optional().default(50),\n})\n\nexport const cpqChangeLogQuerySchema = z.object({\n page: z.coerce.number().int().min(1).optional().default(1),\n pageSize: z.coerce.number().int().min(1).max(100).optional().default(50),\n})\n\nexport const cpqRecalculateSchema = z.object({\n save: z.boolean(),\n})\n\nexport const cpqTransitionStatusSchema = z.object({\n targetStatus: z.string().min(1),\n})\n\nexport const cpqValidateRelationshipsSchema = z.object({\n offeringIds: z.array(z.string().uuid()),\n parentChildPairs: z\n .array(\n z.object({\n parentOfferingId: z.string().uuid(),\n childOfferingId: z.string().uuid(),\n }),\n )\n .optional()\n})\n\n// \u2500\u2500\u2500 Wizard \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\u2500\u2500\u2500\u2500\u2500\n\nconst wizardTransitionConditionSchema = z.object({\n field: z.string().min(1),\n operator: z.enum(['eq', 'neq', 'gt', 'lt', 'gte', 'lte', 'exists', 'not_exists', 'in']),\n value: z.unknown().optional(),\n})\n\nconst wizardTransitionSchema = z.object({\n targetStepId: z.string().min(1),\n condition: wizardTransitionConditionSchema.optional(),\n isDefault: z.boolean().optional(),\n label: z.string().optional(),\n})\n\nconst wizardStepValidationSchema = z.object({\n field: z.string().min(1),\n operator: z.enum(['eq', 'neq', 'exists', 'not_exists']),\n value: z.unknown().optional(),\n message: z.string().min(1),\n})\n\nconst wizardStepDefinitionSchema = z.object({\n stepId: z.string().min(1),\n type: z.string().min(1),\n title: z.string().min(1),\n description: z.string().nullish(),\n config: z.record(z.string(), z.unknown()).default({}),\n transitions: z.array(wizardTransitionSchema).default([]),\n isOptional: z.boolean().optional().default(false),\n validationRules: z.array(wizardStepValidationSchema).optional(),\n})\n\nconst wizardApplicabilitySchema = z.object({\n specCodes: z.array(z.string()).optional(),\n offeringCodes: z.array(z.string()).optional(),\n customerSegments: z.array(z.string()).optional(),\n surface: z.enum(['backend', 'portal']).optional(),\n priority: z.number().int().optional().default(0),\n})\n\nexport const cpqWizardDefinitionCreateSchema = z.object({\n code: z.string().min(1),\n name: z.string().min(1),\n description: z.string().nullish(),\n steps: z.array(wizardStepDefinitionSchema).min(1),\n applicability: wizardApplicabilitySchema.nullish(),\n paramsSchema: z.record(z.string(), z.unknown()).nullish(),\n surface: z.enum(['backend', 'portal', 'any']).optional().default('backend'),\n isActive: z.boolean().optional().default(true),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n})\n\nexport const cpqWizardDefinitionUpdateSchema = cpqWizardDefinitionCreateSchema.partial().extend({\n id: z.string().uuid(),\n})\n// \u2500\u2500\u2500 Inventory Subscription \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\nconst cpqInventorySubscriptionItemInputSchema = z.object({\n parentItemId: z.string().uuid().nullish(),\n productId: z.string().uuid().nullish(),\n offeringId: z.string().uuid().nullish(),\n specId: z.string().uuid().nullish(),\n name: z.string().min(1),\n configuration: z.record(z.string(), z.unknown()).optional().default({}),\n charges: z.array(z.record(z.string(), z.unknown())).nullish(),\n mrcAmount: z.number().optional().default(0),\n nrcAmount: z.number().optional().default(0),\n currencyCode: z.string().min(1).optional(),\n quantity: z.number().int().min(1).optional().default(1),\n capacityTotal: z.number().nullish(),\n capacityUnit: z.string().nullish(),\n sourceQuoteLineId: z.string().uuid().nullish(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n sortOrder: z.number().int().optional().default(0),\n})\n\nexport const cpqInventorySubscriptionCreateSchema = z.object({\n customerId: z.string().uuid(),\n code: z.string().min(1).optional(),\n name: z.string().min(1),\n description: z.string().nullish(),\n billingCycle: z.enum(['monthly', 'quarterly', 'annually']).optional().default('monthly'),\n currencyCode: z.string().min(1).optional(),\n startDate: z.string().nullish(),\n termMonths: z.number().int().min(1).nullish(),\n autoRenew: z.boolean().optional().default(true),\n sourceQuoteId: z.string().uuid().nullish(),\n sourceOrderId: z.string().uuid().nullish(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n items: z.array(cpqInventorySubscriptionItemInputSchema).min(1),\n})\n\nexport const cpqInventorySubscriptionUpdateSchema = z.object({\n id: z.string().uuid(),\n name: z.string().min(1).optional(),\n description: z.string().nullish(),\n billingCycle: z.enum(['monthly', 'quarterly', 'annually']).optional(),\n autoRenew: z.boolean().optional(),\n termMonths: z.number().int().min(1).nullish(),\n currentTermEnd: z.string().nullish(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n})\n\nexport const cpqInventoryStatusTransitionSchema = z.object({\n id: z.string().uuid(),\n targetStatus: z.string().min(1),\n})\n\n// \u2500\u2500\u2500 Inventory Subscription Item \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\nexport const cpqInventorySubscriptionItemCreateSchema = z.object({\n subscriptionId: z.string().uuid(),\n parentItemId: z.string().uuid().nullish(),\n productId: z.string().uuid().nullish(),\n offeringId: z.string().uuid().nullish(),\n specId: z.string().uuid().nullish(),\n name: z.string().min(1),\n configuration: z.record(z.string(), z.unknown()).optional().default({}),\n charges: z.array(z.record(z.string(), z.unknown())).nullish(),\n mrcAmount: z.number().optional().default(0),\n nrcAmount: z.number().optional().default(0),\n currencyCode: z.string().min(1).optional(),\n quantity: z.number().int().min(1).optional().default(1),\n capacityTotal: z.number().nullish(),\n capacityUnit: z.string().nullish(),\n sourceQuoteLineId: z.string().uuid().nullish(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n sortOrder: z.number().int().optional().default(0),\n})\n\nexport const cpqInventorySubscriptionItemUpdateSchema = z.object({\n id: z.string().uuid(),\n name: z.string().min(1).optional(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n capacityTotal: z.number().nullish(),\n capacityUsed: z.number().nullish(),\n capacityUnit: z.string().nullish(),\n sortOrder: z.number().int().optional(),\n})\n\n// \u2500\u2500\u2500 Inventory Asset \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\nexport const cpqInventoryAssetCreateSchema = z.object({\n customerId: z.string().uuid(),\n subscriptionId: z.string().uuid().nullish(),\n subscriptionItemId: z.string().uuid().nullish(),\n productId: z.string().uuid().nullish(),\n offeringId: z.string().uuid().nullish(),\n specId: z.string().uuid().nullish(),\n code: z.string().min(1).optional(),\n name: z.string().min(1),\n description: z.string().nullish(),\n assetType: z.enum(['one_time', 'license', 'physical', 'logical']).optional().default('one_time'),\n currencyCode: z.string().min(1).optional(),\n purchasePrice: z.number().optional().default(0),\n quantity: z.number().int().min(1).optional().default(1),\n purchaseDate: z.string().nullish(),\n deliveryDate: z.string().nullish(),\n configuration: z.record(z.string(), z.unknown()).optional().default({}),\n charges: z.array(z.record(z.string(), z.unknown())).nullish(),\n sourceQuoteId: z.string().uuid().nullish(),\n sourceOrderId: z.string().uuid().nullish(),\n sourceQuoteLineId: z.string().uuid().nullish(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n})\n\nexport const cpqInventoryAssetUpdateSchema = z.object({\n id: z.string().uuid(),\n name: z.string().min(1).optional(),\n description: z.string().nullish(),\n assetType: z.enum(['one_time', 'license', 'physical', 'logical']).optional(),\n deliveryDate: z.string().nullish(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n})\n\n// \u2500\u2500\u2500 CPQ Orders \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\u2500\u2500\n\nexport const cpqConvertQuoteToOrderSchema = z.object({\n quoteId: z.string().uuid(),\n})\n\nexport const cpqOrderStatusTransitionSchema = z.object({\n targetStatus: z.string().min(1),\n})\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { z } from 'zod'\nimport { normalizeChargePricing } from './charge-pricing'\n\n// \u2500\u2500\u2500 Product Specification \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\nexport const cpqProductSpecificationCreateSchema = z.object({\n productId: z.string().uuid().optional(),\n code: z.string().min(1),\n name: z.string().min(1),\n description: z.string().nullish(),\n specType: z.enum(['simple', 'bundle']).optional().default('simple'),\n isAssetizable: z.boolean().optional().default(false),\n // `retired` was merged into `deprecated` \u2014 see migration\n // `<timestamp>-merge-spec-retired-into-deprecated.ts`. Offerings still have\n // four states because the user-facing semantics there are different\n // (a retired offering can't be re-sold; a deprecated one can but is\n // discouraged).\n lifecycleStatus: z.enum(['draft', 'active', 'deprecated']).optional().default('draft'),\n version: z.number().int().optional().default(1),\n effectiveFrom: z.string().datetime().nullish(),\n effectiveTo: z.string().datetime().nullish(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n isActive: z.boolean().optional().default(true),\n})\n\nexport const cpqProductSpecificationUpdateSchema = cpqProductSpecificationCreateSchema.partial().extend({\n id: z.string().uuid(),\n})\n\n// \u2500\u2500\u2500 Product Offering \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\nexport const cpqProductOfferingCreateSchema = z.object({\n specId: z.string().uuid(),\n catalogOfferId: z.string().uuid().nullish(),\n code: z.string().min(1),\n name: z.string().min(1),\n description: z.string().nullish(),\n offeringType: z.enum(['simple', 'bundle']).optional().default('simple'),\n designTimeValues: z.record(z.string(), z.unknown()).optional().default({}),\n // `retired` was merged into `deprecated` \u2014 see migration\n // `<timestamp>-merge-offering-retired-into-deprecated.ts`. Aligned with\n // specifications: a single 3-state lifecycle keeps the UX uniform.\n lifecycleStatus: z.enum(['draft', 'active', 'deprecated']).optional().default('draft'),\n effectiveFrom: z.string().datetime().nullish(),\n effectiveTo: z.string().datetime().nullish(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n isActive: z.boolean().optional().default(true),\n})\n\nexport const cpqProductOfferingUpdateSchema = cpqProductOfferingCreateSchema.partial().extend({\n id: z.string().uuid(),\n})\n\n// \u2500\u2500\u2500 Bundle Slot \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\u2500\n\nexport const cpqBundleSlotCreateSchema = z.object({\n specId: z.string().uuid(),\n targetSpecId: z.string().uuid(),\n componentGroup: z.string().min(1),\n name: z.string().min(1),\n description: z.string().nullish(),\n cardinalityMin: z.number().int().min(0).optional().default(0),\n cardinalityMax: z.number().int().min(0).nullish(),\n sortOrder: z.number().int().optional().default(0),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n})\n\nexport const cpqBundleSlotUpdateSchema = z.object({\n id: z.string().uuid(),\n componentGroup: z.string().min(1).optional(),\n name: z.string().min(1).optional(),\n description: z.string().nullish(),\n cardinalityMin: z.number().int().min(0).optional(),\n cardinalityMax: z.number().int().min(0).nullish(),\n sortOrder: z.number().int().optional(),\n isActive: z.boolean().optional(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n})\n\n// \u2500\u2500\u2500 Offering Component \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\nexport const cpqOfferingComponentCreateSchema = z.object({\n offeringId: z.string().uuid(),\n slotId: z.string().uuid(),\n childOfferingId: z.string().uuid(),\n isDefault: z.boolean().optional().default(false),\n sortOrder: z.number().int().optional().default(0),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n})\n\nexport const cpqOfferingComponentUpdateSchema = z.object({\n id: z.string().uuid(),\n isDefault: z.boolean().optional(),\n sortOrder: z.number().int().optional(),\n isActive: z.boolean().optional(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n})\n\n// \u2500\u2500\u2500 Product Relationship \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\nexport const cpqProductRelationshipCreateSchema = z.object({\n sourceSpecId: z.string().uuid(),\n targetSpecId: z.string().uuid(),\n relationshipType: z.enum(['parent_child', 'requires', 'excludes']),\n cardinalityMin: z.number().int().optional().default(0),\n cardinalityMax: z.number().int().nullish(),\n condition: z.record(z.string(), z.unknown()).nullish(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n isActive: z.boolean().optional().default(true),\n})\n\nexport const cpqProductRelationshipUpdateSchema = cpqProductRelationshipCreateSchema.partial().extend({\n id: z.string().uuid(),\n})\n\n// \u2500\u2500\u2500 Product Attribute \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\nexport const cpqProductAttributeCreateSchema = z.object({\n productId: z.string().uuid().optional(),\n specId: z.string().uuid().nullish(),\n code: z.string().min(1),\n name: z.string().min(1),\n attributeType: z.enum(['enum', 'number', 'text', 'boolean', 'select', 'multi-select', 'reference']),\n resolutionTime: z.enum(['design_time', 'run_time']).optional().default('run_time'),\n options: z.array(z.object({ value: z.string(), label: z.string() })).nullish(),\n constraints: z.record(z.string(), z.unknown()).nullish(),\n referenceEntity: z.string().nullish(),\n referenceFilter: z.record(z.string(), z.unknown()).nullish(),\n dependsOn: z.record(z.string(), z.unknown()).nullish(),\n defaultValue: z.unknown().nullish(),\n helpText: z.string().nullish(),\n sortOrder: z.number().int().optional().default(0),\n isRequired: z.boolean().optional().default(true),\n isActive: z.boolean().optional().default(true),\n})\n\nexport const cpqProductAttributeUpdateSchema = cpqProductAttributeCreateSchema.partial().extend({\n id: z.string().uuid(),\n})\n\n// `fixed` is a legacy alias for `flat` \u2014 older seeds (`demo_puffin`,\n// `demo_gix`) emit it directly and ~30+ rows in prod use it. The pricing\n// service treats them identically (fixedPrice + currencyCode, no table\n// lookup). XD-297 splits the charge \"shape\" into two axes \u2014 chargeModel\n// (flat | per_unit | volume | tiered) and pricingMethod (fixed | table).\n// Input accepts either the new split OR a legacy combined pricingMethod\n// (flat | per_unit | tiered); normalizeChargePricing() collapses both to a\n// canonical {model, source} that the route persists.\nconst cpqChargeModelEnum = z.enum(['flat', 'per_unit', 'volume', 'tiered'])\n// New sources (fixed | table) plus the legacy combined values for back-compat.\nconst cpqChargePricingMethodEnum = z.enum(['fixed', 'table', 'flat', 'tiered', 'per_unit'])\n\nconst requireField = (\n ctx: z.RefinementCtx,\n value: unknown,\n path: string,\n msg: string,\n) => {\n if (value === undefined || value === null || value === '') {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [path], message: msg })\n }\n}\n\nconst forbidField = (\n ctx: z.RefinementCtx,\n value: unknown,\n path: string,\n msg: string,\n) => {\n if (value !== undefined && value !== null && value !== '') {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [path], message: msg })\n }\n}\n\n// Shared shape between create/update so the refinement logic stays in one\n// place. Update is `.partial()` so its refinement runs only when fields\n// are present.\nconst cpqProductChargeBase = z.object({\n productId: z.string().uuid().optional(),\n offeringId: z.string().uuid().nullish(),\n code: z.string().min(1),\n name: z.string().min(1),\n description: z.string().nullish(),\n chargeType: z.enum(['nrc', 'mrc', 'usage']),\n chargeModel: cpqChargeModelEnum.optional(),\n pricingMethod: cpqChargePricingMethodEnum,\n pricingTableId: z.string().uuid().nullish(),\n priceColumnKey: z.string().nullish(),\n fixedPrice: z.union([z.string(), z.number().transform(String)]).nullish(),\n currencyCode: z.string().nullish(),\n quantityAttributeCode: z.string().nullish(),\n applicabilityCondition: z.record(z.string(), z.unknown()).nullish(),\n sortOrder: z.number().int().optional().default(0),\n isActive: z.boolean().optional().default(true),\n})\n\n// V-CHG-1: the (chargeModel \u00D7 pricingMethod) combination must match the fields.\n// fixed \u2192 fixedPrice + currencyCode required; table fields forbidden.\n// flat: no quantity attr; per_unit: quantity attr required.\n// volume / tiered + fixed is not a valid combination.\n// table \u2192 pricingTableId + priceColumnKey required; fixedPrice forbidden.\n// flat: no quantity attr; per_unit / volume / tiered: quantity attr required.\nconst refineChargePricingShape = (\n ctx: z.RefinementCtx,\n charge: {\n chargeModel?: 'flat' | 'per_unit' | 'volume' | 'tiered'\n pricingMethod?: 'fixed' | 'table' | 'flat' | 'tiered' | 'per_unit'\n pricingTableId?: string | null\n priceColumnKey?: string | null\n fixedPrice?: string | null\n currencyCode?: string | null\n quantityAttributeCode?: string | null\n },\n) => {\n if (charge.pricingMethod === undefined && charge.chargeModel === undefined) return\n const { model, source } = normalizeChargePricing(charge)\n\n if (source === 'fixed') {\n if (model === 'volume' || model === 'tiered') {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['pricingMethod'],\n message: `V-CHG-1: ${model} pricing requires Table Lookup, not a fixed price`,\n })\n return\n }\n requireField(ctx, charge.fixedPrice, 'fixedPrice', 'V-CHG-1: fixedPrice is required for a fixed price')\n requireField(ctx, charge.currencyCode, 'currencyCode', 'V-CHG-1: currencyCode is required for a fixed price')\n forbidField(ctx, charge.pricingTableId, 'pricingTableId', 'V-CHG-1: pricingTableId must be empty for a fixed price')\n forbidField(ctx, charge.priceColumnKey, 'priceColumnKey', 'V-CHG-1: priceColumnKey must be empty for a fixed price')\n if (model === 'per_unit') {\n requireField(ctx, charge.quantityAttributeCode, 'quantityAttributeCode', 'V-CHG-1: quantityAttributeCode is required for per-unit pricing')\n } else {\n forbidField(ctx, charge.quantityAttributeCode, 'quantityAttributeCode', 'V-CHG-1: quantityAttributeCode must be empty for a flat fixed price')\n }\n return\n }\n\n // source === 'table'\n requireField(ctx, charge.pricingTableId, 'pricingTableId', 'V-CHG-1: pricingTableId is required for table lookup')\n requireField(ctx, charge.priceColumnKey, 'priceColumnKey', 'V-CHG-1: priceColumnKey is required for table lookup')\n forbidField(ctx, charge.fixedPrice, 'fixedPrice', 'V-CHG-1: fixedPrice must be empty for table lookup \u2014 price comes from the table')\n if (model === 'flat') {\n forbidField(ctx, charge.quantityAttributeCode, 'quantityAttributeCode', 'V-CHG-1: quantityAttributeCode must be empty for a flat table price')\n } else {\n requireField(ctx, charge.quantityAttributeCode, 'quantityAttributeCode', `V-CHG-1: quantityAttributeCode is required for ${model} pricing`)\n }\n}\n\nexport const cpqProductChargeCreateSchema = cpqProductChargeBase.superRefine((data, ctx) => {\n refineChargePricingShape(ctx, data)\n})\n\nexport const cpqProductChargeUpdateSchema = cpqProductChargeBase.partial().extend({\n id: z.string().uuid(),\n}).superRefine((data, ctx) => {\n // Enforce shape whenever either pricing axis is being changed \u2014 a\n // chargeModel-only PATCH (e.g. flat \u2192 per_unit) still alters the required\n // fields, so it must validate rather than silently persist a broken charge.\n if (data.pricingMethod !== undefined || data.chargeModel !== undefined) {\n refineChargePricingShape(ctx, data)\n }\n})\n\n// \u2500\u2500\u2500 Price Rule \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\u2500\u2500\n\nexport const cpqPriceRuleCreateSchema = z.object({\n code: z.string().min(1),\n name: z.string().min(1),\n description: z.string().nullish(),\n productOfferingId: z.string().uuid().nullish(),\n ruleType: z.enum(['discount_percent', 'discount_absolute', 'surcharge_percent', 'surcharge_absolute', 'price_override']),\n value: z.number().min(0),\n chargeCodeFilter: z.string().nullish(),\n chargeTypeFilter: z.enum(['nrc', 'mrc', 'usage']).nullish(),\n applicabilityCondition: z.record(z.string(), z.unknown()).nullish(),\n sortOrder: z.number().int().optional().default(0),\n isActive: z.boolean().optional().default(true),\n})\n\nexport const cpqPriceRuleUpdateSchema = cpqPriceRuleCreateSchema.partial().extend({\n id: z.string().uuid(),\n})\n\n// \u2500\u2500\u2500 Pricing Table \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\n// V-PT-1: every dimension / price column needs a non-empty key + label,\n// and keys must be unique within their list (charges reference them by\n// key \u2014 duplicates would make lookup ambiguous).\nconst keyLabelItem = z.object({\n key: z.string().min(1, 'Key is required'),\n label: z.string().min(1, 'Label is required'),\n})\n\nconst uniqueKeys = (label: string) =>\n (items: Array<{ key: string }>, ctx: z.RefinementCtx) => {\n const seen = new Set<string>()\n items.forEach((item, idx) => {\n if (seen.has(item.key)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [idx, 'key'],\n message: `V-PT-1: duplicate ${label} key \"${item.key}\"`,\n })\n }\n seen.add(item.key)\n })\n }\n\nexport const cpqPricingTableCreateSchema = z.object({\n code: z.string().min(1),\n name: z.string().min(1),\n dimensions: z.array(keyLabelItem).superRefine(uniqueKeys('dimension')),\n priceColumns: z.array(keyLabelItem).superRefine(uniqueKeys('price column')),\n currencyCodeList: z.array(z.string().min(1)).min(1),\n isActive: z.boolean().optional().default(true),\n})\n\nexport const cpqPricingTableUpdateSchema = cpqPricingTableCreateSchema.partial().extend({\n id: z.string().uuid(),\n})\n\nexport const cpqPricingTableEntryCreateSchema = z.object({\n pricingTableId: z.string().uuid(),\n dimensionValues: z.record(z.string(), z.string()),\n tierNumber: z.number().int().nullish(),\n rangeFrom: z.number().nullish(),\n rangeTo: z.number().nullish(),\n currencyCode: z.string().min(1).optional().default('USD'),\n prices: z.record(z.string(), z.number()),\n isActive: z.boolean().optional().default(true),\n})\n\nexport const cpqPricingTableEntryUpdateSchema = cpqPricingTableEntryCreateSchema.partial().extend({\n id: z.string().uuid(),\n})\n\n// \u2500\u2500\u2500 Quoting v2 \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\u2500\n\nexport const cpqQuoteTypeEnum = z.enum(['new', 'amend', 'renew', 'cancel'])\nexport const cpqArcQuoteTypeEnum = z.enum(['amend', 'renew', 'cancel'])\nexport const cpqMergeActionEnum = z.enum(['standalone', 'absorb'])\nexport const cpqArcReasonCodeEnum = z.enum([\n 'upgrade',\n 'downgrade',\n 'config-change',\n 'price-adjustment',\n 'term-extension',\n 'term-reduction',\n 'consolidation',\n 'customer-request',\n 'non-payment',\n 'contract-breach',\n 'other',\n])\n\nexport const cpqCreateQuoteSchema = z.object({\n customerId: z.string().uuid(),\n quoteId: z.string().uuid().optional(), // Link to existing SalesQuote\n dealId: z.string().uuid().optional(),\n currencyCode: z.string().min(1).optional(),\n quoteType: cpqQuoteTypeEnum.optional().default('new'),\n})\n\n// Server enforces the one-way rule (new \u2192 amend|renew|cancel only) in the\n// service layer; the schema just shapes the body.\nexport const cpqUpdateQuoteSchema = z.object({\n quoteType: cpqQuoteTypeEnum.optional(),\n})\n\nconst cpqPricePreviewItemSchema = z.object({\n offeringId: z.string().uuid().nullish(),\n productId: z.string().uuid().nullish(),\n configuration: z.record(z.string(), z.unknown()),\n}).refine(\n (item) => item.offeringId || item.productId,\n { message: 'One of offeringId or productId is required' },\n)\n\nexport const cpqPricePreviewSchema = z.object({\n includeWaterfall: z.boolean().optional().default(false),\n primaryItem: cpqPricePreviewItemSchema.nullish(),\n childItems: z.array(cpqPricePreviewItemSchema),\n currencyCode: z.string().min(1).optional(),\n})\n\nexport const cpqAddQuoteItemSchema = z.object({\n offeringId: z.string().uuid().optional(),\n productId: z.string().uuid().optional(),\n configuration: z.record(z.string(), z.unknown()).default({}),\n quantity: z.number().int().min(1).optional().default(1),\n usageEstimates: z\n .array(\n z.object({\n chargeCode: z.string().min(1),\n estimatedQuantity: z.number().min(0),\n }),\n )\n .optional(),\n action: z.enum(['add', 'modify', 'cancel']).optional().default('add'),\n parentLineId: z.string().uuid().optional(),\n startDate: z.string().optional(),\n termMonths: z.number().int().min(1).optional(),\n endDate: z.string().optional(),\n // ARC (XD-250): per-line target sub for amend / renew (standalone) / cancel.\n targetSubscriptionId: z.string().uuid().nullish(),\n // ARC (XD-250): existing item being changed by cancel/modify lines.\n sourceSubscriptionItemId: z.string().uuid().nullish(),\n})\n\nexport const cpqUpdateQuoteItemSchema = z.object({\n configuration: z.record(z.string(), z.unknown()),\n quantity: z.number().int().min(1).optional(),\n usageEstimates: z\n .array(\n z.object({\n chargeCode: z.string().min(1),\n estimatedQuantity: z.number().min(0),\n }),\n )\n .optional(),\n startDate: z.string().optional(),\n termMonths: z.number().int().min(1).optional(),\n endDate: z.string().optional(),\n targetSubscriptionId: z.string().uuid().nullish(),\n sourceSubscriptionItemId: z.string().uuid().nullish(),\n})\n\n// \u2500\u2500\u2500 ARC (Amend / Renew / Cancel) \u2014 XD-250 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const cpqCreateQuoteFromSubscriptionSchema = z.object({\n subscriptionId: z.string().uuid(),\n type: cpqArcQuoteTypeEnum,\n renewTerm: z\n .object({\n newTermStart: z.string().min(1),\n newTermEnd: z.string().min(1),\n newTermMonths: z.number().int().min(1).optional(),\n })\n .optional(),\n})\n\nexport const cpqAttachTargetSubscriptionSchema = z.object({\n subscriptionId: z.string().uuid(),\n quoteType: cpqArcQuoteTypeEnum,\n mergeAction: cpqMergeActionEnum.optional(),\n newTermStart: z.string().min(1).optional(),\n newTermEnd: z.string().min(1).optional(),\n newTermMonths: z.number().int().min(1).optional(),\n})\n\nexport const cpqUpdateTargetSubscriptionSchema = z.object({\n mergeAction: cpqMergeActionEnum.optional(),\n newTermStart: z.string().min(1).nullish(),\n newTermEnd: z.string().min(1).nullish(),\n newTermMonths: z.number().int().min(1).nullish(),\n})\n\nexport const cpqCancelMetaSchema = z.object({\n reasonCode: cpqArcReasonCodeEnum,\n reasonText: z.string().nullish(),\n etfAmount: z\n .union([z.string(), z.number().transform(String)])\n .nullish(),\n etfCurrency: z.string().min(1).max(3).nullish(),\n})\n\nexport const cpqMergeMetaSchema = z.object({\n newTermStart: z.string().min(1),\n newTermEnd: z.string().min(1),\n newTermMonths: z.number().int().min(1).optional(),\n newSubCode: z.string().min(1).nullish(),\n newSubName: z.string().min(1).nullish(),\n})\n\nexport const cpqExpiringSubscriptionsQuerySchema = z.object({\n withinDays: z.coerce.number().int().min(1).max(365).optional().default(30),\n customerId: z.string().uuid().optional(),\n billingCycle: z.enum(['monthly', 'quarterly', 'annually']).optional(),\n status: z.string().optional().default('active'),\n page: z.coerce.number().int().min(1).optional().default(1),\n pageSize: z.coerce.number().int().min(1).max(100).optional().default(50),\n})\n\nexport const cpqChangeLogQuerySchema = z.object({\n page: z.coerce.number().int().min(1).optional().default(1),\n pageSize: z.coerce.number().int().min(1).max(100).optional().default(50),\n})\n\nexport const cpqRecalculateSchema = z.object({\n save: z.boolean(),\n})\n\nexport const cpqTransitionStatusSchema = z.object({\n targetStatus: z.string().min(1),\n})\n\nexport const cpqValidateRelationshipsSchema = z.object({\n offeringIds: z.array(z.string().uuid()),\n parentChildPairs: z\n .array(\n z.object({\n parentOfferingId: z.string().uuid(),\n childOfferingId: z.string().uuid(),\n }),\n )\n .optional()\n})\n\n// \u2500\u2500\u2500 Wizard \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\u2500\u2500\u2500\u2500\u2500\n\nconst wizardTransitionConditionSchema = z.object({\n field: z.string().min(1),\n operator: z.enum(['eq', 'neq', 'gt', 'lt', 'gte', 'lte', 'exists', 'not_exists', 'in']),\n value: z.unknown().optional(),\n})\n\nconst wizardTransitionSchema = z.object({\n targetStepId: z.string().min(1),\n condition: wizardTransitionConditionSchema.optional(),\n isDefault: z.boolean().optional(),\n label: z.string().optional(),\n})\n\nconst wizardStepValidationSchema = z.object({\n field: z.string().min(1),\n operator: z.enum(['eq', 'neq', 'exists', 'not_exists']),\n value: z.unknown().optional(),\n message: z.string().min(1),\n})\n\nconst wizardStepDefinitionSchema = z.object({\n stepId: z.string().min(1),\n type: z.string().min(1),\n title: z.string().min(1),\n description: z.string().nullish(),\n config: z.record(z.string(), z.unknown()).default({}),\n transitions: z.array(wizardTransitionSchema).default([]),\n isOptional: z.boolean().optional().default(false),\n validationRules: z.array(wizardStepValidationSchema).optional(),\n})\n\nconst wizardApplicabilitySchema = z.object({\n specCodes: z.array(z.string()).optional(),\n offeringCodes: z.array(z.string()).optional(),\n customerSegments: z.array(z.string()).optional(),\n surface: z.enum(['backend', 'portal']).optional(),\n priority: z.number().int().optional().default(0),\n})\n\nexport const cpqWizardDefinitionCreateSchema = z.object({\n code: z.string().min(1),\n name: z.string().min(1),\n description: z.string().nullish(),\n steps: z.array(wizardStepDefinitionSchema).min(1),\n applicability: wizardApplicabilitySchema.nullish(),\n paramsSchema: z.record(z.string(), z.unknown()).nullish(),\n surface: z.enum(['backend', 'portal', 'any']).optional().default('backend'),\n isActive: z.boolean().optional().default(true),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n})\n\nexport const cpqWizardDefinitionUpdateSchema = cpqWizardDefinitionCreateSchema.partial().extend({\n id: z.string().uuid(),\n})\n// \u2500\u2500\u2500 Inventory Subscription \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\nconst cpqInventorySubscriptionItemInputSchema = z.object({\n parentItemId: z.string().uuid().nullish(),\n productId: z.string().uuid().nullish(),\n offeringId: z.string().uuid().nullish(),\n specId: z.string().uuid().nullish(),\n name: z.string().min(1),\n configuration: z.record(z.string(), z.unknown()).optional().default({}),\n charges: z.array(z.record(z.string(), z.unknown())).nullish(),\n mrcAmount: z.number().optional().default(0),\n nrcAmount: z.number().optional().default(0),\n currencyCode: z.string().min(1).optional(),\n quantity: z.number().int().min(1).optional().default(1),\n capacityTotal: z.number().nullish(),\n capacityUnit: z.string().nullish(),\n sourceQuoteLineId: z.string().uuid().nullish(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n sortOrder: z.number().int().optional().default(0),\n})\n\nexport const cpqInventorySubscriptionCreateSchema = z.object({\n customerId: z.string().uuid(),\n code: z.string().min(1).optional(),\n name: z.string().min(1),\n description: z.string().nullish(),\n billingCycle: z.enum(['monthly', 'quarterly', 'annually']).optional().default('monthly'),\n currencyCode: z.string().min(1).optional(),\n startDate: z.string().nullish(),\n termMonths: z.number().int().min(1).nullish(),\n autoRenew: z.boolean().optional().default(true),\n sourceQuoteId: z.string().uuid().nullish(),\n sourceOrderId: z.string().uuid().nullish(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n items: z.array(cpqInventorySubscriptionItemInputSchema).min(1),\n})\n\nexport const cpqInventorySubscriptionUpdateSchema = z.object({\n id: z.string().uuid(),\n name: z.string().min(1).optional(),\n description: z.string().nullish(),\n billingCycle: z.enum(['monthly', 'quarterly', 'annually']).optional(),\n autoRenew: z.boolean().optional(),\n termMonths: z.number().int().min(1).nullish(),\n currentTermEnd: z.string().nullish(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n})\n\nexport const cpqInventoryStatusTransitionSchema = z.object({\n id: z.string().uuid(),\n targetStatus: z.string().min(1),\n})\n\n// \u2500\u2500\u2500 Inventory Subscription Item \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\nexport const cpqInventorySubscriptionItemCreateSchema = z.object({\n subscriptionId: z.string().uuid(),\n parentItemId: z.string().uuid().nullish(),\n productId: z.string().uuid().nullish(),\n offeringId: z.string().uuid().nullish(),\n specId: z.string().uuid().nullish(),\n name: z.string().min(1),\n configuration: z.record(z.string(), z.unknown()).optional().default({}),\n charges: z.array(z.record(z.string(), z.unknown())).nullish(),\n mrcAmount: z.number().optional().default(0),\n nrcAmount: z.number().optional().default(0),\n currencyCode: z.string().min(1).optional(),\n quantity: z.number().int().min(1).optional().default(1),\n capacityTotal: z.number().nullish(),\n capacityUnit: z.string().nullish(),\n sourceQuoteLineId: z.string().uuid().nullish(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n sortOrder: z.number().int().optional().default(0),\n})\n\nexport const cpqInventorySubscriptionItemUpdateSchema = z.object({\n id: z.string().uuid(),\n name: z.string().min(1).optional(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n capacityTotal: z.number().nullish(),\n capacityUsed: z.number().nullish(),\n capacityUnit: z.string().nullish(),\n sortOrder: z.number().int().optional(),\n})\n\n// \u2500\u2500\u2500 Inventory Asset \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\nexport const cpqInventoryAssetCreateSchema = z.object({\n customerId: z.string().uuid(),\n subscriptionId: z.string().uuid().nullish(),\n subscriptionItemId: z.string().uuid().nullish(),\n productId: z.string().uuid().nullish(),\n offeringId: z.string().uuid().nullish(),\n specId: z.string().uuid().nullish(),\n code: z.string().min(1).optional(),\n name: z.string().min(1),\n description: z.string().nullish(),\n assetType: z.enum(['one_time', 'license', 'physical', 'logical']).optional().default('one_time'),\n currencyCode: z.string().min(1).optional(),\n purchasePrice: z.number().optional().default(0),\n quantity: z.number().int().min(1).optional().default(1),\n purchaseDate: z.string().nullish(),\n deliveryDate: z.string().nullish(),\n configuration: z.record(z.string(), z.unknown()).optional().default({}),\n charges: z.array(z.record(z.string(), z.unknown())).nullish(),\n sourceQuoteId: z.string().uuid().nullish(),\n sourceOrderId: z.string().uuid().nullish(),\n sourceQuoteLineId: z.string().uuid().nullish(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n})\n\nexport const cpqInventoryAssetUpdateSchema = z.object({\n id: z.string().uuid(),\n name: z.string().min(1).optional(),\n description: z.string().nullish(),\n assetType: z.enum(['one_time', 'license', 'physical', 'logical']).optional(),\n deliveryDate: z.string().nullish(),\n metadata: z.record(z.string(), z.unknown()).nullish(),\n})\n\n// \u2500\u2500\u2500 CPQ Orders \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\u2500\u2500\n\nexport const cpqConvertQuoteToOrderSchema = z.object({\n quoteId: z.string().uuid(),\n})\n\nexport const cpqOrderStatusTransitionSchema = z.object({\n targetStatus: z.string().min(1),\n})\n\nexport { cpqPriceAdjustmentInputSchema, cpqPriceAdjustmentPatchSchema } from './price-adjustments'\n"],
5
+ "mappings": "AAAA,SAAS,SAAS;AAClB,SAAS,8BAA8B;AAIhC,MAAM,sCAAsC,EAAE,OAAO;AAAA,EAC1D,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACtC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAa,EAAE,OAAO,EAAE,QAAQ;AAAA,EAChC,UAAU,EAAE,KAAK,CAAC,UAAU,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,QAAQ;AAAA,EAClE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnD,iBAAiB,EAAE,KAAK,CAAC,SAAS,UAAU,YAAY,CAAC,EAAE,SAAS,EAAE,QAAQ,OAAO;AAAA,EACrF,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EAC9C,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,EAC7C,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,EAC3C,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,EACpD,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAC/C,CAAC;AAEM,MAAM,sCAAsC,oCAAoC,QAAQ,EAAE,OAAO;AAAA,EACtG,IAAI,EAAE,OAAO,EAAE,KAAK;AACtB,CAAC;AAIM,MAAM,iCAAiC,EAAE,OAAO;AAAA,EACrD,QAAQ,EAAE,OAAO,EAAE,KAAK;AAAA,EACxB,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EAC1C,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAa,EAAE,OAAO,EAAE,QAAQ;AAAA,EAChC,cAAc,EAAE,KAAK,CAAC,UAAU,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,QAAQ;AAAA,EACtE,kBAAkB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,EAIzE,iBAAiB,EAAE,KAAK,CAAC,SAAS,UAAU,YAAY,CAAC,EAAE,SAAS,EAAE,QAAQ,OAAO;AAAA,EACrF,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,EAC7C,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,EAC3C,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,EACpD,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAC/C,CAAC;AAEM,MAAM,iCAAiC,+BAA+B,QAAQ,EAAE,OAAO;AAAA,EAC5F,IAAI,EAAE,OAAO,EAAE,KAAK;AACtB,CAAC;AAIM,MAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,QAAQ,EAAE,OAAO,EAAE,KAAK;AAAA,EACxB,cAAc,EAAE,OAAO,EAAE,KAAK;AAAA,EAC9B,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAChC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAa,EAAE,OAAO,EAAE,QAAQ;AAAA,EAChC,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EAC5D,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ;AAAA,EAChD,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EAChD,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AACtD,CAAC;AAEM,MAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,IAAI,EAAE,OAAO,EAAE,KAAK;AAAA,EACpB,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC3C,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACjC,aAAa,EAAE,OAAO,EAAE,QAAQ;AAAA,EAChC,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACjD,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ;AAAA,EAChD,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACrC,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AACtD,CAAC;AAIM,MAAM,mCAAmC,EAAE,OAAO;AAAA,EACvD,YAAY,EAAE,OAAO,EAAE,KAAK;AAAA,EAC5B,QAAQ,EAAE,OAAO,EAAE,KAAK;AAAA,EACxB,iBAAiB,EAAE,OAAO,EAAE,KAAK;AAAA,EACjC,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC/C,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EAChD,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AACtD,CAAC;AAEM,MAAM,mCAAmC,EAAE,OAAO;AAAA,EACvD,IAAI,EAAE,OAAO,EAAE,KAAK;AAAA,EACpB,WAAW,EAAE,QAAQ,EAAE,SAAS;AAAA,EAChC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACrC,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AACtD,CAAC;AAIM,MAAM,qCAAqC,EAAE,OAAO;AAAA,EACzD,cAAc,EAAE,OAAO,EAAE,KAAK;AAAA,EAC9B,cAAc,EAAE,OAAO,EAAE,KAAK;AAAA,EAC9B,kBAAkB,EAAE,KAAK,CAAC,gBAAgB,YAAY,UAAU,CAAC;AAAA,EACjE,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EACrD,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ;AAAA,EACzC,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,EACrD,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,EACpD,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAC/C,CAAC;AAEM,MAAM,qCAAqC,mCAAmC,QAAQ,EAAE,OAAO;AAAA,EACpG,IAAI,EAAE,OAAO,EAAE,KAAK;AACtB,CAAC;AAIM,MAAM,kCAAkC,EAAE,OAAO;AAAA,EACtD,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACtC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EAClC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,eAAe,EAAE,KAAK,CAAC,QAAQ,UAAU,QAAQ,WAAW,UAAU,gBAAgB,WAAW,CAAC;AAAA,EAClG,gBAAgB,EAAE,KAAK,CAAC,eAAe,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,UAAU;AAAA,EACjF,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,QAAQ;AAAA,EAC7E,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,EACvD,iBAAiB,EAAE,OAAO,EAAE,QAAQ;AAAA,EACpC,iBAAiB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,EAC3D,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,EACrD,cAAc,EAAE,QAAQ,EAAE,QAAQ;AAAA,EAClC,UAAU,EAAE,OAAO,EAAE,QAAQ;AAAA,EAC7B,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EAChD,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAC/C,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAC/C,CAAC;AAEM,MAAM,kCAAkC,gCAAgC,QAAQ,EAAE,OAAO;AAAA,EAC9F,IAAI,EAAE,OAAO,EAAE,KAAK;AACtB,CAAC;AAUD,MAAM,qBAAqB,EAAE,KAAK,CAAC,QAAQ,YAAY,UAAU,QAAQ,CAAC;AAE1E,MAAM,6BAA6B,EAAE,KAAK,CAAC,SAAS,SAAS,QAAQ,UAAU,UAAU,CAAC;AAE1F,MAAM,eAAe,CACnB,KACA,OACA,MACA,QACG;AACH,MAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,IAAI;AACzD,QAAI,SAAS,EAAE,MAAM,EAAE,aAAa,QAAQ,MAAM,CAAC,IAAI,GAAG,SAAS,IAAI,CAAC;AAAA,EAC1E;AACF;AAEA,MAAM,cAAc,CAClB,KACA,OACA,MACA,QACG;AACH,MAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,IAAI;AACzD,QAAI,SAAS,EAAE,MAAM,EAAE,aAAa,QAAQ,MAAM,CAAC,IAAI,GAAG,SAAS,IAAI,CAAC;AAAA,EAC1E;AACF;AAKA,MAAM,uBAAuB,EAAE,OAAO;AAAA,EACpC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACtC,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EACtC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAa,EAAE,OAAO,EAAE,QAAQ;AAAA,EAChC,YAAY,EAAE,KAAK,CAAC,OAAO,OAAO,OAAO,CAAC;AAAA,EAC1C,aAAa,mBAAmB,SAAS;AAAA,EACzC,eAAe;AAAA,EACf,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EAC1C,gBAAgB,EAAE,OAAO,EAAE,QAAQ;AAAA,EACnC,YAAY,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,UAAU,MAAM,CAAC,CAAC,EAAE,QAAQ;AAAA,EACxE,cAAc,EAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,uBAAuB,EAAE,OAAO,EAAE,QAAQ;AAAA,EAC1C,wBAAwB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,EAClE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EAChD,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAC/C,CAAC;AAQD,MAAM,2BAA2B,CAC/B,KACA,WASG;AACH,MAAI,OAAO,kBAAkB,UAAa,OAAO,gBAAgB,OAAW;AAC5E,QAAM,EAAE,OAAO,OAAO,IAAI,uBAAuB,MAAM;AAEvD,MAAI,WAAW,SAAS;AACtB,QAAI,UAAU,YAAY,UAAU,UAAU;AAC5C,UAAI,SAAS;AAAA,QACX,MAAM,EAAE,aAAa;AAAA,QACrB,MAAM,CAAC,eAAe;AAAA,QACtB,SAAS,YAAY,KAAK;AAAA,MAC5B,CAAC;AACD;AAAA,IACF;AACA,iBAAa,KAAK,OAAO,YAAY,cAAc,mDAAmD;AACtG,iBAAa,KAAK,OAAO,cAAc,gBAAgB,qDAAqD;AAC5G,gBAAY,KAAK,OAAO,gBAAgB,kBAAkB,yDAAyD;AACnH,gBAAY,KAAK,OAAO,gBAAgB,kBAAkB,yDAAyD;AACnH,QAAI,UAAU,YAAY;AACxB,mBAAa,KAAK,OAAO,uBAAuB,yBAAyB,iEAAiE;AAAA,IAC5I,OAAO;AACL,kBAAY,KAAK,OAAO,uBAAuB,yBAAyB,qEAAqE;AAAA,IAC/I;AACA;AAAA,EACF;AAGA,eAAa,KAAK,OAAO,gBAAgB,kBAAkB,sDAAsD;AACjH,eAAa,KAAK,OAAO,gBAAgB,kBAAkB,sDAAsD;AACjH,cAAY,KAAK,OAAO,YAAY,cAAc,sFAAiF;AACnI,MAAI,UAAU,QAAQ;AACpB,gBAAY,KAAK,OAAO,uBAAuB,yBAAyB,qEAAqE;AAAA,EAC/I,OAAO;AACL,iBAAa,KAAK,OAAO,uBAAuB,yBAAyB,kDAAkD,KAAK,UAAU;AAAA,EAC5I;AACF;AAEO,MAAM,+BAA+B,qBAAqB,YAAY,CAAC,MAAM,QAAQ;AAC1F,2BAAyB,KAAK,IAAI;AACpC,CAAC;AAEM,MAAM,+BAA+B,qBAAqB,QAAQ,EAAE,OAAO;AAAA,EAChF,IAAI,EAAE,OAAO,EAAE,KAAK;AACtB,CAAC,EAAE,YAAY,CAAC,MAAM,QAAQ;AAI5B,MAAI,KAAK,kBAAkB,UAAa,KAAK,gBAAgB,QAAW;AACtE,6BAAyB,KAAK,IAAI;AAAA,EACpC;AACF,CAAC;AAIM,MAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAa,EAAE,OAAO,EAAE,QAAQ;AAAA,EAChC,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EAC7C,UAAU,EAAE,KAAK,CAAC,oBAAoB,qBAAqB,qBAAqB,sBAAsB,gBAAgB,CAAC;AAAA,EACvH,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,kBAAkB,EAAE,OAAO,EAAE,QAAQ;AAAA,EACrC,kBAAkB,EAAE,KAAK,CAAC,OAAO,OAAO,OAAO,CAAC,EAAE,QAAQ;AAAA,EAC1D,wBAAwB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,EAClE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EAChD,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAC/C,CAAC;AAEM,MAAM,2BAA2B,yBAAyB,QAAQ,EAAE,OAAO;AAAA,EAChF,IAAI,EAAE,OAAO,EAAE,KAAK;AACtB,CAAC;AAOD,MAAM,eAAe,EAAE,OAAO;AAAA,EAC5B,KAAK,EAAE,OAAO,EAAE,IAAI,GAAG,iBAAiB;AAAA,EACxC,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,mBAAmB;AAC9C,CAAC;AAED,MAAM,aAAa,CAAC,UAClB,CAAC,OAA+B,QAAyB;AACvD,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,QAAQ,CAAC,MAAM,QAAQ;AAC3B,QAAI,KAAK,IAAI,KAAK,GAAG,GAAG;AACtB,UAAI,SAAS;AAAA,QACX,MAAM,EAAE,aAAa;AAAA,QACrB,MAAM,CAAC,KAAK,KAAK;AAAA,QACjB,SAAS,qBAAqB,KAAK,SAAS,KAAK,GAAG;AAAA,MACtD,CAAC;AAAA,IACH;AACA,SAAK,IAAI,KAAK,GAAG;AAAA,EACnB,CAAC;AACH;AAEK,MAAM,8BAA8B,EAAE,OAAO;AAAA,EAClD,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,YAAY,EAAE,MAAM,YAAY,EAAE,YAAY,WAAW,WAAW,CAAC;AAAA,EACrE,cAAc,EAAE,MAAM,YAAY,EAAE,YAAY,WAAW,cAAc,CAAC;AAAA,EAC1E,kBAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA,EAClD,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAC/C,CAAC;AAEM,MAAM,8BAA8B,4BAA4B,QAAQ,EAAE,OAAO;AAAA,EACtF,IAAI,EAAE,OAAO,EAAE,KAAK;AACtB,CAAC;AAEM,MAAM,mCAAmC,EAAE,OAAO;AAAA,EACvD,gBAAgB,EAAE,OAAO,EAAE,KAAK;AAAA,EAChC,iBAAiB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC;AAAA,EAChD,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ;AAAA,EACrC,WAAW,EAAE,OAAO,EAAE,QAAQ;AAAA,EAC9B,SAAS,EAAE,OAAO,EAAE,QAAQ;AAAA,EAC5B,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EACxD,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC;AAAA,EACvC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAC/C,CAAC;AAEM,MAAM,mCAAmC,iCAAiC,QAAQ,EAAE,OAAO;AAAA,EAChG,IAAI,EAAE,OAAO,EAAE,KAAK;AACtB,CAAC;AAIM,MAAM,mBAAmB,EAAE,KAAK,CAAC,OAAO,SAAS,SAAS,QAAQ,CAAC;AACnE,MAAM,sBAAsB,EAAE,KAAK,CAAC,SAAS,SAAS,QAAQ,CAAC;AAC/D,MAAM,qBAAqB,EAAE,KAAK,CAAC,cAAc,QAAQ,CAAC;AAC1D,MAAM,uBAAuB,EAAE,KAAK;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,YAAY,EAAE,OAAO,EAAE,KAAK;AAAA,EAC5B,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA;AAAA,EACpC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACnC,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACzC,WAAW,iBAAiB,SAAS,EAAE,QAAQ,KAAK;AACtD,CAAC;AAIM,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,WAAW,iBAAiB,SAAS;AACvC,CAAC;AAED,MAAM,4BAA4B,EAAE,OAAO;AAAA,EACzC,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EACtC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EACrC,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC;AACjD,CAAC,EAAE;AAAA,EACD,CAAC,SAAS,KAAK,cAAc,KAAK;AAAA,EAClC,EAAE,SAAS,6CAA6C;AAC1D;AAEO,MAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,kBAAkB,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EACtD,aAAa,0BAA0B,QAAQ;AAAA,EAC/C,YAAY,EAAE,MAAM,yBAAyB;AAAA,EAC7C,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAC3C,CAAC;AAEM,MAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACvC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACtC,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC3D,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EACtD,gBAAgB,EACb;AAAA,IACC,EAAE,OAAO;AAAA,MACP,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MAC5B,mBAAmB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACrC,CAAC;AAAA,EACH,EACC,SAAS;AAAA,EACZ,QAAQ,EAAE,KAAK,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EACpE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACzC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC7C,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE7B,sBAAsB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA;AAAA,EAEhD,0BAA0B,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AACtD,CAAC;AAEM,MAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC;AAAA,EAC/C,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC3C,gBAAgB,EACb;AAAA,IACC,EAAE,OAAO;AAAA,MACP,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MAC5B,mBAAmB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACrC,CAAC;AAAA,EACH,EACC,SAAS;AAAA,EACZ,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC7C,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,sBAAsB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EAChD,0BAA0B,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AACtD,CAAC;AAIM,MAAM,uCAAuC,EAAE,OAAO;AAAA,EAC3D,gBAAgB,EAAE,OAAO,EAAE,KAAK;AAAA,EAChC,MAAM;AAAA,EACN,WAAW,EACR,OAAO;AAAA,IACN,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC9B,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC5B,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAClD,CAAC,EACA,SAAS;AACd,CAAC;AAEM,MAAM,oCAAoC,EAAE,OAAO;AAAA,EACxD,gBAAgB,EAAE,OAAO,EAAE,KAAK;AAAA,EAChC,WAAW;AAAA,EACX,aAAa,mBAAmB,SAAS;AAAA,EACzC,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACzC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACvC,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAClD,CAAC;AAEM,MAAM,oCAAoC,EAAE,OAAO;AAAA,EACxD,aAAa,mBAAmB,SAAS;AAAA,EACzC,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ;AAAA,EACxC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ;AAAA,EACtC,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ;AACjD,CAAC;AAEM,MAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,YAAY;AAAA,EACZ,YAAY,EAAE,OAAO,EAAE,QAAQ;AAAA,EAC/B,WAAW,EACR,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,UAAU,MAAM,CAAC,CAAC,EAChD,QAAQ;AAAA,EACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ;AAChD,CAAC;AAEM,MAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC9B,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC5B,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAChD,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ;AAAA,EACtC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ;AACxC,CAAC;AAEM,MAAM,sCAAsC,EAAE,OAAO;AAAA,EAC1D,YAAY,EAAE,OAAO,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA,EACzE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACvC,cAAc,EAAE,KAAK,CAAC,WAAW,aAAa,UAAU,CAAC,EAAE,SAAS;AAAA,EACpE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,QAAQ;AAAA,EAC9C,MAAM,EAAE,OAAO,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EACzD,UAAU,EAAE,OAAO,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE;AACzE,CAAC;AAEM,MAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,MAAM,EAAE,OAAO,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EACzD,UAAU,EAAE,OAAO,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE;AACzE,CAAC;AAEM,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,MAAM,EAAE,QAAQ;AAClB,CAAC;AAEM,MAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC;AAChC,CAAC;AAEM,MAAM,iCAAiC,EAAE,OAAO;AAAA,EACrD,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;AAAA,EACtC,kBAAkB,EACf;AAAA,IACC,EAAE,OAAO;AAAA,MACP,kBAAkB,EAAE,OAAO,EAAE,KAAK;AAAA,MAClC,iBAAiB,EAAE,OAAO,EAAE,KAAK;AAAA,IACnC,CAAC;AAAA,EACH,EACC,SAAS;AACd,CAAC;AAID,MAAM,kCAAkC,EAAE,OAAO;AAAA,EAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,UAAU,EAAE,KAAK,CAAC,MAAM,OAAO,MAAM,MAAM,OAAO,OAAO,UAAU,cAAc,IAAI,CAAC;AAAA,EACtF,OAAO,EAAE,QAAQ,EAAE,SAAS;AAC9B,CAAC;AAED,MAAM,yBAAyB,EAAE,OAAO;AAAA,EACtC,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC9B,WAAW,gCAAgC,SAAS;AAAA,EACpD,WAAW,EAAE,QAAQ,EAAE,SAAS;AAAA,EAChC,OAAO,EAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAED,MAAM,6BAA6B,EAAE,OAAO;AAAA,EAC1C,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,UAAU,EAAE,KAAK,CAAC,MAAM,OAAO,UAAU,YAAY,CAAC;AAAA,EACtD,OAAO,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC5B,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAC3B,CAAC;AAED,MAAM,6BAA6B,EAAE,OAAO;AAAA,EAC1C,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACxB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,aAAa,EAAE,OAAO,EAAE,QAAQ;AAAA,EAChC,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpD,aAAa,EAAE,MAAM,sBAAsB,EAAE,QAAQ,CAAC,CAAC;AAAA,EACvD,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAChD,iBAAiB,EAAE,MAAM,0BAA0B,EAAE,SAAS;AAChE,CAAC;AAED,MAAM,4BAA4B,EAAE,OAAO;AAAA,EACzC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACxC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC5C,kBAAkB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC/C,SAAS,EAAE,KAAK,CAAC,WAAW,QAAQ,CAAC,EAAE,SAAS;AAAA,EAChD,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;AACjD,CAAC;AAEM,MAAM,kCAAkC,EAAE,OAAO;AAAA,EACtD,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAa,EAAE,OAAO,EAAE,QAAQ;AAAA,EAChC,OAAO,EAAE,MAAM,0BAA0B,EAAE,IAAI,CAAC;AAAA,EAChD,eAAe,0BAA0B,QAAQ;AAAA,EACjD,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,EACxD,SAAS,EAAE,KAAK,CAAC,WAAW,UAAU,KAAK,CAAC,EAAE,SAAS,EAAE,QAAQ,SAAS;AAAA,EAC1E,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAC7C,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AACtD,CAAC;AAEM,MAAM,kCAAkC,gCAAgC,QAAQ,EAAE,OAAO;AAAA,EAC9F,IAAI,EAAE,OAAO,EAAE,KAAK;AACtB,CAAC;AAGD,MAAM,0CAA0C,EAAE,OAAO;AAAA,EACvD,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EACxC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EACrC,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EACtC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EAClC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EACtE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ;AAAA,EAC5D,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EAC1C,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EAC1C,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACzC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EACtD,eAAe,EAAE,OAAO,EAAE,QAAQ;AAAA,EAClC,cAAc,EAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EAC7C,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,EACpD,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;AAClD,CAAC;AAEM,MAAM,uCAAuC,EAAE,OAAO;AAAA,EAC3D,YAAY,EAAE,OAAO,EAAE,KAAK;AAAA,EAC5B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACjC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAa,EAAE,OAAO,EAAE,QAAQ;AAAA,EAChC,cAAc,EAAE,KAAK,CAAC,WAAW,aAAa,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,SAAS;AAAA,EACvF,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACzC,WAAW,EAAE,OAAO,EAAE,QAAQ;AAAA,EAC9B,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ;AAAA,EAC5C,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAC9C,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EACzC,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EACzC,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,EACpD,OAAO,EAAE,MAAM,uCAAuC,EAAE,IAAI,CAAC;AAC/D,CAAC;AAEM,MAAM,uCAAuC,EAAE,OAAO;AAAA,EAC3D,IAAI,EAAE,OAAO,EAAE,KAAK;AAAA,EACpB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACjC,aAAa,EAAE,OAAO,EAAE,QAAQ;AAAA,EAChC,cAAc,EAAE,KAAK,CAAC,WAAW,aAAa,UAAU,CAAC,EAAE,SAAS;AAAA,EACpE,WAAW,EAAE,QAAQ,EAAE,SAAS;AAAA,EAChC,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ;AAAA,EAC5C,gBAAgB,EAAE,OAAO,EAAE,QAAQ;AAAA,EACnC,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AACtD,CAAC;AAEM,MAAM,qCAAqC,EAAE,OAAO;AAAA,EACzD,IAAI,EAAE,OAAO,EAAE,KAAK;AAAA,EACpB,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC;AAChC,CAAC;AAIM,MAAM,2CAA2C,EAAE,OAAO;AAAA,EAC/D,gBAAgB,EAAE,OAAO,EAAE,KAAK;AAAA,EAChC,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EACxC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EACrC,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EACtC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EAClC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EACtE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ;AAAA,EAC5D,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EAC1C,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EAC1C,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACzC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EACtD,eAAe,EAAE,OAAO,EAAE,QAAQ;AAAA,EAClC,cAAc,EAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EAC7C,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,EACpD,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;AAClD,CAAC;AAEM,MAAM,2CAA2C,EAAE,OAAO;AAAA,EAC/D,IAAI,EAAE,OAAO,EAAE,KAAK;AAAA,EACpB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACjC,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,EACpD,eAAe,EAAE,OAAO,EAAE,QAAQ;AAAA,EAClC,cAAc,EAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,cAAc,EAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AACvC,CAAC;AAIM,MAAM,gCAAgC,EAAE,OAAO;AAAA,EACpD,YAAY,EAAE,OAAO,EAAE,KAAK;AAAA,EAC5B,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EAC1C,oBAAoB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EAC9C,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EACrC,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EACtC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EAClC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACjC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAa,EAAE,OAAO,EAAE,QAAQ;AAAA,EAChC,WAAW,EAAE,KAAK,CAAC,YAAY,WAAW,YAAY,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,UAAU;AAAA,EAC/F,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACzC,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EAC9C,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EACtD,cAAc,EAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,cAAc,EAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EACtE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ;AAAA,EAC5D,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EACzC,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EACzC,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAAA,EAC7C,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AACtD,CAAC;AAEM,MAAM,gCAAgC,EAAE,OAAO;AAAA,EACpD,IAAI,EAAE,OAAO,EAAE,KAAK;AAAA,EACpB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACjC,aAAa,EAAE,OAAO,EAAE,QAAQ;AAAA,EAChC,WAAW,EAAE,KAAK,CAAC,YAAY,WAAW,YAAY,SAAS,CAAC,EAAE,SAAS;AAAA,EAC3E,cAAc,EAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ;AACtD,CAAC;AAIM,MAAM,+BAA+B,EAAE,OAAO;AAAA,EACnD,SAAS,EAAE,OAAO,EAAE,KAAK;AAC3B,CAAC;AAEM,MAAM,iCAAiC,EAAE,OAAO;AAAA,EACrD,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC;AAChC,CAAC;AAED,SAAS,+BAA+B,qCAAqC;",
6
6
  "names": []
7
7
  }
@@ -6,9 +6,15 @@ import { DefaultCpqQuotingService } from "./services/cpqQuotingService.js";
6
6
  import { DefaultCpqWizardService } from "./services/cpqWizardService.js";
7
7
  import { DefaultCpqInventoryService } from "./services/cpqInventoryService.js";
8
8
  import { DefaultCpqOrderService } from "./services/cpqOrderService.js";
9
+ import { CpqAdjustmentService } from "./services/priceAdjustments/adjustmentService.js";
9
10
  import { DefaultCpqBundleService } from "./services/cpqBundleService.js";
10
11
  function register(container) {
11
12
  container.register({
13
+ cpqAdjustmentService: asFunction(() => new CpqAdjustmentService({
14
+ em: container.resolve("em"),
15
+ quotingService: container.resolve("cpqQuotingService"),
16
+ featureTogglesService: container.resolve("featureTogglesService")
17
+ })).scoped(),
12
18
  cpqPricingService: asFunction(({ em }) => {
13
19
  return new DefaultCpqPricingService(em);
14
20
  }).scoped().proxy(),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/modules/cpq/di.ts"],
4
- "sourcesContent": ["import { asFunction } from 'awilix'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport type { AppContainer } from '@open-mercato/shared/lib/di/container'\nimport type { SalesDocumentNumberGenerator } from '@open-mercato/core/modules/sales/services/salesDocumentNumberGenerator'\nimport { DefaultCpqPricingService } from './services/cpqPricingService'\nimport { DefaultCpqValidationService } from './services/cpqValidationService'\nimport { DefaultCpqProductService } from './services/cpqProductService'\nimport { DefaultCpqQuotingService } from './services/cpqQuotingService'\nimport { DefaultCpqWizardService } from './services/cpqWizardService'\nimport { DefaultCpqInventoryService } from './services/cpqInventoryService'\nimport { DefaultCpqOrderService } from './services/cpqOrderService'\nimport { DefaultCpqBundleService } from './services/cpqBundleService'\n\n/**\n * Resolve dependencies from the container closure rather than via destructured\n * factory parameters. The container uses InjectionMode.CLASSIC, and Turbopack\n * transpiles destructured arrow functions in a way that breaks Awilix's\n * parameter-name parser. Core modules are unaffected because they ship\n * pre-compiled in node_modules.\n */\nexport function register(container: AppContainer) {\n container.register({\n cpqPricingService: asFunction(({ em }: { em: EntityManager }) => {\n return new DefaultCpqPricingService(em)\n }).scoped().proxy(),\n cpqValidationService: asFunction(({ em }: { em: EntityManager }) => {\n return new DefaultCpqValidationService(em)\n }).scoped().proxy(),\n cpqProductService: asFunction(({ em }: { em: EntityManager }) => {\n return new DefaultCpqProductService(em)\n }).scoped().proxy(),\n cpqQuotingService: asFunction(({\n em,\n cpqPricingService,\n cpqValidationService,\n cpqProductService,\n salesDocumentNumberGenerator,\n }: {\n em: EntityManager\n cpqPricingService: DefaultCpqPricingService\n cpqValidationService: DefaultCpqValidationService\n cpqProductService: DefaultCpqProductService\n salesDocumentNumberGenerator: SalesDocumentNumberGenerator\n }) => {\n return new DefaultCpqQuotingService({\n em: container.resolve('em'),\n cpqPricingService: container.resolve('cpqPricingService'),\n cpqValidationService: container.resolve('cpqValidationService'),\n cpqProductService: container.resolve('cpqProductService'),\n salesDocumentNumberGenerator: container.resolve('salesDocumentNumberGenerator'),\n })\n }).scoped().proxy(),\n cpqInventoryService: asFunction(() => {\n return new DefaultCpqInventoryService(container.resolve('em'))\n }).scoped(),\n cpqOrderService: asFunction(() => {\n return new DefaultCpqOrderService({\n em: container.resolve('em'),\n cpqInventoryService: container.resolve('cpqInventoryService'),\n salesDocumentNumberGenerator: container.resolve('salesDocumentNumberGenerator'),\n })\n }).scoped(),\n cpqWizardService: asFunction(({ em }: { em: EntityManager }) => {\n return new DefaultCpqWizardService(em)\n }).scoped().proxy(),\n cpqBundleService: asFunction(() => {\n return new DefaultCpqBundleService(container.resolve('em'))\n }).scoped(),\n })\n}\n"],
5
- "mappings": "AAAA,SAAS,kBAAkB;AAI3B,SAAS,gCAAgC;AACzC,SAAS,mCAAmC;AAC5C,SAAS,gCAAgC;AACzC,SAAS,gCAAgC;AACzC,SAAS,+BAA+B;AACxC,SAAS,kCAAkC;AAC3C,SAAS,8BAA8B;AACvC,SAAS,+BAA+B;AASjC,SAAS,SAAS,WAAyB;AAChD,YAAU,SAAS;AAAA,IACjB,mBAAmB,WAAW,CAAC,EAAE,GAAG,MAA6B;AAC/D,aAAO,IAAI,yBAAyB,EAAE;AAAA,IACxC,CAAC,EAAE,OAAO,EAAE,MAAM;AAAA,IAClB,sBAAsB,WAAW,CAAC,EAAE,GAAG,MAA6B;AAClE,aAAO,IAAI,4BAA4B,EAAE;AAAA,IAC3C,CAAC,EAAE,OAAO,EAAE,MAAM;AAAA,IAClB,mBAAmB,WAAW,CAAC,EAAE,GAAG,MAA6B;AAC/D,aAAO,IAAI,yBAAyB,EAAE;AAAA,IACxC,CAAC,EAAE,OAAO,EAAE,MAAM;AAAA,IAClB,mBAAmB,WAAW,CAAC;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAMM;AACJ,aAAO,IAAI,yBAAyB;AAAA,QAClC,IAAI,UAAU,QAAQ,IAAI;AAAA,QAC1B,mBAAmB,UAAU,QAAQ,mBAAmB;AAAA,QACxD,sBAAsB,UAAU,QAAQ,sBAAsB;AAAA,QAC9D,mBAAmB,UAAU,QAAQ,mBAAmB;AAAA,QACxD,8BAA8B,UAAU,QAAQ,8BAA8B;AAAA,MAChF,CAAC;AAAA,IACH,CAAC,EAAE,OAAO,EAAE,MAAM;AAAA,IAClB,qBAAqB,WAAW,MAAM;AACpC,aAAO,IAAI,2BAA2B,UAAU,QAAQ,IAAI,CAAC;AAAA,IAC/D,CAAC,EAAE,OAAO;AAAA,IACV,iBAAiB,WAAW,MAAM;AAChC,aAAO,IAAI,uBAAuB;AAAA,QAChC,IAAI,UAAU,QAAQ,IAAI;AAAA,QAC1B,qBAAqB,UAAU,QAAQ,qBAAqB;AAAA,QAC5D,8BAA8B,UAAU,QAAQ,8BAA8B;AAAA,MAChF,CAAC;AAAA,IACH,CAAC,EAAE,OAAO;AAAA,IACV,kBAAkB,WAAW,CAAC,EAAE,GAAG,MAA6B;AAC9D,aAAO,IAAI,wBAAwB,EAAE;AAAA,IACvC,CAAC,EAAE,OAAO,EAAE,MAAM;AAAA,IAClB,kBAAkB,WAAW,MAAM;AACjC,aAAO,IAAI,wBAAwB,UAAU,QAAQ,IAAI,CAAC;AAAA,IAC5D,CAAC,EAAE,OAAO;AAAA,EACZ,CAAC;AACH;",
4
+ "sourcesContent": ["import { asFunction } from 'awilix'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport type { AppContainer } from '@open-mercato/shared/lib/di/container'\nimport type { SalesDocumentNumberGenerator } from '@open-mercato/core/modules/sales/services/salesDocumentNumberGenerator'\nimport { DefaultCpqPricingService } from './services/cpqPricingService'\nimport { DefaultCpqValidationService } from './services/cpqValidationService'\nimport { DefaultCpqProductService } from './services/cpqProductService'\nimport { DefaultCpqQuotingService } from './services/cpqQuotingService'\nimport { DefaultCpqWizardService } from './services/cpqWizardService'\nimport { DefaultCpqInventoryService } from './services/cpqInventoryService'\nimport { DefaultCpqOrderService } from './services/cpqOrderService'\nimport { CpqAdjustmentService } from './services/priceAdjustments/adjustmentService'\nimport { DefaultCpqBundleService } from './services/cpqBundleService'\n\n/**\n * Resolve dependencies from the container closure rather than via destructured\n * factory parameters. The container uses InjectionMode.CLASSIC, and Turbopack\n * transpiles destructured arrow functions in a way that breaks Awilix's\n * parameter-name parser. Core modules are unaffected because they ship\n * pre-compiled in node_modules.\n */\nexport function register(container: AppContainer) {\n container.register({\n cpqAdjustmentService: asFunction(() => new CpqAdjustmentService({\n em: container.resolve('em'),\n quotingService: container.resolve('cpqQuotingService'),\n featureTogglesService: container.resolve('featureTogglesService'),\n })).scoped(),\n cpqPricingService: asFunction(({ em }: { em: EntityManager }) => {\n return new DefaultCpqPricingService(em)\n }).scoped().proxy(),\n cpqValidationService: asFunction(({ em }: { em: EntityManager }) => {\n return new DefaultCpqValidationService(em)\n }).scoped().proxy(),\n cpqProductService: asFunction(({ em }: { em: EntityManager }) => {\n return new DefaultCpqProductService(em)\n }).scoped().proxy(),\n cpqQuotingService: asFunction(({\n em,\n cpqPricingService,\n cpqValidationService,\n cpqProductService,\n salesDocumentNumberGenerator,\n }: {\n em: EntityManager\n cpqPricingService: DefaultCpqPricingService\n cpqValidationService: DefaultCpqValidationService\n cpqProductService: DefaultCpqProductService\n salesDocumentNumberGenerator: SalesDocumentNumberGenerator\n }) => {\n return new DefaultCpqQuotingService({\n em: container.resolve('em'),\n cpqPricingService: container.resolve('cpqPricingService'),\n cpqValidationService: container.resolve('cpqValidationService'),\n cpqProductService: container.resolve('cpqProductService'),\n salesDocumentNumberGenerator: container.resolve('salesDocumentNumberGenerator'),\n })\n }).scoped().proxy(),\n cpqInventoryService: asFunction(() => {\n return new DefaultCpqInventoryService(container.resolve('em'))\n }).scoped(),\n cpqOrderService: asFunction(() => {\n return new DefaultCpqOrderService({\n em: container.resolve('em'),\n cpqInventoryService: container.resolve('cpqInventoryService'),\n salesDocumentNumberGenerator: container.resolve('salesDocumentNumberGenerator'),\n })\n }).scoped(),\n cpqWizardService: asFunction(({ em }: { em: EntityManager }) => {\n return new DefaultCpqWizardService(em)\n }).scoped().proxy(),\n cpqBundleService: asFunction(() => {\n return new DefaultCpqBundleService(container.resolve('em'))\n }).scoped(),\n })\n}\n"],
5
+ "mappings": "AAAA,SAAS,kBAAkB;AAI3B,SAAS,gCAAgC;AACzC,SAAS,mCAAmC;AAC5C,SAAS,gCAAgC;AACzC,SAAS,gCAAgC;AACzC,SAAS,+BAA+B;AACxC,SAAS,kCAAkC;AAC3C,SAAS,8BAA8B;AACvC,SAAS,4BAA4B;AACrC,SAAS,+BAA+B;AASjC,SAAS,SAAS,WAAyB;AAChD,YAAU,SAAS;AAAA,IACjB,sBAAsB,WAAW,MAAM,IAAI,qBAAqB;AAAA,MAC9D,IAAI,UAAU,QAAQ,IAAI;AAAA,MAC1B,gBAAgB,UAAU,QAAQ,mBAAmB;AAAA,MACrD,uBAAuB,UAAU,QAAQ,uBAAuB;AAAA,IAClE,CAAC,CAAC,EAAE,OAAO;AAAA,IACX,mBAAmB,WAAW,CAAC,EAAE,GAAG,MAA6B;AAC/D,aAAO,IAAI,yBAAyB,EAAE;AAAA,IACxC,CAAC,EAAE,OAAO,EAAE,MAAM;AAAA,IAClB,sBAAsB,WAAW,CAAC,EAAE,GAAG,MAA6B;AAClE,aAAO,IAAI,4BAA4B,EAAE;AAAA,IAC3C,CAAC,EAAE,OAAO,EAAE,MAAM;AAAA,IAClB,mBAAmB,WAAW,CAAC,EAAE,GAAG,MAA6B;AAC/D,aAAO,IAAI,yBAAyB,EAAE;AAAA,IACxC,CAAC,EAAE,OAAO,EAAE,MAAM;AAAA,IAClB,mBAAmB,WAAW,CAAC;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAMM;AACJ,aAAO,IAAI,yBAAyB;AAAA,QAClC,IAAI,UAAU,QAAQ,IAAI;AAAA,QAC1B,mBAAmB,UAAU,QAAQ,mBAAmB;AAAA,QACxD,sBAAsB,UAAU,QAAQ,sBAAsB;AAAA,QAC9D,mBAAmB,UAAU,QAAQ,mBAAmB;AAAA,QACxD,8BAA8B,UAAU,QAAQ,8BAA8B;AAAA,MAChF,CAAC;AAAA,IACH,CAAC,EAAE,OAAO,EAAE,MAAM;AAAA,IAClB,qBAAqB,WAAW,MAAM;AACpC,aAAO,IAAI,2BAA2B,UAAU,QAAQ,IAAI,CAAC;AAAA,IAC/D,CAAC,EAAE,OAAO;AAAA,IACV,iBAAiB,WAAW,MAAM;AAChC,aAAO,IAAI,uBAAuB;AAAA,QAChC,IAAI,UAAU,QAAQ,IAAI;AAAA,QAC1B,qBAAqB,UAAU,QAAQ,qBAAqB;AAAA,QAC5D,8BAA8B,UAAU,QAAQ,8BAA8B;AAAA,MAChF,CAAC;AAAA,IACH,CAAC,EAAE,OAAO;AAAA,IACV,kBAAkB,WAAW,CAAC,EAAE,GAAG,MAA6B;AAC9D,aAAO,IAAI,wBAAwB,EAAE;AAAA,IACvC,CAAC,EAAE,OAAO,EAAE,MAAM;AAAA,IAClB,kBAAkB,WAAW,MAAM;AACjC,aAAO,IAAI,wBAAwB,UAAU,QAAQ,IAAI,CAAC;AAAA,IAC5D,CAAC,EAAE,OAAO;AAAA,EACZ,CAAC;AACH;",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,23 @@
1
1
  import { createModuleEvents } from "@open-mercato/shared/modules/events";
2
+ const quotePricingSnapshotFields = [
3
+ { path: "tenantId", type: "text" },
4
+ { path: "organizationId", type: "text" },
5
+ { path: "quoteId", type: "text", label: "CPQ quote id" },
6
+ { path: "quoteType", type: "select", label: "Quote type" },
7
+ { path: "cpqStatus", type: "text", label: "Status" },
8
+ { path: "currencyCode", type: "text" },
9
+ { path: "pricingRevision", type: "number" },
10
+ { path: "snapshotHash", type: "text" },
11
+ { path: "dealValue.list", type: "number", label: "Deal value (list)" },
12
+ { path: "dealValue.standard", type: "number", label: "Deal value (standard)" },
13
+ { path: "dealValue.offer", type: "number", label: "Deal value (offer)" },
14
+ { path: "discountDepth.rule", type: "number", label: "Rule discount depth", optional: true },
15
+ { path: "discountDepth.manual", type: "number", label: "Manual discount depth", optional: true },
16
+ { path: "discountDepth.total", type: "number", label: "Total discount depth", optional: true },
17
+ { path: "discountDepth.maxLineManual", type: "number", label: "Max line manual discount depth", optional: true },
18
+ { path: "hasTimeBasedAdjustments", type: "boolean" },
19
+ { path: "occurredAt", type: "date" }
20
+ ];
2
21
  const events = [
3
22
  {
4
23
  id: "cpq.subscription.activated",
@@ -41,6 +60,34 @@ const events = [
41
60
  entity: "subscription",
42
61
  category: "lifecycle",
43
62
  clientBroadcast: true
63
+ },
64
+ // Quote pricing signals (manual price adjustments). Emitted after the quote
65
+ // write commits by `withQuotePricingWrite`; payload carries the pricing
66
+ // snapshot (deal value, discount depth, snapshot hash) so project workflows
67
+ // can route approvals without CPQ code.
68
+ {
69
+ id: "cpq.quote.pricing_changed",
70
+ label: "Quote Pricing Changed",
71
+ entity: "quote",
72
+ category: "custom",
73
+ clientBroadcast: true,
74
+ payloadSchema: { fields: [...quotePricingSnapshotFields, { path: "cause", type: "select" }] }
75
+ },
76
+ {
77
+ id: "cpq.quote.status_changed",
78
+ label: "Quote Status Changed",
79
+ entity: "quote",
80
+ category: "lifecycle",
81
+ clientBroadcast: true,
82
+ payloadSchema: {
83
+ fields: [
84
+ ...quotePricingSnapshotFields,
85
+ { path: "fromStatus", type: "text" },
86
+ { path: "toStatus", type: "text" },
87
+ { path: "cause", type: "select" },
88
+ { path: "actorUserId", type: "text", optional: true }
89
+ ]
90
+ }
44
91
  }
45
92
  ];
46
93
  const eventsConfig = createModuleEvents({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/modules/cpq/events.ts"],
4
- "sourcesContent": ["import { createModuleEvents } from '@open-mercato/shared/modules/events'\n\n/**\n * CPQ Module Events.\n *\n * Subscription lifecycle events: `activated` (new-sale onboarding) plus\n * the XD-250 ARC (Amend / Renew / Cancel / merge) events. Downstream\n * modules (billing, notifications) subscribe to these to react to\n * subscription mutations driven by CPQ orders.\n *\n * Emission rule: events fire AFTER the activation transaction commits.\n * `cpqOrderService.activateOrder` is the sole emitter site.\n */\nconst events = [\n {\n id: 'cpq.subscription.activated',\n label: 'Subscription Activated',\n entity: 'subscription',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n {\n id: 'cpq.subscription.amended',\n label: 'Subscription Amended',\n entity: 'subscription',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n {\n id: 'cpq.subscription.renewed',\n label: 'Subscription Renewed',\n entity: 'subscription',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n {\n id: 'cpq.subscription.merged',\n label: 'Subscription Merged',\n entity: 'subscription',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n {\n id: 'cpq.subscription.cancelled',\n label: 'Subscription Cancelled',\n entity: 'subscription',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n {\n id: 'cpq.subscription.superseded',\n label: 'Subscription Superseded',\n entity: 'subscription',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n] as const\n\nexport const eventsConfig = createModuleEvents({\n moduleId: 'cpq',\n events,\n})\n\n/** Type-safe event emitter for the CPQ module. */\nexport const emitCpqEvent = eventsConfig.emit\n\n/** Event IDs that can be emitted by the CPQ module. */\nexport type CpqEventId = (typeof events)[number]['id']\n\nexport default eventsConfig\n"],
5
- "mappings": "AAAA,SAAS,0BAA0B;AAanC,MAAM,SAAS;AAAA,EACb;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AACF;AAEO,MAAM,eAAe,mBAAmB;AAAA,EAC7C,UAAU;AAAA,EACV;AACF,CAAC;AAGM,MAAM,eAAe,aAAa;AAKzC,IAAO,iBAAQ;",
4
+ "sourcesContent": ["import { createModuleEvents } from '@open-mercato/shared/modules/events'\nimport type { EventPayloadSchemaField } from '@open-mercato/shared/modules/events'\n\n/** Fields shared by both quote pricing signals (see `quotePricingEvents.ts`). */\nconst quotePricingSnapshotFields: EventPayloadSchemaField[] = [\n { path: 'tenantId', type: 'text' },\n { path: 'organizationId', type: 'text' },\n { path: 'quoteId', type: 'text', label: 'CPQ quote id' },\n { path: 'quoteType', type: 'select', label: 'Quote type' },\n { path: 'cpqStatus', type: 'text', label: 'Status' },\n { path: 'currencyCode', type: 'text' },\n { path: 'pricingRevision', type: 'number' },\n { path: 'snapshotHash', type: 'text' },\n { path: 'dealValue.list', type: 'number', label: 'Deal value (list)' },\n { path: 'dealValue.standard', type: 'number', label: 'Deal value (standard)' },\n { path: 'dealValue.offer', type: 'number', label: 'Deal value (offer)' },\n { path: 'discountDepth.rule', type: 'number', label: 'Rule discount depth', optional: true },\n { path: 'discountDepth.manual', type: 'number', label: 'Manual discount depth', optional: true },\n { path: 'discountDepth.total', type: 'number', label: 'Total discount depth', optional: true },\n { path: 'discountDepth.maxLineManual', type: 'number', label: 'Max line manual discount depth', optional: true },\n { path: 'hasTimeBasedAdjustments', type: 'boolean' },\n { path: 'occurredAt', type: 'date' },\n]\n\n/**\n * CPQ Module Events.\n *\n * Subscription lifecycle events: `activated` (new-sale onboarding) plus\n * the XD-250 ARC (Amend / Renew / Cancel / merge) events. Downstream\n * modules (billing, notifications) subscribe to these to react to\n * subscription mutations driven by CPQ orders.\n *\n * Emission rule: events fire AFTER their transaction commits.\n * Subscription events: `cpqOrderService.activateOrder` is the sole emitter.\n * Quote events: `withQuotePricingWrite` (plus `cloneQuote` for the copy).\n */\nconst events = [\n {\n id: 'cpq.subscription.activated',\n label: 'Subscription Activated',\n entity: 'subscription',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n {\n id: 'cpq.subscription.amended',\n label: 'Subscription Amended',\n entity: 'subscription',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n {\n id: 'cpq.subscription.renewed',\n label: 'Subscription Renewed',\n entity: 'subscription',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n {\n id: 'cpq.subscription.merged',\n label: 'Subscription Merged',\n entity: 'subscription',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n {\n id: 'cpq.subscription.cancelled',\n label: 'Subscription Cancelled',\n entity: 'subscription',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n {\n id: 'cpq.subscription.superseded',\n label: 'Subscription Superseded',\n entity: 'subscription',\n category: 'lifecycle',\n clientBroadcast: true,\n },\n // Quote pricing signals (manual price adjustments). Emitted after the quote\n // write commits by `withQuotePricingWrite`; payload carries the pricing\n // snapshot (deal value, discount depth, snapshot hash) so project workflows\n // can route approvals without CPQ code.\n {\n id: 'cpq.quote.pricing_changed',\n label: 'Quote Pricing Changed',\n entity: 'quote',\n category: 'custom',\n clientBroadcast: true,\n payloadSchema: { fields: [...quotePricingSnapshotFields, { path: 'cause', type: 'select' }] },\n },\n {\n id: 'cpq.quote.status_changed',\n label: 'Quote Status Changed',\n entity: 'quote',\n category: 'lifecycle',\n clientBroadcast: true,\n payloadSchema: {\n fields: [\n ...quotePricingSnapshotFields,\n { path: 'fromStatus', type: 'text' },\n { path: 'toStatus', type: 'text' },\n { path: 'cause', type: 'select' },\n { path: 'actorUserId', type: 'text', optional: true },\n ],\n },\n },\n] as const\n\nexport const eventsConfig = createModuleEvents({\n moduleId: 'cpq',\n events,\n})\n\n/** Type-safe event emitter for the CPQ module. */\nexport const emitCpqEvent = eventsConfig.emit\n\n/** Event IDs that can be emitted by the CPQ module. */\nexport type CpqEventId = (typeof events)[number]['id']\n\nexport default eventsConfig\n"],
5
+ "mappings": "AAAA,SAAS,0BAA0B;AAInC,MAAM,6BAAwD;AAAA,EAC5D,EAAE,MAAM,YAAY,MAAM,OAAO;AAAA,EACjC,EAAE,MAAM,kBAAkB,MAAM,OAAO;AAAA,EACvC,EAAE,MAAM,WAAW,MAAM,QAAQ,OAAO,eAAe;AAAA,EACvD,EAAE,MAAM,aAAa,MAAM,UAAU,OAAO,aAAa;AAAA,EACzD,EAAE,MAAM,aAAa,MAAM,QAAQ,OAAO,SAAS;AAAA,EACnD,EAAE,MAAM,gBAAgB,MAAM,OAAO;AAAA,EACrC,EAAE,MAAM,mBAAmB,MAAM,SAAS;AAAA,EAC1C,EAAE,MAAM,gBAAgB,MAAM,OAAO;AAAA,EACrC,EAAE,MAAM,kBAAkB,MAAM,UAAU,OAAO,oBAAoB;AAAA,EACrE,EAAE,MAAM,sBAAsB,MAAM,UAAU,OAAO,wBAAwB;AAAA,EAC7E,EAAE,MAAM,mBAAmB,MAAM,UAAU,OAAO,qBAAqB;AAAA,EACvE,EAAE,MAAM,sBAAsB,MAAM,UAAU,OAAO,uBAAuB,UAAU,KAAK;AAAA,EAC3F,EAAE,MAAM,wBAAwB,MAAM,UAAU,OAAO,yBAAyB,UAAU,KAAK;AAAA,EAC/F,EAAE,MAAM,uBAAuB,MAAM,UAAU,OAAO,wBAAwB,UAAU,KAAK;AAAA,EAC7F,EAAE,MAAM,+BAA+B,MAAM,UAAU,OAAO,kCAAkC,UAAU,KAAK;AAAA,EAC/G,EAAE,MAAM,2BAA2B,MAAM,UAAU;AAAA,EACnD,EAAE,MAAM,cAAc,MAAM,OAAO;AACrC;AAcA,MAAM,SAAS;AAAA,EACb;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,eAAe,EAAE,QAAQ,CAAC,GAAG,4BAA4B,EAAE,MAAM,SAAS,MAAM,SAAS,CAAC,EAAE;AAAA,EAC9F;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,eAAe;AAAA,MACb,QAAQ;AAAA,QACN,GAAG;AAAA,QACH,EAAE,MAAM,cAAc,MAAM,OAAO;AAAA,QACnC,EAAE,MAAM,YAAY,MAAM,OAAO;AAAA,QACjC,EAAE,MAAM,SAAS,MAAM,SAAS;AAAA,QAChC,EAAE,MAAM,eAAe,MAAM,QAAQ,UAAU,KAAK;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,eAAe,mBAAmB;AAAA,EAC7C,UAAU;AAAA,EACV;AACF,CAAC;AAGM,MAAM,eAAe,aAAa;AAKzC,IAAO,iBAAQ;",
6
6
  "names": []
7
7
  }
@@ -5,7 +5,7 @@ const metadata = {
5
5
  description: "Generic CPQ engine \u2014 configurable product attributes, multi-charge pricing tables, and guided quoting flows.",
6
6
  author: "App",
7
7
  license: "Proprietary",
8
- requires: ["auth", "directory", "catalog", "sales", "customers", "dictionaries"],
8
+ requires: ["auth", "directory", "catalog", "sales", "customers", "dictionaries", "feature_toggles"],
9
9
  ejectable: false
10
10
  };
11
11
  import { features } from "./acl.js";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/modules/cpq/index.ts"],
4
- "sourcesContent": ["import type { ModuleInfo } from '@open-mercato/shared/modules/registry'\n\nexport const metadata: ModuleInfo = {\n name: 'cpq',\n title: 'Configure, Price, Quote',\n version: '0.1.0',\n description:\n 'Generic CPQ engine \u2014 configurable product attributes, multi-charge pricing tables, and guided quoting flows.',\n author: 'App',\n license: 'Proprietary',\n requires: ['auth', 'directory', 'catalog', 'sales', 'customers', 'dictionaries'],\n ejectable: false,\n}\n\nexport { features } from './acl'\n"],
5
- "mappings": "AAEO,MAAM,WAAuB;AAAA,EAClC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,aACE;AAAA,EACF,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU,CAAC,QAAQ,aAAa,WAAW,SAAS,aAAa,cAAc;AAAA,EAC/E,WAAW;AACb;AAEA,SAAS,gBAAgB;",
4
+ "sourcesContent": ["import type { ModuleInfo } from '@open-mercato/shared/modules/registry'\n\nexport const metadata: ModuleInfo = {\n name: 'cpq',\n title: 'Configure, Price, Quote',\n version: '0.1.0',\n description:\n 'Generic CPQ engine \u2014 configurable product attributes, multi-charge pricing tables, and guided quoting flows.',\n author: 'App',\n license: 'Proprietary',\n requires: ['auth', 'directory', 'catalog', 'sales', 'customers', 'dictionaries', 'feature_toggles'],\n ejectable: false,\n}\n\nexport { features } from './acl'\n"],
5
+ "mappings": "AAEO,MAAM,WAAuB;AAAA,EAClC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,aACE;AAAA,EACF,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU,CAAC,QAAQ,aAAa,WAAW,SAAS,aAAa,gBAAgB,iBAAiB;AAAA,EAClG,WAAW;AACb;AAEA,SAAS,gBAAgB;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,10 @@
1
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
2
+ function resolveAuditActor(auth) {
3
+ if (auth?.sub && UUID.test(auth.sub)) return auth.sub;
4
+ if (auth?.userId && UUID.test(auth.userId)) return auth.userId;
5
+ return null;
6
+ }
7
+ export {
8
+ resolveAuditActor
9
+ };
10
+ //# sourceMappingURL=auditActor.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/cpq/lib/auditActor.ts"],
4
+ "sourcesContent": ["const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\n/**\n * The user id to record as author. Sessions carry the user id in `sub`;\n * API keys carry `api_key:<id>` in `sub` and the owning user (if any) in\n * `userId`. Returns null when no user is behind the request, so callers can\n * refuse cleanly instead of writing a non-uuid into a uuid column.\n */\nexport function resolveAuditActor(auth: { sub?: string | null; userId?: string | null } | null | undefined): string | null {\n if (auth?.sub && UUID.test(auth.sub)) return auth.sub\n if (auth?.userId && UUID.test(auth.userId)) return auth.userId\n return null\n}\n"],
5
+ "mappings": "AAAA,MAAM,OAAO;AAQN,SAAS,kBAAkB,MAAyF;AACzH,MAAI,MAAM,OAAO,KAAK,KAAK,KAAK,GAAG,EAAG,QAAO,KAAK;AAClD,MAAI,MAAM,UAAU,KAAK,KAAK,KAAK,MAAM,EAAG,QAAO,KAAK;AACxD,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ function formatMoney(amount, currency) {
2
+ return new Intl.NumberFormat("en-US", { style: "currency", currency }).format(amount);
3
+ }
4
+ export {
5
+ formatMoney
6
+ };
7
+ //# sourceMappingURL=formatMoney.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/cpq/lib/formatMoney.ts"],
4
+ "sourcesContent": ["/** Currency amount as shown across CPQ detail pages, e.g. `$1,130.00`. */\nexport function formatMoney(amount: number, currency: string): string {\n return new Intl.NumberFormat('en-US', { style: 'currency', currency }).format(amount)\n}\n"],
5
+ "mappings": "AACO,SAAS,YAAY,QAAgB,UAA0B;AACpE,SAAO,IAAI,KAAK,aAAa,SAAS,EAAE,OAAO,YAAY,SAAS,CAAC,EAAE,OAAO,MAAM;AACtF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,60 @@
1
+ import { findOneWithDecryption, findWithDecryption } from "@open-mercato/shared/lib/encryption/find";
2
+ import { Dictionary, DictionaryEntry } from "@open-mercato/core/modules/dictionaries/data/entities";
3
+ import { FeatureToggle } from "@open-mercato/core/modules/feature_toggles/data/entities";
4
+ import { ADJUSTMENT_TOGGLE, REASON_DICTIONARY, DEFAULT_ADJUSTMENT_REASONS } from "../data/price-adjustments.js";
5
+ async function seedPriceAdjustmentDefaults(em, scope) {
6
+ const now = /* @__PURE__ */ new Date();
7
+ await em.upsert(
8
+ FeatureToggle,
9
+ {
10
+ identifier: ADJUSTMENT_TOGGLE,
11
+ name: "CPQ manual price adjustments",
12
+ type: "boolean",
13
+ defaultValue: true,
14
+ category: "CPQ",
15
+ createdAt: now,
16
+ updatedAt: now
17
+ },
18
+ { onConflictFields: ["identifier"], onConflictAction: "ignore" }
19
+ );
20
+ let dictionary = await findOneWithDecryption(em, Dictionary, { ...scope, key: REASON_DICTIONARY }, void 0, scope);
21
+ if (!dictionary) {
22
+ dictionary = em.create(Dictionary, {
23
+ ...scope,
24
+ key: REASON_DICTIONARY,
25
+ name: "Price adjustment reasons",
26
+ description: "Reasons for negotiated prices on quotes.",
27
+ managerVisibility: "default",
28
+ isSystem: false,
29
+ isActive: true,
30
+ createdAt: /* @__PURE__ */ new Date(),
31
+ updatedAt: /* @__PURE__ */ new Date()
32
+ });
33
+ em.persist(dictionary);
34
+ await em.flush();
35
+ }
36
+ if (dictionary.deletedAt) return;
37
+ const existing = await findWithDecryption(em, DictionaryEntry, {
38
+ ...scope,
39
+ dictionary: dictionary.id,
40
+ normalizedValue: { $in: DEFAULT_ADJUSTMENT_REASONS.map((entry) => entry.value) }
41
+ }, { limit: DEFAULT_ADJUSTMENT_REASONS.length }, scope);
42
+ const values = new Set(existing.map((entry) => entry.normalizedValue));
43
+ for (const [position, entry] of DEFAULT_ADJUSTMENT_REASONS.entries()) {
44
+ if (!values.has(entry.value)) {
45
+ em.persist(em.create(DictionaryEntry, {
46
+ ...scope,
47
+ dictionary,
48
+ value: entry.value,
49
+ normalizedValue: entry.value,
50
+ label: entry.label,
51
+ position
52
+ }));
53
+ }
54
+ }
55
+ await em.flush();
56
+ }
57
+ export {
58
+ seedPriceAdjustmentDefaults
59
+ };
60
+ //# sourceMappingURL=priceAdjustmentDefaults.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/cpq/lib/priceAdjustmentDefaults.ts"],
4
+ "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { Dictionary, DictionaryEntry } from '@open-mercato/core/modules/dictionaries/data/entities'\nimport { FeatureToggle } from '@open-mercato/core/modules/feature_toggles/data/entities'\nimport { ADJUSTMENT_TOGGLE, REASON_DICTIONARY, DEFAULT_ADJUSTMENT_REASONS } from '../data/price-adjustments'\nimport type { TenantScope } from '../services/types'\n\n/** Add missing defaults; never overwrite an operator's labels or disabled flags. */\nexport async function seedPriceAdjustmentDefaults(em: EntityManager, scope: TenantScope): Promise<void> {\n // Multiple tenants may initialize concurrently. Ignore an existing global\n // identifier (including disabled/deleted toggles), without resetting its value.\n // POJO upserts skip entity property initializers, so timestamps must be explicit\n // (`updated_at` is NOT NULL and only has an onUpdate hook).\n const now = new Date()\n await em.upsert(FeatureToggle, { identifier: ADJUSTMENT_TOGGLE, name: 'CPQ manual price adjustments',\n type: 'boolean', defaultValue: true, category: 'CPQ', createdAt: now, updatedAt: now },\n { onConflictFields: ['identifier'], onConflictAction: 'ignore' })\n let dictionary = await findOneWithDecryption(em, Dictionary, { ...scope, key: REASON_DICTIONARY }, undefined, scope)\n if (!dictionary) {\n dictionary = em.create(Dictionary, { ...scope, key: REASON_DICTIONARY, name: 'Price adjustment reasons',\n description: 'Reasons for negotiated prices on quotes.', managerVisibility: 'default', isSystem: false, isActive: true, createdAt: new Date(), updatedAt: new Date() })\n em.persist(dictionary)\n await em.flush()\n }\n if (dictionary.deletedAt) return\n const existing = await findWithDecryption(em, DictionaryEntry, { ...scope, dictionary: dictionary.id,\n normalizedValue: { $in: DEFAULT_ADJUSTMENT_REASONS.map((entry) => entry.value) } }, { limit: DEFAULT_ADJUSTMENT_REASONS.length }, scope)\n const values = new Set(existing.map((entry) => entry.normalizedValue))\n for (const [position, entry] of DEFAULT_ADJUSTMENT_REASONS.entries()) {\n if (!values.has(entry.value)) {\n em.persist(em.create(DictionaryEntry, { ...scope, dictionary, value: entry.value,\n normalizedValue: entry.value, label: entry.label, position }))\n }\n }\n await em.flush()\n}\n"],
5
+ "mappings": "AACA,SAAS,uBAAuB,0BAA0B;AAC1D,SAAS,YAAY,uBAAuB;AAC5C,SAAS,qBAAqB;AAC9B,SAAS,mBAAmB,mBAAmB,kCAAkC;AAIjF,eAAsB,4BAA4B,IAAmB,OAAmC;AAKtG,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,GAAG;AAAA,IAAO;AAAA,IAAe;AAAA,MAAE,YAAY;AAAA,MAAmB,MAAM;AAAA,MACpE,MAAM;AAAA,MAAW,cAAc;AAAA,MAAM,UAAU;AAAA,MAAO,WAAW;AAAA,MAAK,WAAW;AAAA,IAAI;AAAA,IACrF,EAAE,kBAAkB,CAAC,YAAY,GAAG,kBAAkB,SAAS;AAAA,EAAC;AAClE,MAAI,aAAa,MAAM,sBAAsB,IAAI,YAAY,EAAE,GAAG,OAAO,KAAK,kBAAkB,GAAG,QAAW,KAAK;AACnH,MAAI,CAAC,YAAY;AACf,iBAAa,GAAG,OAAO,YAAY;AAAA,MAAE,GAAG;AAAA,MAAO,KAAK;AAAA,MAAmB,MAAM;AAAA,MAC3E,aAAa;AAAA,MAA4C,mBAAmB;AAAA,MAAW,UAAU;AAAA,MAAO,UAAU;AAAA,MAAM,WAAW,oBAAI,KAAK;AAAA,MAAG,WAAW,oBAAI,KAAK;AAAA,IAAE,CAAC;AACxK,OAAG,QAAQ,UAAU;AACrB,UAAM,GAAG,MAAM;AAAA,EACjB;AACA,MAAI,WAAW,UAAW;AAC1B,QAAM,WAAW,MAAM,mBAAmB,IAAI,iBAAiB;AAAA,IAAE,GAAG;AAAA,IAAO,YAAY,WAAW;AAAA,IAChG,iBAAiB,EAAE,KAAK,2BAA2B,IAAI,CAAC,UAAU,MAAM,KAAK,EAAE;AAAA,EAAE,GAAG,EAAE,OAAO,2BAA2B,OAAO,GAAG,KAAK;AACzI,QAAM,SAAS,IAAI,IAAI,SAAS,IAAI,CAAC,UAAU,MAAM,eAAe,CAAC;AACrE,aAAW,CAAC,UAAU,KAAK,KAAK,2BAA2B,QAAQ,GAAG;AACpE,QAAI,CAAC,OAAO,IAAI,MAAM,KAAK,GAAG;AAC5B,SAAG,QAAQ,GAAG,OAAO,iBAAiB;AAAA,QAAE,GAAG;AAAA,QAAO;AAAA,QAAY,OAAO,MAAM;AAAA,QACzE,iBAAiB,MAAM;AAAA,QAAO,OAAO,MAAM;AAAA,QAAO;AAAA,MAAS,CAAC,CAAC;AAAA,IACjE;AAAA,EACF;AACA,QAAM,GAAG,MAAM;AACjB;",
6
+ "names": []
7
+ }