@endora-commerce/contracts 0.100.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 (327) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +34 -0
  3. package/dist/actor.d.ts +79 -0
  4. package/dist/actor.d.ts.map +1 -0
  5. package/dist/actor.js +41 -0
  6. package/dist/actor.js.map +1 -0
  7. package/dist/addresses.d.ts +134 -0
  8. package/dist/addresses.d.ts.map +1 -0
  9. package/dist/addresses.js +16 -0
  10. package/dist/addresses.js.map +1 -0
  11. package/dist/admin-actions.d.ts +367 -0
  12. package/dist/admin-actions.d.ts.map +1 -0
  13. package/dist/admin-actions.js +287 -0
  14. package/dist/admin-actions.js.map +1 -0
  15. package/dist/admin-contributions.d.ts +518 -0
  16. package/dist/admin-contributions.d.ts.map +1 -0
  17. package/dist/admin-contributions.js +495 -0
  18. package/dist/admin-contributions.js.map +1 -0
  19. package/dist/admin-i18n.d.ts +135 -0
  20. package/dist/admin-i18n.d.ts.map +1 -0
  21. package/dist/admin-i18n.js +72 -0
  22. package/dist/admin-i18n.js.map +1 -0
  23. package/dist/admin-notifications.d.ts +55 -0
  24. package/dist/admin-notifications.d.ts.map +1 -0
  25. package/dist/admin-notifications.js +16 -0
  26. package/dist/admin-notifications.js.map +1 -0
  27. package/dist/admin-roles.d.ts +125 -0
  28. package/dist/admin-roles.d.ts.map +1 -0
  29. package/dist/admin-roles.js +2 -0
  30. package/dist/admin-roles.js.map +1 -0
  31. package/dist/admin-users.d.ts +178 -0
  32. package/dist/admin-users.d.ts.map +1 -0
  33. package/dist/admin-users.js +14 -0
  34. package/dist/admin-users.js.map +1 -0
  35. package/dist/admin.d.ts +243 -0
  36. package/dist/admin.d.ts.map +1 -0
  37. package/dist/admin.js +246 -0
  38. package/dist/admin.js.map +1 -0
  39. package/dist/analytics.d.ts +123 -0
  40. package/dist/analytics.d.ts.map +1 -0
  41. package/dist/analytics.js +68 -0
  42. package/dist/analytics.js.map +1 -0
  43. package/dist/api-keys.d.ts +97 -0
  44. package/dist/api-keys.d.ts.map +1 -0
  45. package/dist/api-keys.js +64 -0
  46. package/dist/api-keys.js.map +1 -0
  47. package/dist/assets-library.d.ts +684 -0
  48. package/dist/assets-library.d.ts.map +1 -0
  49. package/dist/assets-library.js +181 -0
  50. package/dist/assets-library.js.map +1 -0
  51. package/dist/audit-logs.d.ts +141 -0
  52. package/dist/audit-logs.d.ts.map +1 -0
  53. package/dist/audit-logs.js +31 -0
  54. package/dist/audit-logs.js.map +1 -0
  55. package/dist/auth.d.ts +174 -0
  56. package/dist/auth.d.ts.map +1 -0
  57. package/dist/auth.js +27 -0
  58. package/dist/auth.js.map +1 -0
  59. package/dist/blog.d.ts +669 -0
  60. package/dist/blog.d.ts.map +1 -0
  61. package/dist/blog.js +360 -0
  62. package/dist/blog.js.map +1 -0
  63. package/dist/capabilities.d.ts +40 -0
  64. package/dist/capabilities.d.ts.map +1 -0
  65. package/dist/capabilities.js +38 -0
  66. package/dist/capabilities.js.map +1 -0
  67. package/dist/carts.d.ts +1367 -0
  68. package/dist/carts.d.ts.map +1 -0
  69. package/dist/carts.js +405 -0
  70. package/dist/carts.js.map +1 -0
  71. package/dist/catalog.d.ts +2855 -0
  72. package/dist/catalog.d.ts.map +1 -0
  73. package/dist/catalog.js +1543 -0
  74. package/dist/catalog.js.map +1 -0
  75. package/dist/cms.d.ts +872 -0
  76. package/dist/cms.d.ts.map +1 -0
  77. package/dist/cms.js +468 -0
  78. package/dist/cms.js.map +1 -0
  79. package/dist/common.d.ts +82 -0
  80. package/dist/common.d.ts.map +1 -0
  81. package/dist/common.js +72 -0
  82. package/dist/common.js.map +1 -0
  83. package/dist/comparisons.d.ts +487 -0
  84. package/dist/comparisons.d.ts.map +1 -0
  85. package/dist/comparisons.js +221 -0
  86. package/dist/comparisons.js.map +1 -0
  87. package/dist/credentials.d.ts +292 -0
  88. package/dist/credentials.d.ts.map +1 -0
  89. package/dist/credentials.js +142 -0
  90. package/dist/credentials.js.map +1 -0
  91. package/dist/credit-limits.d.ts +111 -0
  92. package/dist/credit-limits.d.ts.map +1 -0
  93. package/dist/credit-limits.js +35 -0
  94. package/dist/credit-limits.js.map +1 -0
  95. package/dist/currencies.d.ts +127 -0
  96. package/dist/currencies.d.ts.map +1 -0
  97. package/dist/currencies.js +20 -0
  98. package/dist/currencies.js.map +1 -0
  99. package/dist/custom-fields.d.ts +345 -0
  100. package/dist/custom-fields.d.ts.map +1 -0
  101. package/dist/custom-fields.js +185 -0
  102. package/dist/custom-fields.js.map +1 -0
  103. package/dist/customer-accounts.d.ts +690 -0
  104. package/dist/customer-accounts.d.ts.map +1 -0
  105. package/dist/customer-accounts.js +41 -0
  106. package/dist/customer-accounts.js.map +1 -0
  107. package/dist/customers.d.ts +305 -0
  108. package/dist/customers.d.ts.map +1 -0
  109. package/dist/customers.js +158 -0
  110. package/dist/customers.js.map +1 -0
  111. package/dist/dictionary.d.ts +580 -0
  112. package/dist/dictionary.d.ts.map +1 -0
  113. package/dist/dictionary.js +297 -0
  114. package/dist/dictionary.js.map +1 -0
  115. package/dist/email-address.d.ts +62 -0
  116. package/dist/email-address.d.ts.map +1 -0
  117. package/dist/email-address.js +64 -0
  118. package/dist/email-address.js.map +1 -0
  119. package/dist/email.d.ts +175 -0
  120. package/dist/email.d.ts.map +1 -0
  121. package/dist/email.js +45 -0
  122. package/dist/email.js.map +1 -0
  123. package/dist/envelopes.d.ts +15 -0
  124. package/dist/envelopes.d.ts.map +1 -0
  125. package/dist/envelopes.js +16 -0
  126. package/dist/envelopes.js.map +1 -0
  127. package/dist/environment-inputs.d.ts +306 -0
  128. package/dist/environment-inputs.d.ts.map +1 -0
  129. package/dist/environment-inputs.js +277 -0
  130. package/dist/environment-inputs.js.map +1 -0
  131. package/dist/erp-connector.d.ts +52 -0
  132. package/dist/erp-connector.d.ts.map +1 -0
  133. package/dist/erp-connector.js +34 -0
  134. package/dist/erp-connector.js.map +1 -0
  135. package/dist/errors.d.ts +455 -0
  136. package/dist/errors.d.ts.map +1 -0
  137. package/dist/errors.js +532 -0
  138. package/dist/errors.js.map +1 -0
  139. package/dist/google-analytics.d.ts +181 -0
  140. package/dist/google-analytics.d.ts.map +1 -0
  141. package/dist/google-analytics.js +176 -0
  142. package/dist/google-analytics.js.map +1 -0
  143. package/dist/google-tag-manager.d.ts +111 -0
  144. package/dist/google-tag-manager.d.ts.map +1 -0
  145. package/dist/google-tag-manager.js +129 -0
  146. package/dist/google-tag-manager.js.map +1 -0
  147. package/dist/i18n.d.ts +69 -0
  148. package/dist/i18n.d.ts.map +1 -0
  149. package/dist/i18n.js +59 -0
  150. package/dist/i18n.js.map +1 -0
  151. package/dist/import-export.d.ts +63 -0
  152. package/dist/import-export.d.ts.map +1 -0
  153. package/dist/import-export.js +37 -0
  154. package/dist/import-export.js.map +1 -0
  155. package/dist/index.d.ts +82 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +126 -0
  158. package/dist/index.js.map +1 -0
  159. package/dist/inventory.d.ts +673 -0
  160. package/dist/inventory.d.ts.map +1 -0
  161. package/dist/inventory.js +412 -0
  162. package/dist/inventory.js.map +1 -0
  163. package/dist/invoice-ledger.d.ts +366 -0
  164. package/dist/invoice-ledger.d.ts.map +1 -0
  165. package/dist/invoice-ledger.js +114 -0
  166. package/dist/invoice-ledger.js.map +1 -0
  167. package/dist/invoices.d.ts +845 -0
  168. package/dist/invoices.d.ts.map +1 -0
  169. package/dist/invoices.js +314 -0
  170. package/dist/invoices.js.map +1 -0
  171. package/dist/kernel.d.ts +49 -0
  172. package/dist/kernel.d.ts.map +1 -0
  173. package/dist/kernel.js +19 -0
  174. package/dist/kernel.js.map +1 -0
  175. package/dist/languages.d.ts +122 -0
  176. package/dist/languages.d.ts.map +1 -0
  177. package/dist/languages.js +24 -0
  178. package/dist/languages.js.map +1 -0
  179. package/dist/linkedin-ads.d.ts +167 -0
  180. package/dist/linkedin-ads.d.ts.map +1 -0
  181. package/dist/linkedin-ads.js +156 -0
  182. package/dist/linkedin-ads.js.map +1 -0
  183. package/dist/megamenu.d.ts +556 -0
  184. package/dist/megamenu.d.ts.map +1 -0
  185. package/dist/megamenu.js +186 -0
  186. package/dist/megamenu.js.map +1 -0
  187. package/dist/meta-ads.d.ts +126 -0
  188. package/dist/meta-ads.d.ts.map +1 -0
  189. package/dist/meta-ads.js +112 -0
  190. package/dist/meta-ads.js.map +1 -0
  191. package/dist/mfa.d.ts +274 -0
  192. package/dist/mfa.d.ts.map +1 -0
  193. package/dist/mfa.js +187 -0
  194. package/dist/mfa.js.map +1 -0
  195. package/dist/modules.d.ts +1706 -0
  196. package/dist/modules.d.ts.map +1 -0
  197. package/dist/modules.js +1390 -0
  198. package/dist/modules.js.map +1 -0
  199. package/dist/newsletter.d.ts +611 -0
  200. package/dist/newsletter.d.ts.map +1 -0
  201. package/dist/newsletter.js +345 -0
  202. package/dist/newsletter.js.map +1 -0
  203. package/dist/orders.d.ts +1175 -0
  204. package/dist/orders.d.ts.map +1 -0
  205. package/dist/orders.js +630 -0
  206. package/dist/orders.js.map +1 -0
  207. package/dist/organizations.d.ts +938 -0
  208. package/dist/organizations.d.ts.map +1 -0
  209. package/dist/organizations.js +418 -0
  210. package/dist/organizations.js.map +1 -0
  211. package/dist/pagination.d.ts +21 -0
  212. package/dist/pagination.d.ts.map +1 -0
  213. package/dist/pagination.js +22 -0
  214. package/dist/pagination.js.map +1 -0
  215. package/dist/payment-methods.d.ts +472 -0
  216. package/dist/payment-methods.d.ts.map +1 -0
  217. package/dist/payment-methods.js +175 -0
  218. package/dist/payment-methods.js.map +1 -0
  219. package/dist/payment-return-url.d.ts +53 -0
  220. package/dist/payment-return-url.d.ts.map +1 -0
  221. package/dist/payment-return-url.js +35 -0
  222. package/dist/payment-return-url.js.map +1 -0
  223. package/dist/payments.d.ts +386 -0
  224. package/dist/payments.d.ts.map +1 -0
  225. package/dist/payments.js +84 -0
  226. package/dist/payments.js.map +1 -0
  227. package/dist/pim-connector.d.ts +60 -0
  228. package/dist/pim-connector.d.ts.map +1 -0
  229. package/dist/pim-connector.js +43 -0
  230. package/dist/pim-connector.js.map +1 -0
  231. package/dist/pim-field-path.d.ts +6 -0
  232. package/dist/pim-field-path.d.ts.map +1 -0
  233. package/dist/pim-field-path.js +101 -0
  234. package/dist/pim-field-path.js.map +1 -0
  235. package/dist/platform-language.d.ts +20 -0
  236. package/dist/platform-language.d.ts.map +1 -0
  237. package/dist/platform-language.js +22 -0
  238. package/dist/platform-language.js.map +1 -0
  239. package/dist/price-lists.d.ts +685 -0
  240. package/dist/price-lists.d.ts.map +1 -0
  241. package/dist/price-lists.js +330 -0
  242. package/dist/price-lists.js.map +1 -0
  243. package/dist/product-feeds.d.ts +2837 -0
  244. package/dist/product-feeds.d.ts.map +1 -0
  245. package/dist/product-feeds.js +1504 -0
  246. package/dist/product-feeds.js.map +1 -0
  247. package/dist/product-scope-overrides.d.ts +134 -0
  248. package/dist/product-scope-overrides.d.ts.map +1 -0
  249. package/dist/product-scope-overrides.js +82 -0
  250. package/dist/product-scope-overrides.js.map +1 -0
  251. package/dist/product-value-resolver.d.ts +88 -0
  252. package/dist/product-value-resolver.d.ts.map +1 -0
  253. package/dist/product-value-resolver.js +128 -0
  254. package/dist/product-value-resolver.js.map +1 -0
  255. package/dist/promotions.d.ts +678 -0
  256. package/dist/promotions.d.ts.map +1 -0
  257. package/dist/promotions.js +479 -0
  258. package/dist/promotions.js.map +1 -0
  259. package/dist/prompt-actions.d.ts +582 -0
  260. package/dist/prompt-actions.d.ts.map +1 -0
  261. package/dist/prompt-actions.js +221 -0
  262. package/dist/prompt-actions.js.map +1 -0
  263. package/dist/pwa.d.ts +293 -0
  264. package/dist/pwa.d.ts.map +1 -0
  265. package/dist/pwa.js +204 -0
  266. package/dist/pwa.js.map +1 -0
  267. package/dist/quick-order.d.ts +340 -0
  268. package/dist/quick-order.d.ts.map +1 -0
  269. package/dist/quick-order.js +177 -0
  270. package/dist/quick-order.js.map +1 -0
  271. package/dist/quote-requests.d.ts +538 -0
  272. package/dist/quote-requests.d.ts.map +1 -0
  273. package/dist/quote-requests.js +308 -0
  274. package/dist/quote-requests.js.map +1 -0
  275. package/dist/returns.d.ts +774 -0
  276. package/dist/returns.d.ts.map +1 -0
  277. package/dist/returns.js +389 -0
  278. package/dist/returns.js.map +1 -0
  279. package/dist/sales-channels.d.ts +392 -0
  280. package/dist/sales-channels.d.ts.map +1 -0
  281. package/dist/sales-channels.js +285 -0
  282. package/dist/sales-channels.js.map +1 -0
  283. package/dist/scope-notice.d.ts +60 -0
  284. package/dist/scope-notice.d.ts.map +1 -0
  285. package/dist/scope-notice.js +56 -0
  286. package/dist/scope-notice.js.map +1 -0
  287. package/dist/search.d.ts +321 -0
  288. package/dist/search.d.ts.map +1 -0
  289. package/dist/search.js +160 -0
  290. package/dist/search.js.map +1 -0
  291. package/dist/seo.d.ts +113 -0
  292. package/dist/seo.d.ts.map +1 -0
  293. package/dist/seo.js +63 -0
  294. package/dist/seo.js.map +1 -0
  295. package/dist/settings.d.ts +453 -0
  296. package/dist/settings.d.ts.map +1 -0
  297. package/dist/settings.js +337 -0
  298. package/dist/settings.js.map +1 -0
  299. package/dist/shipments.d.ts +140 -0
  300. package/dist/shipments.d.ts.map +1 -0
  301. package/dist/shipments.js +14 -0
  302. package/dist/shipments.js.map +1 -0
  303. package/dist/shipping-methods.d.ts +350 -0
  304. package/dist/shipping-methods.d.ts.map +1 -0
  305. package/dist/shipping-methods.js +99 -0
  306. package/dist/shipping-methods.js.map +1 -0
  307. package/dist/shopping-lists.d.ts +122 -0
  308. package/dist/shopping-lists.d.ts.map +1 -0
  309. package/dist/shopping-lists.js +92 -0
  310. package/dist/shopping-lists.js.map +1 -0
  311. package/dist/taxes.d.ts +106 -0
  312. package/dist/taxes.d.ts.map +1 -0
  313. package/dist/taxes.js +80 -0
  314. package/dist/taxes.js.map +1 -0
  315. package/dist/text-normalization.d.ts +199 -0
  316. package/dist/text-normalization.d.ts.map +1 -0
  317. package/dist/text-normalization.js +205 -0
  318. package/dist/text-normalization.js.map +1 -0
  319. package/dist/transactional-emails.d.ts +459 -0
  320. package/dist/transactional-emails.d.ts.map +1 -0
  321. package/dist/transactional-emails.js +212 -0
  322. package/dist/transactional-emails.js.map +1 -0
  323. package/dist/webhooks.d.ts +69 -0
  324. package/dist/webhooks.d.ts.map +1 -0
  325. package/dist/webhooks.js +53 -0
  326. package/dist/webhooks.js.map +1 -0
  327. package/package.json +46 -0
@@ -0,0 +1,479 @@
1
+ import { z } from 'zod';
2
+ import { isoDateTimeSchema, moneySchema, uuidSchema } from './common.js';
3
+ /**
4
+ * Promotion contracts (T129, T132 / FR-052).
5
+ *
6
+ * Three kinds shipped in this slice:
7
+ * - `percentage_off` — `value` is 0..100
8
+ * - `amount_off` — `value` is money in `currency`
9
+ * - `free_delivery` — `value` is ignored; the cart's delivery cost is zeroed
10
+ *
11
+ * Eligibility rules:
12
+ * - `code` (optional) — when present, only carts that present the code apply;
13
+ * when null, the promotion applies automatically to
14
+ * every eligible cart.
15
+ * - `minCartSubtotal` — cart subtotal threshold (in promotion currency).
16
+ * - `validFrom` / `validUntil` — clock-bound validity window.
17
+ * - `organizationId` / `customerGroupId` — restrict to a single Customer / group.
18
+ * - `categoryId` / `productId` — restrict effect to lines in the chosen scope.
19
+ * - `criteria[]` (feature 012 / US8) — line-level discriminated criteria.
20
+ * Today only the `attribute` variant is meaningful; the union is shaped
21
+ * so the existing flat `categoryId`/`productId`/etc. fields can migrate
22
+ * into it incrementally without breaking the wire format.
23
+ */
24
+ // --- Promotion criteria (feature 012 / US8) --------------------------------
25
+ /**
26
+ * Attribute-key syntax: lowercase, must start with a letter, then letters,
27
+ * digits, or underscore. Mirrors the attribute-key regex on the catalog
28
+ * create-attribute schema so the picker and the schema reject the same
29
+ * invalid keys.
30
+ */
31
+ export const attributeKeyRegex = /^[a-z][a-z0-9_]*$/;
32
+ const attributeCriterionSchema = z.object({
33
+ type: z.literal('attribute'),
34
+ attributeKey: z.string().regex(attributeKeyRegex, 'invalid_attribute_key'),
35
+ op: z.enum(['equals', 'in', 'range']),
36
+ /**
37
+ * Per-`op` shape (re-validated server-side against the attribute's
38
+ * resolved `valueType`):
39
+ *
40
+ * - `equals`: single-element `[scalar]`
41
+ * - `in`: non-empty `[scalar, ...]`
42
+ * - `range`: exactly `[min, max]`, both numeric or both ISO date-time
43
+ */
44
+ values: z.array(z.unknown()).min(1),
45
+ });
46
+ const categoryCriterionSchema = z.object({
47
+ type: z.literal('category'),
48
+ categoryIds: z.array(uuidSchema).min(1),
49
+ });
50
+ const productCriterionSchema = z.object({
51
+ type: z.literal('product'),
52
+ productIds: z.array(uuidSchema).min(1),
53
+ });
54
+ const customerGroupCriterionSchema = z.object({
55
+ type: z.literal('customerGroup'),
56
+ customerGroupIds: z.array(uuidSchema).min(1),
57
+ });
58
+ const organizationCriterionSchema = z.object({
59
+ type: z.literal('organization'),
60
+ organizationIds: z.array(uuidSchema).min(1),
61
+ });
62
+ export const promotionCriterionSchema = z.discriminatedUnion('type', [
63
+ attributeCriterionSchema,
64
+ categoryCriterionSchema,
65
+ productCriterionSchema,
66
+ customerGroupCriterionSchema,
67
+ organizationCriterionSchema,
68
+ ]);
69
+ // ============================================================================
70
+ // FEATURE 045 — promotions rules engine
71
+ // ============================================================================
72
+ // --- Rule AST (typed superset of the price-list application-rule AST) -------
73
+ /**
74
+ * Operator vocabulary for a promotion rule condition. The admissible set
75
+ * per field/value-type is enforced by the evaluator + write-time validation;
76
+ * the schema accepts the full vocabulary structurally.
77
+ */
78
+ export const promotionRuleOpSchema = z.enum([
79
+ 'eq',
80
+ 'neq',
81
+ 'gt',
82
+ 'gte',
83
+ 'lt',
84
+ 'lte',
85
+ 'between',
86
+ 'in',
87
+ 'notIn',
88
+ 'contains',
89
+ 'startsWith',
90
+ ]);
91
+ /** Built-in cart-context / relationship fields available to the Rule Builder. */
92
+ export const promotionRuleBuiltinFieldSchema = z.enum([
93
+ 'cartTotal',
94
+ 'paymentMethod',
95
+ 'deliveryMethod',
96
+ 'deliveryCountry',
97
+ 'deliveryPostalCode',
98
+ 'organization',
99
+ 'customerGroup',
100
+ 'category',
101
+ ]);
102
+ /** A rule field is either a built-in key or a promo-eligible product attribute. */
103
+ export const promotionRuleFieldSchema = z.discriminatedUnion('kind', [
104
+ z.object({ kind: z.literal('builtin'), key: promotionRuleBuiltinFieldSchema }),
105
+ z.object({
106
+ kind: z.literal('attribute'),
107
+ attributeKey: z.string().regex(attributeKeyRegex, 'invalid_attribute_key'),
108
+ }),
109
+ ]);
110
+ export const promotionRuleValueSchema = z.union([z.string(), z.number(), z.boolean()]);
111
+ const promotionRuleAllNodeSchema = z.object({ kind: z.literal('all') });
112
+ const promotionRuleConditionNodeSchema = z.object({
113
+ kind: z.literal('condition'),
114
+ field: promotionRuleFieldSchema,
115
+ op: promotionRuleOpSchema,
116
+ values: z.array(promotionRuleValueSchema).max(1000),
117
+ });
118
+ const promotionRuleNodeSchema = z.lazy(() => z.discriminatedUnion('kind', [
119
+ promotionRuleAllNodeSchema,
120
+ promotionRuleConditionNodeSchema,
121
+ z.object({
122
+ kind: z.literal('group'),
123
+ op: z.enum(['AND', 'OR']),
124
+ children: z.array(promotionRuleNodeSchema).min(1).max(20),
125
+ }),
126
+ ]));
127
+ /** Maximum nesting depth of a rule tree (mirrors the price-list guard). */
128
+ export function promotionRuleDepth(node) {
129
+ if (node.kind !== 'group')
130
+ return 0;
131
+ return 1 + Math.max(0, ...node.children.map(promotionRuleDepth));
132
+ }
133
+ export const promotionRuleSchema = promotionRuleNodeSchema.refine((node) => promotionRuleDepth(node) <= 5, { message: 'rule_depth_exceeds_5' });
134
+ // --- Action catalogue (discriminated by `type`) ----------------------------
135
+ const ACTION_CURRENCY = z.string().regex(/^[A-Z]{3}$/, 'ISO 4217');
136
+ const ACTION_PERCENT = z.number().finite().min(0).max(100);
137
+ const ACTION_AMOUNT = z.number().finite().positive();
138
+ const ACTION_POSITIVE_INT = z.number().int().positive();
139
+ export const promotionGiftTargetSchema = z.enum(['cheapest', 'most_expensive']);
140
+ export const promotionActionSchema = z.discriminatedUnion('type', [
141
+ z.object({ type: z.literal('free_delivery') }),
142
+ z.object({ type: z.literal('percentage_off_cart'), percent: ACTION_PERCENT }),
143
+ z.object({ type: z.literal('amount_off_cart'), amount: ACTION_AMOUNT, currency: ACTION_CURRENCY }),
144
+ z.object({
145
+ type: z.literal('buy_x_get_y_free'),
146
+ buyQuantity: ACTION_POSITIVE_INT,
147
+ freeQuantity: ACTION_POSITIVE_INT,
148
+ target: promotionGiftTargetSchema,
149
+ }),
150
+ z.object({
151
+ type: z.literal('spend_x_percent_off'),
152
+ spendStep: ACTION_AMOUNT,
153
+ percent: ACTION_PERCENT,
154
+ currency: ACTION_CURRENCY,
155
+ }),
156
+ z.object({
157
+ type: z.literal('spend_x_amount_off'),
158
+ spendStep: ACTION_AMOUNT,
159
+ amount: ACTION_AMOUNT,
160
+ currency: ACTION_CURRENCY,
161
+ }),
162
+ z.object({
163
+ type: z.literal('every_nth_product_percent_off'),
164
+ nth: ACTION_POSITIVE_INT,
165
+ percent: ACTION_PERCENT,
166
+ }),
167
+ z.object({
168
+ type: z.literal('buy_x_units_y_free'),
169
+ productId: uuidSchema,
170
+ buyUnits: ACTION_POSITIVE_INT,
171
+ freeUnits: ACTION_POSITIVE_INT,
172
+ }),
173
+ z.object({
174
+ type: z.literal('buy_x_units_percent_off'),
175
+ productId: uuidSchema,
176
+ buyUnits: ACTION_POSITIVE_INT,
177
+ percent: ACTION_PERCENT,
178
+ }),
179
+ z.object({
180
+ type: z.literal('buy_x_units_amount_off'),
181
+ productId: uuidSchema,
182
+ buyUnits: ACTION_POSITIVE_INT,
183
+ amount: ACTION_AMOUNT,
184
+ currency: ACTION_CURRENCY,
185
+ }),
186
+ ]);
187
+ export const promotionActionTypeSchema = z.enum([
188
+ 'free_delivery',
189
+ 'percentage_off_cart',
190
+ 'amount_off_cart',
191
+ 'buy_x_get_y_free',
192
+ 'spend_x_percent_off',
193
+ 'spend_x_amount_off',
194
+ 'every_nth_product_percent_off',
195
+ 'buy_x_units_y_free',
196
+ 'buy_x_units_percent_off',
197
+ 'buy_x_units_amount_off',
198
+ ]);
199
+ export const promotionKindSchema = z.enum([
200
+ 'percentage_off',
201
+ 'amount_off',
202
+ 'free_delivery',
203
+ ]);
204
+ export const promotionSchema = z.object({
205
+ id: uuidSchema,
206
+ code: z.string().nullable(),
207
+ name: z.string().min(1).max(160),
208
+ /** Legacy effect kind — nullable on feature-045 action-based promotions. */
209
+ kind: promotionKindSchema.nullable(),
210
+ /** Legacy effect value — nullable on feature-045 action-based promotions. */
211
+ value: z.number().finite().nonnegative().nullable(),
212
+ currency: z.string().regex(/^[A-Z]{3}$/, 'ISO 4217').nullable(),
213
+ minCartSubtotal: z.number().finite().nonnegative().nullable(),
214
+ validFrom: isoDateTimeSchema.nullable(),
215
+ validUntil: isoDateTimeSchema.nullable(),
216
+ organizationId: uuidSchema.nullable(),
217
+ customerGroupId: uuidSchema.nullable(),
218
+ categoryId: uuidSchema.nullable(),
219
+ productId: uuidSchema.nullable(),
220
+ /**
221
+ * Feature 012 / US8 — optional line-level criteria evaluated alongside
222
+ * the flat `categoryId`/`productId` scope. ANDed with the flat fields:
223
+ * a line must satisfy both the legacy scope AND every criterion to be
224
+ * included in the promotion's `lineBase`.
225
+ */
226
+ criteria: z.array(promotionCriterionSchema).default([]),
227
+ isActive: z.boolean(),
228
+ // --- Feature 045 — engine fields -----------------------------------------
229
+ description: z.string().nullable().default(null),
230
+ priority: z.number().int().default(0),
231
+ stopFurther: z.boolean().default(false),
232
+ /** Configured action (null on legacy kind/value promotions). */
233
+ action: promotionActionSchema.nullable().default(null),
234
+ /** Named rule reference (mutually exclusive with `rule`). */
235
+ ruleId: uuidSchema.nullable().default(null),
236
+ /** Inline rule definition (mutually exclusive with `ruleId`). */
237
+ rule: promotionRuleSchema.nullable().default(null),
238
+ usageLimitGlobal: z.number().int().positive().nullable().default(null),
239
+ usageLimitPerOrganization: z.number().int().positive().nullable().default(null),
240
+ usageLimitPerCustomer: z.number().int().positive().nullable().default(null),
241
+ createdAt: isoDateTimeSchema,
242
+ updatedAt: isoDateTimeSchema,
243
+ });
244
+ export const upsertPromotionRequestSchema = z
245
+ .object({
246
+ code: z.string().min(1).max(64).nullable().optional(),
247
+ name: z.string().min(1).max(160),
248
+ /** Legacy effect — optional when a feature-045 `action` is provided. */
249
+ kind: promotionKindSchema.optional(),
250
+ value: z.number().finite().nonnegative().optional(),
251
+ currency: z.string().regex(/^[A-Z]{3}$/).nullable().optional(),
252
+ minCartSubtotal: z.number().finite().nonnegative().nullable().optional(),
253
+ validFrom: isoDateTimeSchema.nullable().optional(),
254
+ validUntil: isoDateTimeSchema.nullable().optional(),
255
+ organizationId: uuidSchema.nullable().optional(),
256
+ customerGroupId: uuidSchema.nullable().optional(),
257
+ categoryId: uuidSchema.nullable().optional(),
258
+ productId: uuidSchema.nullable().optional(),
259
+ criteria: z.array(promotionCriterionSchema).optional(),
260
+ isActive: z.boolean().optional(),
261
+ // --- Feature 045 — engine fields ---------------------------------------
262
+ description: z.string().max(2000).nullable().optional(),
263
+ priority: z.number().int().optional(),
264
+ stopFurther: z.boolean().optional(),
265
+ action: promotionActionSchema.optional(),
266
+ ruleId: uuidSchema.nullable().optional(),
267
+ rule: promotionRuleSchema.nullable().optional(),
268
+ usageLimitGlobal: z.number().int().positive().nullable().optional(),
269
+ usageLimitPerOrganization: z.number().int().positive().nullable().optional(),
270
+ usageLimitPerCustomer: z.number().int().positive().nullable().optional(),
271
+ /** Sales channels this promotion runs in (membership bridge). */
272
+ salesChannelIds: z.array(uuidSchema).optional(),
273
+ })
274
+ .superRefine((value, ctx) => {
275
+ // A promotion is driven by EITHER a feature-045 `action` OR the legacy
276
+ // `kind` + `value` pair — exactly one source must be present.
277
+ if (!value.action && !value.kind) {
278
+ ctx.addIssue({
279
+ code: 'custom',
280
+ message: 'a promotion requires either an action or a legacy kind',
281
+ path: ['action'],
282
+ });
283
+ }
284
+ if (value.kind && value.value === undefined) {
285
+ ctx.addIssue({
286
+ code: 'custom',
287
+ message: 'legacy kind promotions require a value',
288
+ path: ['value'],
289
+ });
290
+ }
291
+ if (value.ruleId && value.rule) {
292
+ ctx.addIssue({
293
+ code: 'custom',
294
+ message: 'rule_source_conflict: provide either ruleId or rule, not both',
295
+ path: ['rule'],
296
+ });
297
+ }
298
+ if (value.kind === 'amount_off' && value.currency == null) {
299
+ ctx.addIssue({
300
+ code: 'custom',
301
+ message: 'amount_off promotions require a currency',
302
+ path: ['currency'],
303
+ });
304
+ }
305
+ if (value.kind === 'percentage_off' && value.value !== undefined && (value.value < 0 || value.value > 100)) {
306
+ ctx.addIssue({
307
+ code: 'custom',
308
+ message: 'percentage_off value must be between 0 and 100',
309
+ path: ['value'],
310
+ });
311
+ }
312
+ if (value.criteria) {
313
+ value.criteria.forEach((c, idx) => {
314
+ if (c.type !== 'attribute')
315
+ return;
316
+ if (c.op === 'equals' && c.values.length !== 1) {
317
+ ctx.addIssue({
318
+ code: 'custom',
319
+ message: 'invalid_criterion_values: equals expects a single-element values array',
320
+ path: ['criteria', idx, 'values'],
321
+ });
322
+ }
323
+ if (c.op === 'range' && c.values.length !== 2) {
324
+ ctx.addIssue({
325
+ code: 'custom',
326
+ message: 'invalid_criterion_values: range expects exactly [min, max]',
327
+ path: ['criteria', idx, 'values'],
328
+ });
329
+ }
330
+ });
331
+ }
332
+ });
333
+ // --- Statistics (US7) ------------------------------------------------------
334
+ export const promotionStatsGroupBySchema = z.enum([
335
+ 'customer',
336
+ 'customerGroup',
337
+ 'organization',
338
+ 'salesChannel',
339
+ ]);
340
+ export const promotionUsageStatsSchema = z.object({
341
+ totalUses: z.number().int().nonnegative(),
342
+ totalDiscount: z.number().nonnegative(),
343
+ currency: z.string().nullable(),
344
+ groupBy: promotionStatsGroupBySchema.nullable(),
345
+ breakdown: z.array(z.object({
346
+ key: z.string().nullable(),
347
+ uses: z.number().int().nonnegative(),
348
+ discount: z.number().nonnegative(),
349
+ })),
350
+ });
351
+ // --- Named rules (US6) -----------------------------------------------------
352
+ export const promotionRuleRecordSchema = z.object({
353
+ id: uuidSchema,
354
+ name: z.string().min(1).max(160),
355
+ description: z.string().nullable(),
356
+ definition: promotionRuleSchema,
357
+ createdAt: isoDateTimeSchema,
358
+ updatedAt: isoDateTimeSchema,
359
+ });
360
+ export const upsertPromotionRuleRequestSchema = z.object({
361
+ name: z.string().min(1).max(160),
362
+ description: z.string().max(2000).nullable().optional(),
363
+ definition: promotionRuleSchema,
364
+ });
365
+ // --- Coupons & generator (US3 / US4) ---------------------------------------
366
+ export const couponFormatSchema = z.enum(['alnum', 'digits', 'letters']);
367
+ export const couponLimitScopeSchema = z.enum(['per_coupon', 'shared_batch']);
368
+ export const promotionCouponSchema = z.object({
369
+ id: uuidSchema,
370
+ promotionId: uuidSchema,
371
+ batchId: uuidSchema.nullable(),
372
+ code: z.string(),
373
+ limitScope: couponLimitScopeSchema,
374
+ isActive: z.boolean(),
375
+ createdAt: isoDateTimeSchema,
376
+ });
377
+ export const generateCouponsRequestSchema = z.object({
378
+ count: z.number().int().positive().max(100_000),
379
+ length: z.number().int().min(3).max(40),
380
+ format: couponFormatSchema,
381
+ prefix: z.string().max(32).nullable().optional(),
382
+ suffix: z.string().max(32).nullable().optional(),
383
+ /** Insert a dash every N characters of the generated body; 0/absent = none. */
384
+ dashEvery: z.number().int().nonnegative().max(40).optional(),
385
+ limitScope: couponLimitScopeSchema.default('per_coupon'),
386
+ });
387
+ /** Bulk activate/deactivate coupons of a promotion by id. */
388
+ export const bulkCouponActiveRequestSchema = z.object({
389
+ couponIds: z.array(uuidSchema).min(1).max(100_000),
390
+ isActive: z.boolean(),
391
+ });
392
+ // --- Cart application ------------------------------------------------------
393
+ export const cartLineSchema = z.object({
394
+ productId: uuidSchema,
395
+ variantId: uuidSchema.nullable(),
396
+ categoryIds: z.array(uuidSchema),
397
+ quantity: z.number().int().positive(),
398
+ unitPrice: moneySchema,
399
+ /**
400
+ * Feature 012 / US8 — optional attribute snapshot for line-level
401
+ * criterion evaluation. Callers MAY omit this field; when omitted, the
402
+ * promotion service loads the values from the catalog read path. The
403
+ * field is provided for callers that already have the snapshot in hand
404
+ * (e.g. CartService building a preview) so the resolver doesn't have
405
+ * to round-trip the database.
406
+ */
407
+ attributeValues: z.record(z.string(), z.unknown()).optional(),
408
+ });
409
+ export const cartSnapshotSchema = z.object({
410
+ organizationId: uuidSchema.nullable(),
411
+ customerGroupId: uuidSchema.nullable(),
412
+ currency: z.string().regex(/^[A-Z]{3}$/),
413
+ lines: z.array(cartLineSchema),
414
+ deliveryTotal: z.number().finite().nonnegative(),
415
+ /** Promotion code presented at checkout, if any. */
416
+ promotionCode: z.string().nullable().optional(),
417
+ /**
418
+ * Feature 045 — cart-context facts the promotion Rule Builder can target.
419
+ * All optional so legacy callers (preview probes, older carts) keep working;
420
+ * a rule condition over a field that is absent simply does not match.
421
+ */
422
+ salesChannelId: uuidSchema.nullable().optional(),
423
+ customerAccountId: uuidSchema.nullable().optional(),
424
+ paymentMethodCode: z.string().nullable().optional(),
425
+ deliveryMethodCode: z.string().nullable().optional(),
426
+ deliveryCountry: z.string().nullable().optional(),
427
+ deliveryPostalCode: z.string().nullable().optional(),
428
+ });
429
+ export const promotionApplicationSchema = z.object({
430
+ subtotal: z.number().finite().nonnegative(),
431
+ discountTotal: z.number().finite().nonnegative(),
432
+ deliveryTotal: z.number().finite().nonnegative(),
433
+ total: z.number().finite().nonnegative(),
434
+ appliedPromotions: z.array(z.object({
435
+ promotionId: uuidSchema,
436
+ /** Legacy effect kind — null for feature-045 action-based promotions. */
437
+ kind: promotionKindSchema.nullable(),
438
+ /** Feature 045 — action type when the promotion is action-based. */
439
+ actionType: promotionActionTypeSchema.nullable().default(null),
440
+ /** Feature 045 — coupon that gated this application, if any. */
441
+ couponId: uuidSchema.nullable().default(null),
442
+ amount: z.number().finite().nonnegative(),
443
+ })),
444
+ });
445
+ // --- Promotion-rule editor support (feature 012 / US8) ---------------------
446
+ /**
447
+ * Picker payload returned by `GET /api/v1/admin/promotions/rule-targets/attributes`.
448
+ * Lists every attribute carrying `isPromoRule = true`, with the option list
449
+ * inline for select-style types so the editor can render the value picker
450
+ * without an additional round-trip.
451
+ */
452
+ export const promotionRuleAttributeOptionSchema = z.object({
453
+ value: z.string(),
454
+ label: z.record(z.string(), z.string()),
455
+ labelDefault: z.string(),
456
+ });
457
+ export const promotionRuleAttributeSchema = z.object({
458
+ id: uuidSchema,
459
+ key: z.string().regex(attributeKeyRegex),
460
+ label: z.record(z.string(), z.string()),
461
+ labelDefault: z.string(),
462
+ valueType: z.enum([
463
+ 'string',
464
+ 'number',
465
+ 'boolean',
466
+ 'date',
467
+ 'enum',
468
+ 'select',
469
+ 'multiselect',
470
+ 'price',
471
+ ]),
472
+ options: z.array(promotionRuleAttributeOptionSchema).optional(),
473
+ });
474
+ export const promotionRuleAttributesResponseSchema = z.object({
475
+ data: z.object({
476
+ items: z.array(promotionRuleAttributeSchema),
477
+ }),
478
+ });
479
+ //# sourceMappingURL=promotions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promotions.js","sourceRoot":"","sources":["../src/promotions.ts"],"names":[],"mappings":"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"}