@sixtyninecommerce/admin 0.10.0 → 0.12.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 (302) hide show
  1. package/README.md +5772 -118
  2. package/dist/auth/index.d.ts +7 -1
  3. package/dist/auth/index.js +8 -1
  4. package/dist/catalog/assets.d.ts +120 -8
  5. package/dist/catalog/assets.js +98 -12
  6. package/dist/catalog/collections.d.ts +279 -14
  7. package/dist/catalog/collections.js +246 -15
  8. package/dist/catalog/documents.d.ts +142 -0
  9. package/dist/catalog/documents.js +114 -0
  10. package/dist/catalog/index.d.ts +54 -6
  11. package/dist/catalog/index.js +10 -1
  12. package/dist/catalog/metadata.d.ts +244 -0
  13. package/dist/catalog/metadata.js +220 -0
  14. package/dist/catalog/products.d.ts +159 -19
  15. package/dist/catalog/products.js +88 -13
  16. package/dist/catalog/properties.d.ts +140 -14
  17. package/dist/catalog/properties.js +65 -1
  18. package/dist/catalog/recommendations.d.ts +288 -0
  19. package/dist/catalog/recommendations.js +237 -0
  20. package/dist/catalog/reviews.d.ts +381 -0
  21. package/dist/catalog/reviews.js +325 -0
  22. package/dist/catalog/types.d.ts +17 -1
  23. package/dist/catalog/types.js +10 -0
  24. package/dist/catalog/variant-find.d.ts +136 -0
  25. package/dist/catalog/variant-find.js +239 -0
  26. package/dist/catalog/variants.d.ts +293 -26
  27. package/dist/catalog/variants.js +164 -7
  28. package/dist/catalog/visibility.d.ts +38 -7
  29. package/dist/catalog/visibility.js +19 -1
  30. package/dist/client.d.ts +121 -9
  31. package/dist/client.js +53 -14
  32. package/dist/content/assets.d.ts +285 -0
  33. package/dist/content/assets.js +181 -0
  34. package/dist/content/forms.d.ts +332 -1
  35. package/dist/content/forms.js +140 -4
  36. package/dist/content/items.d.ts +292 -0
  37. package/dist/content/items.js +170 -0
  38. package/dist/content/menus.d.ts +254 -0
  39. package/dist/content/menus.js +70 -0
  40. package/dist/content/strings.d.ts +137 -0
  41. package/dist/content/strings.js +82 -0
  42. package/dist/content/types.d.ts +282 -0
  43. package/dist/content/types.js +100 -0
  44. package/dist/customers/age-verification.d.ts +66 -0
  45. package/dist/customers/age-verification.js +79 -0
  46. package/dist/customers/credit.d.ts +263 -0
  47. package/dist/customers/credit.js +244 -0
  48. package/dist/customers/delivery-preferences.d.ts +120 -0
  49. package/dist/customers/delivery-preferences.js +97 -0
  50. package/dist/customers/delivery-terms.d.ts +44 -0
  51. package/dist/customers/delivery-terms.js +32 -0
  52. package/dist/customers/groups.d.ts +207 -0
  53. package/dist/customers/groups.js +438 -0
  54. package/dist/customers/index.d.ts +462 -37
  55. package/dist/customers/index.js +317 -40
  56. package/dist/customers/invitation-status.d.ts +57 -0
  57. package/dist/customers/invitation-status.js +21 -0
  58. package/dist/customers/notes.d.ts +67 -0
  59. package/dist/customers/notes.js +51 -0
  60. package/dist/customers/notification-recipients.d.ts +97 -0
  61. package/dist/customers/notification-recipients.js +84 -0
  62. package/dist/customers/saved-lists.d.ts +42 -0
  63. package/dist/customers/saved-lists.js +61 -0
  64. package/dist/customers/vat.d.ts +83 -0
  65. package/dist/customers/vat.js +46 -0
  66. package/dist/customers/wire.d.ts +20 -0
  67. package/dist/customers/wire.js +35 -0
  68. package/dist/documents/ar.d.ts +307 -0
  69. package/dist/documents/ar.js +254 -0
  70. package/dist/documents/emails.d.ts +150 -0
  71. package/dist/documents/emails.js +220 -0
  72. package/dist/documents/index.d.ts +744 -21
  73. package/dist/documents/index.js +438 -24
  74. package/dist/documents/pdf.d.ts +2 -0
  75. package/dist/documents/pdf.js +11 -0
  76. package/dist/fulfillments/create.d.ts +167 -0
  77. package/dist/fulfillments/create.js +216 -0
  78. package/dist/fulfillments/index.d.ts +163 -11
  79. package/dist/fulfillments/index.js +135 -6
  80. package/dist/fulfillments/payment-policy.d.ts +64 -0
  81. package/dist/fulfillments/payment-policy.js +140 -0
  82. package/dist/fulfillments/warehouse.d.ts +724 -0
  83. package/dist/fulfillments/warehouse.js +914 -0
  84. package/dist/geo/index.d.ts +119 -0
  85. package/dist/geo/index.js +107 -0
  86. package/dist/index.d.ts +147 -39
  87. package/dist/index.js +51 -12
  88. package/dist/integrations/afas-actions.d.ts +234 -0
  89. package/dist/integrations/afas-actions.js +310 -0
  90. package/dist/integrations/afas-types.d.ts +483 -0
  91. package/dist/integrations/afas-types.js +5 -0
  92. package/dist/integrations/afas.d.ts +234 -0
  93. package/dist/integrations/afas.js +290 -0
  94. package/dist/integrations/connections.d.ts +103 -0
  95. package/dist/integrations/connections.js +55 -0
  96. package/dist/integrations/esp.d.ts +313 -0
  97. package/dist/integrations/esp.js +169 -0
  98. package/dist/integrations/exact-online-types.d.ts +965 -0
  99. package/dist/integrations/exact-online-types.js +6 -0
  100. package/dist/integrations/exact-online.d.ts +784 -0
  101. package/dist/integrations/exact-online.js +1089 -0
  102. package/dist/integrations/index.d.ts +44 -3
  103. package/dist/integrations/index.js +23 -3
  104. package/dist/integrations/pipeline-discoveries.d.ts +65 -0
  105. package/dist/integrations/pipeline-discoveries.js +65 -0
  106. package/dist/integrations/pipeline-keys.d.ts +13 -0
  107. package/dist/integrations/pipeline-keys.js +22 -0
  108. package/dist/integrations/pipeline-runs.d.ts +119 -0
  109. package/dist/integrations/pipeline-runs.js +87 -0
  110. package/dist/integrations/pipelines.d.ts +87 -15
  111. package/dist/integrations/pipelines.js +41 -22
  112. package/dist/integrations/price-import.d.ts +223 -0
  113. package/dist/integrations/price-import.js +124 -0
  114. package/dist/integrations/types.d.ts +367 -3
  115. package/dist/integrations/types.js +4 -3
  116. package/dist/locations/index.d.ts +66 -0
  117. package/dist/locations/index.js +31 -0
  118. package/dist/meta/index.d.ts +172 -0
  119. package/dist/metafields/index.d.ts +8 -1
  120. package/dist/metafields/index.js +10 -0
  121. package/dist/orders/cancel-with-money.d.ts +237 -0
  122. package/dist/orders/cancel-with-money.js +155 -0
  123. package/dist/orders/commit-edit.d.ts +23 -1
  124. package/dist/orders/commit-edit.js +19 -2
  125. package/dist/orders/deposit-policy.d.ts +3 -1
  126. package/dist/orders/drafts.d.ts +800 -0
  127. package/dist/orders/drafts.js +771 -0
  128. package/dist/orders/fields.d.ts +245 -0
  129. package/dist/orders/fields.js +188 -0
  130. package/dist/orders/get.d.ts +29 -19
  131. package/dist/orders/get.js +17 -8
  132. package/dist/orders/index.d.ts +66 -15
  133. package/dist/orders/index.js +25 -2
  134. package/dist/orders/lifecycle.d.ts +128 -0
  135. package/dist/orders/lifecycle.js +158 -0
  136. package/dist/orders/line-price-preview.d.ts +7 -2
  137. package/dist/orders/list.d.ts +243 -0
  138. package/dist/orders/list.js +487 -0
  139. package/dist/orders/manual-discounts.d.ts +13 -5
  140. package/dist/orders/manual-pricing.d.ts +5 -0
  141. package/dist/orders/money-view.d.ts +149 -0
  142. package/dist/orders/money-view.js +99 -0
  143. package/dist/orders/order-entry.d.ts +20 -7
  144. package/dist/orders/plan-edit.d.ts +34 -2
  145. package/dist/orders/plan-edit.js +112 -11
  146. package/dist/orders/settings.d.ts +201 -0
  147. package/dist/orders/settings.js +325 -0
  148. package/dist/orders/status.d.ts +159 -13
  149. package/dist/orders/status.js +21 -0
  150. package/dist/orders/surcharges.d.ts +20 -1
  151. package/dist/orders/surcharges.js +37 -11
  152. package/dist/payments/account-credit.d.ts +46 -0
  153. package/dist/payments/account-credit.js +42 -0
  154. package/dist/payments/ar.d.ts +292 -0
  155. package/dist/payments/ar.js +223 -0
  156. package/dist/payments/connected-account.d.ts +47 -0
  157. package/dist/payments/connected-account.js +61 -0
  158. package/dist/payments/credit-noted-fields.d.ts +19 -0
  159. package/dist/payments/credit-noted-fields.js +69 -0
  160. package/dist/payments/customer-consent.d.ts +30 -0
  161. package/dist/payments/customer-consent.js +49 -0
  162. package/dist/payments/index.d.ts +340 -19
  163. package/dist/payments/index.js +151 -1
  164. package/dist/payments/methods.d.ts +303 -8
  165. package/dist/payments/methods.js +337 -7
  166. package/dist/payments/mollie-methods.d.ts +159 -0
  167. package/dist/payments/mollie-methods.js +141 -0
  168. package/dist/payments/payment-links.d.ts +180 -0
  169. package/dist/payments/payment-links.js +97 -0
  170. package/dist/payments/provider-keys.d.ts +150 -0
  171. package/dist/payments/provider-keys.js +118 -0
  172. package/dist/payments/providers.d.ts +86 -11
  173. package/dist/payments/providers.js +29 -0
  174. package/dist/payments/requests.d.ts +147 -0
  175. package/dist/payments/requests.js +93 -0
  176. package/dist/payments/store-credit-fields.d.ts +15 -0
  177. package/dist/payments/store-credit-fields.js +51 -0
  178. package/dist/pickups/index.d.ts +106 -0
  179. package/dist/pickups/index.js +108 -0
  180. package/dist/platform/channels.d.ts +132 -0
  181. package/dist/platform/channels.js +128 -0
  182. package/dist/platform/email-gateways.d.ts +165 -0
  183. package/dist/platform/email-gateways.js +78 -0
  184. package/dist/platform/geo.d.ts +123 -0
  185. package/dist/platform/geo.js +144 -0
  186. package/dist/platform/tax.d.ts +162 -0
  187. package/dist/platform/tax.js +169 -0
  188. package/dist/pos/anomalies.d.ts +158 -0
  189. package/dist/pos/anomalies.js +64 -0
  190. package/dist/pos/assisted-selling.d.ts +79 -0
  191. package/dist/pos/assisted-selling.js +38 -0
  192. package/dist/pos/exchanges.d.ts +108 -0
  193. package/dist/pos/exchanges.js +22 -0
  194. package/dist/pos/gift-cards.d.ts +135 -0
  195. package/dist/pos/gift-cards.js +47 -0
  196. package/dist/pos/index.d.ts +2370 -58
  197. package/dist/pos/index.js +854 -7
  198. package/dist/pos/no-receipt.d.ts +94 -0
  199. package/dist/pos/no-receipt.js +25 -0
  200. package/dist/pos/offline-sales.d.ts +228 -0
  201. package/dist/pos/offline-sales.js +170 -0
  202. package/dist/pos/pay-by-link.d.ts +143 -0
  203. package/dist/pos/pay-by-link.js +57 -0
  204. package/dist/pos/quick-keys.d.ts +103 -0
  205. package/dist/pos/quick-keys.js +45 -0
  206. package/dist/pos/reports.d.ts +360 -0
  207. package/dist/pos/reports.js +62 -0
  208. package/dist/pos/returns.d.ts +244 -0
  209. package/dist/pos/returns.js +83 -0
  210. package/dist/pricing/bulk-coupons.d.ts +139 -0
  211. package/dist/pricing/bulk-coupons.js +112 -0
  212. package/dist/pricing/index.d.ts +174 -4
  213. package/dist/pricing/index.js +174 -1
  214. package/dist/pricing/price-lists.d.ts +606 -0
  215. package/dist/pricing/price-lists.js +600 -0
  216. package/dist/purchasing/alerts.d.ts +104 -0
  217. package/dist/purchasing/alerts.js +88 -0
  218. package/dist/purchasing/backorders.d.ts +61 -0
  219. package/dist/purchasing/backorders.js +92 -0
  220. package/dist/purchasing/cost.d.ts +110 -0
  221. package/dist/purchasing/cost.js +86 -0
  222. package/dist/purchasing/index.d.ts +54 -0
  223. package/dist/purchasing/index.js +24 -0
  224. package/dist/purchasing/links.d.ts +263 -0
  225. package/dist/purchasing/links.js +192 -0
  226. package/dist/purchasing/purchase-orders.d.ts +551 -0
  227. package/dist/purchasing/purchase-orders.js +491 -0
  228. package/dist/purchasing/receipts.d.ts +396 -0
  229. package/dist/purchasing/receipts.js +287 -0
  230. package/dist/purchasing/replenishment.d.ts +281 -0
  231. package/dist/purchasing/replenishment.js +240 -0
  232. package/dist/purchasing/returns.d.ts +273 -0
  233. package/dist/purchasing/returns.js +229 -0
  234. package/dist/purchasing/settings.d.ts +152 -0
  235. package/dist/purchasing/settings.js +181 -0
  236. package/dist/purchasing/suppliers.d.ts +476 -0
  237. package/dist/purchasing/suppliers.js +438 -0
  238. package/dist/quotes/index.d.ts +518 -0
  239. package/dist/quotes/index.js +439 -0
  240. package/dist/reports/index.d.ts +71 -8
  241. package/dist/reports/index.js +74 -11
  242. package/dist/returns/index.d.ts +675 -21
  243. package/dist/returns/index.js +756 -11
  244. package/dist/search/index.d.ts +76 -1
  245. package/dist/search/index.js +63 -0
  246. package/dist/seo/config.d.ts +128 -0
  247. package/dist/seo/config.js +95 -0
  248. package/dist/seo/redirects.d.ts +125 -0
  249. package/dist/seo/redirects.js +60 -1
  250. package/dist/seo/settings.d.ts +147 -0
  251. package/dist/seo/settings.js +209 -0
  252. package/dist/shipping/definitions.d.ts +29 -0
  253. package/dist/shipping/definitions.js +47 -0
  254. package/dist/shipping/fulfillment-profiles.d.ts +174 -0
  255. package/dist/shipping/fulfillment-profiles.js +104 -0
  256. package/dist/shipping/hendriks.d.ts +97 -0
  257. package/dist/shipping/hendriks.js +50 -0
  258. package/dist/shipping/index.d.ts +54 -0
  259. package/dist/shipping/index.js +27 -0
  260. package/dist/shipping/methods.d.ts +205 -0
  261. package/dist/shipping/methods.js +240 -0
  262. package/dist/shipping/myparcel.d.ts +668 -0
  263. package/dist/shipping/myparcel.js +466 -0
  264. package/dist/shipping/parcel-count-suggestion.d.ts +2 -0
  265. package/dist/shipping/parcel-rule.d.ts +6 -5
  266. package/dist/shipping/parcel-rule.js +21 -23
  267. package/dist/shipping/rate-tables.d.ts +324 -0
  268. package/dist/shipping/rate-tables.js +390 -0
  269. package/dist/shipping/ship-to-countries.d.ts +75 -0
  270. package/dist/shipping/ship-to-countries.js +47 -0
  271. package/dist/stock/by-location.d.ts +86 -0
  272. package/dist/stock/by-location.js +94 -0
  273. package/dist/stock/index.d.ts +18 -4
  274. package/dist/stock/index.js +7 -0
  275. package/dist/stock/locations.d.ts +144 -0
  276. package/dist/stock/locations.js +168 -0
  277. package/dist/stock/settings.d.ts +106 -0
  278. package/dist/stock/settings.js +103 -0
  279. package/dist/stock/transfers.d.ts +386 -52
  280. package/dist/stock/transfers.js +222 -17
  281. package/dist/stored-value/index.d.ts +312 -11
  282. package/dist/stored-value/index.js +223 -4
  283. package/dist/subscriptions/index.d.ts +682 -0
  284. package/dist/subscriptions/index.js +815 -0
  285. package/dist/tax/display-policy.d.ts +105 -0
  286. package/dist/tax/display-policy.js +84 -0
  287. package/dist/tax/index.d.ts +79 -1
  288. package/dist/tax/index.js +52 -0
  289. package/dist/tenant/email-style.d.ts +102 -0
  290. package/dist/tenant/email-style.js +72 -0
  291. package/dist/tenant/email-templates.d.ts +287 -0
  292. package/dist/tenant/email-templates.js +271 -0
  293. package/dist/tenant/notifications.d.ts +23 -17
  294. package/dist/tenant/settings-sources.d.ts +1 -1
  295. package/dist/tenant/time-zone.d.ts +17 -0
  296. package/dist/tenant/time-zone.js +11 -0
  297. package/dist/types.d.ts +50 -3
  298. package/dist/users/index.d.ts +3 -0
  299. package/dist/users/index.js +2 -0
  300. package/dist/users/warehouses.d.ts +50 -0
  301. package/dist/users/warehouses.js +51 -0
  302. package/package.json +2 -2
@@ -0,0 +1,83 @@
1
+ import { statedCustomerAgreed } from '../payments/customer-consent.js';
2
+ import { isUnknownFieldRejection } from '../payments/store-credit-fields.js';
3
+ /** A quote's fields up to its store-credit payout, which every engine with C6b reads. */
4
+ const QUOTE_BASE_FIELDS = 'orderId kind currencyCode receiptNumber lines { orderLineId name sku customItem restockable soldQuantity returnedQuantity returnableQuantity quantity refundAmount } total legs { paymentId kind method amount } cashPaidOut returnWindowEndsAt outsideWindow refundedOutsideReturns restockLocationName blockedBy blockedReason';
5
+ // Spliced as template constants, never built by a call: the repo's GraphQL cost scan
6
+ // (`graphql-cost-fits-repo.spec.ts`) resolves `${CONSTANT}` statically and nothing computed.
7
+ /** A quote's fields before the till's consent (owner ruling Q4): what every engine with C6b reads. */
8
+ const QUOTE_FIELDS_BEFORE_CONSENT = `${QUOTE_BASE_FIELDS} storedValuePayout { available reason }`;
9
+ const QUOTE_FIELDS = `${QUOTE_BASE_FIELDS} storedValuePayout { available reason asksConsent }`;
10
+ /** The sprint-20 result: what a void answers (it never pays out to store credit). */
11
+ const VOID_RESULT_FIELDS = 'orderId returnId returnCode kind total refunds { paymentId kind method amount refundId outcome } cashPaidOut complete';
12
+ /** A return's result: the void's, and the store credit a STORED_VALUE payout made (C6b). */
13
+ const RESULT_FIELDS = `${VOID_RESULT_FIELDS} storedValueCredit { accountId entryId amount }`;
14
+ export const POS_RETURN_QUOTE_QUERY = `query PosReturnQuote($input: PosReturnQuoteInput!) { posReturnQuote(input: $input) { ${QUOTE_FIELDS} } }`;
15
+ /** The quote for an engine before the till's consent (owner ruling Q4): no `asksConsent`. */
16
+ export const POS_RETURN_QUOTE_QUERY_BEFORE_CONSENT = `query PosReturnQuote($input: PosReturnQuoteInput!) { posReturnQuote(input: $input) { ${QUOTE_FIELDS_BEFORE_CONSENT} } }`;
17
+ export const POS_RETURN_MUTATION = `mutation PosReturn($input: PosReturnInput!) { posReturn(input: $input) { ${RESULT_FIELDS} } }`;
18
+ export const POS_VOID_SALE_MUTATION = `mutation PosVoidSale($input: PosVoidSaleInput!) { posVoidSale(input: $input) { ${VOID_RESULT_FIELDS} } }`;
19
+ // Engine C3/34: their own documents, so a call to an older engine fails alone.
20
+ const ONLINE_ORDER_FIELDS = 'orderId orderCode placedAt state currencyCode totalWithTax customerName refundMethodName returnableUnits blockedBy blockedReason';
21
+ export const POS_ONLINE_ORDER_QUERY = `query PosOnlineOrder($input: PosOnlineOrderRefInput!) { posOnlineOrder(input: $input) { ${ONLINE_ORDER_FIELDS} } }`;
22
+ // Never store credit (D22), so it never asks consent: the selection before Q4, `asksConsent` false.
23
+ export const POS_ONLINE_RETURN_QUOTE_QUERY = `query PosOnlineReturnQuote($input: PosOnlineReturnQuoteInput!) { posOnlineReturnQuote(input: $input) { ${QUOTE_FIELDS_BEFORE_CONSENT} shippingRefund source } }`;
24
+ // A webshop order's return never pays out to store credit (C3 D22): the void's result fields.
25
+ export const POS_ONLINE_RETURN_MUTATION = `mutation PosOnlineReturn($input: PosOnlineReturnInput!) { posOnlineReturn(input: $input) { ${VOID_RESULT_FIELDS} } }`;
26
+ /** Such a quote as this SDK answers it: `asksConsent` false (that engine takes no answer). */
27
+ function withoutConsent(quote) {
28
+ return {
29
+ ...quote,
30
+ storedValuePayout: { ...quote.storedValuePayout, asksConsent: false },
31
+ };
32
+ }
33
+ function keyOf(options, call) {
34
+ const key = options?.idempotencyKey;
35
+ if (typeof key !== 'string' || key.trim() === '') {
36
+ throw new TypeError(`pos.returns.${call} needs options.idempotencyKey (a fresh UUIDv7 per return; reuse it only to retry the same one).`);
37
+ }
38
+ return key;
39
+ }
40
+ export function createPosReturnsModule(transport) {
41
+ const gql = async (query, variables, options) => transport.graphql({ api: 'admin', query, variables }, options);
42
+ return {
43
+ async quote(input, options) {
44
+ try {
45
+ const data = await gql(POS_RETURN_QUOTE_QUERY, { input }, options);
46
+ return data.posReturnQuote;
47
+ }
48
+ catch (error) {
49
+ // An engine before the till's consent (Q4) refuses the whole document; the quote is still
50
+ // readable without it, and that engine takes no answer. Any other failure is the read's.
51
+ if (!isUnknownFieldRejection(error))
52
+ throw error;
53
+ const data = await gql(POS_RETURN_QUOTE_QUERY_BEFORE_CONSENT, { input }, options);
54
+ return withoutConsent(data.posReturnQuote);
55
+ }
56
+ },
57
+ async create(input, options) {
58
+ const idempotencyKey = keyOf(options, 'create');
59
+ // The answer only when stated: left out or null, the request is what it always was.
60
+ const { customerAgreed, ...rest } = input;
61
+ const data = await gql(POS_RETURN_MUTATION, { input: { ...rest, ...statedCustomerAgreed(customerAgreed), idempotencyKey } }, options);
62
+ return data.posReturn;
63
+ },
64
+ async void(input, options) {
65
+ const idempotencyKey = keyOf(options, 'void');
66
+ const data = await gql(POS_VOID_SALE_MUTATION, { input: { ...input, idempotencyKey } }, options);
67
+ return data.posVoidSale;
68
+ },
69
+ async findOnlineOrder(ref, options) {
70
+ const data = await gql(POS_ONLINE_ORDER_QUERY, { input: ref }, options);
71
+ return data.posOnlineOrder;
72
+ },
73
+ async onlineQuote(input, options) {
74
+ const data = await gql(POS_ONLINE_RETURN_QUOTE_QUERY, { input }, options);
75
+ return withoutConsent(data.posOnlineReturnQuote);
76
+ },
77
+ async onlineReturn(input, options) {
78
+ const idempotencyKey = keyOf(options, 'onlineReturn');
79
+ const data = await gql(POS_ONLINE_RETURN_MUTATION, { input: { ...input, idempotencyKey } }, options);
80
+ return data.posOnlineReturn;
81
+ },
82
+ };
83
+ }
@@ -0,0 +1,139 @@
1
+ import { type Page, type Transport } from '@sixtyninecommerce/core';
2
+ import type { Call, ListOptions } from '../types.js';
3
+ /**
4
+ * `admin.pricing.coupons.bulk`: unique codes generated in bulk for a promotion of the store
5
+ * (`vendure-plugin-bulk-coupons`). A code stands in for its promotion's own coupon code, so a
6
+ * promotion WITHOUT a coupon code takes none: its codes would never be accepted. Each code keeps
7
+ * its group's usage limits on top of the promotion's.
8
+ *
9
+ * Every id names a record of THIS store: another store's promotion, group or code is
10
+ * `ENTITY_NOT_FOUND` (`NotFoundError`, 404), the same answer as one that does not exist.
11
+ */
12
+ export interface PricingBulkCouponsModule {
13
+ /**
14
+ * The promotion's code groups, newest first, each with how many of its codes are active and
15
+ * how many uses its codes have had (orders holding a code that are not cancelled). A voucher
16
+ * template (`kind: 'voucher'`, `pricing.vouchers`) is a group too.
17
+ *
18
+ * @effect read
19
+ * @permission ReadPromotion
20
+ */
21
+ groups(promotionId: string, options?: Call): Promise<BulkCouponGroup[]>;
22
+ /**
23
+ * One page of a group's codes, oldest first and then by id, an order every page agrees on, so
24
+ * a walk with `for await` sees each code once (`limit` 1 to 1,000, default 25), each with its
25
+ * own use count. Refused before sending: `INVALID_PAGE_SIZE` (`ValidationError`, 400).
26
+ *
27
+ * @effect read
28
+ * @permission ReadPromotion
29
+ */
30
+ codes(groupId: string, options?: ListOptions): Promise<Page<BulkCouponCode>>;
31
+ /**
32
+ * Generate a group of `quantity` new codes, `PREFIX-RANDOM`, for the promotion, and answer
33
+ * the group. The prefix is trimmed; the random part is `codeLength` characters (8 when
34
+ * omitted).
35
+ *
36
+ * Refusals (`ValidationError`, 400): `BULK_COUPON_PREFIX_INVALID` (1 to 50 capital letters,
37
+ * digits or "-", starting with a letter or digit), `BULK_COUPON_CODE_LENGTH_INVALID` (8 to
38
+ * 32), `BULK_COUPON_QUANTITY_INVALID` (1 to 100,000);
39
+ * `BULK_COUPON_CODE_SPACE_EXHAUSTED` (`BusinessRuleError`, 422) when the prefix and length
40
+ * have too few free codes left (choose a longer length or another prefix). Nothing is saved
41
+ * on a refusal. A repeat generates another group: no `idempotencyKey` is read.
42
+ *
43
+ * @effect write
44
+ * @permission CreatePromotion
45
+ */
46
+ generate(input: GenerateBulkCouponsInput, options?: Call): Promise<BulkCouponGroup>;
47
+ /**
48
+ * Accept a switched-off code again, and answer it.
49
+ *
50
+ * @effect write
51
+ * @permission UpdatePromotion
52
+ */
53
+ activate(codeId: string, options?: Call): Promise<BulkCouponCode>;
54
+ /**
55
+ * Stop accepting one code from now on, and answer it.
56
+ *
57
+ * @effect write
58
+ * @permission UpdatePromotion
59
+ */
60
+ deactivate(codeId: string, options?: Call): Promise<BulkCouponCode>;
61
+ /**
62
+ * Stop accepting every code of a group (each can be switched on again with
63
+ * {@link activate}).
64
+ *
65
+ * @effect write
66
+ * @permission UpdatePromotion
67
+ */
68
+ deactivateGroup(groupId: string, options?: Call): Promise<void>;
69
+ /**
70
+ * Delete a group and every code in it: none is accepted again, and none can be switched back
71
+ * on.
72
+ *
73
+ * @effect destructive
74
+ * @permission DeletePromotion
75
+ */
76
+ deleteGroup(groupId: string, options?: Call): Promise<void>;
77
+ /**
78
+ * Every code of a group as CSV text, in the order of {@link codes}: a `code,active,created_at`
79
+ * header, then one line per code (`active` is `true`/`false`, `created_at` an ISO-8601 instant).
80
+ *
81
+ * @effect read
82
+ * @permission ReadPromotion
83
+ */
84
+ export(groupId: string, options?: Call): Promise<string>;
85
+ }
86
+ export interface BulkCouponGroup {
87
+ id: string;
88
+ promotionId: string;
89
+ prefix: string;
90
+ codeLength: number;
91
+ /** Codes generated up front; 0 for a voucher template, whose codes are issued one by one. */
92
+ quantity: number;
93
+ /** Uses each code allows; null for no limit of its own. */
94
+ perCodeUsageLimit: number | null;
95
+ /** Uses each code allows one customer; null for no limit of its own. */
96
+ perCodeCustomerUsageLimit: number | null;
97
+ /** `batch` (generated up front) or `voucher` (personal codes issued one by one). */
98
+ kind: 'batch' | 'voucher' | (string & {});
99
+ /** A voucher template's validity in days when an issue names none. */
100
+ defaultValidityDays: number | null;
101
+ activeCount: number;
102
+ usedCount: number;
103
+ createdAt: string;
104
+ }
105
+ export interface BulkCouponCode {
106
+ id: string;
107
+ code: string;
108
+ isActive: boolean;
109
+ usageCount: number;
110
+ createdAt: string;
111
+ /** A voucher's customer; null for a batch code (or a voucher whose customer was erased). */
112
+ customerId: string | null;
113
+ /** A voucher's own expiry; its promotion's end still applies. */
114
+ expiresAt: string | null;
115
+ /** The system that issued a voucher, as it named itself. */
116
+ sourceSystem: string | null;
117
+ /** The issuing journey's own reference, opaque. */
118
+ sourceRef: string | null;
119
+ }
120
+ export interface GenerateBulkCouponsInput {
121
+ promotionId: string;
122
+ prefix: string;
123
+ /** The random part's length, 8 to 32; 8 when omitted. */
124
+ codeLength?: number;
125
+ /** 1 to 100,000. */
126
+ quantity: number;
127
+ perCodeUsageLimit?: number | null;
128
+ perCodeCustomerUsageLimit?: number | null;
129
+ }
130
+ export declare const BULK_COUPON_GROUPS_QUERY = "\n query BulkCouponGroups($promotionId: ID!) {\n bulkCouponGroups(promotionId: $promotionId) { \n id\n promotionId\n prefix\n codeLength\n quantity\n perCodeUsageLimit\n perCodeCustomerUsageLimit\n kind\n defaultValidityDays\n activeCount\n usedCount\n createdAt\n }\n }\n";
131
+ export declare const BULK_COUPON_CODES_QUERY = "\n query BulkCouponCodes($groupId: ID!, $options: BulkCouponCodeListOptions) {\n bulkCouponCodes(groupId: $groupId, options: $options) {\n items { \n id\n code\n isActive\n usageCount\n createdAt\n customerId\n expiresAt\n sourceSystem\n sourceRef\n }\n totalItems\n }\n }\n";
132
+ export declare const GENERATE_BULK_COUPONS_MUTATION = "\n mutation GenerateBulkCoupons($input: GenerateBulkCouponsInput!) {\n generateBulkCoupons(input: $input) { \n id\n promotionId\n prefix\n codeLength\n quantity\n perCodeUsageLimit\n perCodeCustomerUsageLimit\n kind\n defaultValidityDays\n activeCount\n usedCount\n createdAt\n }\n }\n";
133
+ export declare const ACTIVATE_BULK_COUPON_CODE_MUTATION = "\n mutation ActivateBulkCouponCode($id: ID!) {\n activateBulkCouponCode(id: $id) { \n id\n code\n isActive\n usageCount\n createdAt\n customerId\n expiresAt\n sourceSystem\n sourceRef\n }\n }\n";
134
+ export declare const DEACTIVATE_BULK_COUPON_CODE_MUTATION = "\n mutation DeactivateBulkCouponCode($id: ID!) {\n deactivateBulkCouponCode(id: $id) { \n id\n code\n isActive\n usageCount\n createdAt\n customerId\n expiresAt\n sourceSystem\n sourceRef\n }\n }\n";
135
+ export declare const DEACTIVATE_BULK_COUPON_GROUP_MUTATION = "\n mutation DeactivateBulkCouponGroup($groupId: ID!) {\n deactivateBulkCouponGroup(groupId: $groupId)\n }\n";
136
+ export declare const DELETE_BULK_COUPON_GROUP_MUTATION = "\n mutation DeleteBulkCouponGroup($groupId: ID!) {\n deleteBulkCouponGroup(groupId: $groupId)\n }\n";
137
+ /** A mutation, though it writes nothing: the plugin declares it so (`ReadPromotion`). */
138
+ export declare const EXPORT_BULK_COUPON_CODES_MUTATION = "\n mutation ExportBulkCouponCodes($groupId: ID!) {\n exportBulkCouponCodes(groupId: $groupId)\n }\n";
139
+ export declare function createPricingBulkCouponsModule(transport: Transport): PricingBulkCouponsModule;
@@ -0,0 +1,112 @@
1
+ import { UpstreamError } from '@sixtyninecommerce/core';
2
+ import { fieldOf, vendureListPage } from '../catalog/types.js';
3
+ const GROUP_FIELDS = /* GraphQL */ `
4
+ id
5
+ promotionId
6
+ prefix
7
+ codeLength
8
+ quantity
9
+ perCodeUsageLimit
10
+ perCodeCustomerUsageLimit
11
+ kind
12
+ defaultValidityDays
13
+ activeCount
14
+ usedCount
15
+ createdAt
16
+ `;
17
+ const CODE_FIELDS = /* GraphQL */ `
18
+ id
19
+ code
20
+ isActive
21
+ usageCount
22
+ createdAt
23
+ customerId
24
+ expiresAt
25
+ sourceSystem
26
+ sourceRef
27
+ `;
28
+ export const BULK_COUPON_GROUPS_QUERY = /* GraphQL */ `
29
+ query BulkCouponGroups($promotionId: ID!) {
30
+ bulkCouponGroups(promotionId: $promotionId) { ${GROUP_FIELDS} }
31
+ }
32
+ `;
33
+ export const BULK_COUPON_CODES_QUERY = /* GraphQL */ `
34
+ query BulkCouponCodes($groupId: ID!, $options: BulkCouponCodeListOptions) {
35
+ bulkCouponCodes(groupId: $groupId, options: $options) {
36
+ items { ${CODE_FIELDS} }
37
+ totalItems
38
+ }
39
+ }
40
+ `;
41
+ export const GENERATE_BULK_COUPONS_MUTATION = /* GraphQL */ `
42
+ mutation GenerateBulkCoupons($input: GenerateBulkCouponsInput!) {
43
+ generateBulkCoupons(input: $input) { ${GROUP_FIELDS} }
44
+ }
45
+ `;
46
+ export const ACTIVATE_BULK_COUPON_CODE_MUTATION = /* GraphQL */ `
47
+ mutation ActivateBulkCouponCode($id: ID!) {
48
+ activateBulkCouponCode(id: $id) { ${CODE_FIELDS} }
49
+ }
50
+ `;
51
+ export const DEACTIVATE_BULK_COUPON_CODE_MUTATION = /* GraphQL */ `
52
+ mutation DeactivateBulkCouponCode($id: ID!) {
53
+ deactivateBulkCouponCode(id: $id) { ${CODE_FIELDS} }
54
+ }
55
+ `;
56
+ export const DEACTIVATE_BULK_COUPON_GROUP_MUTATION = /* GraphQL */ `
57
+ mutation DeactivateBulkCouponGroup($groupId: ID!) {
58
+ deactivateBulkCouponGroup(groupId: $groupId)
59
+ }
60
+ `;
61
+ export const DELETE_BULK_COUPON_GROUP_MUTATION = /* GraphQL */ `
62
+ mutation DeleteBulkCouponGroup($groupId: ID!) {
63
+ deleteBulkCouponGroup(groupId: $groupId)
64
+ }
65
+ `;
66
+ /** A mutation, though it writes nothing: the plugin declares it so (`ReadPromotion`). */
67
+ export const EXPORT_BULK_COUPON_CODES_MUTATION = /* GraphQL */ `
68
+ mutation ExportBulkCouponCodes($groupId: ID!) {
69
+ exportBulkCouponCodes(groupId: $groupId)
70
+ }
71
+ `;
72
+ /** A `Boolean!` door's answer: anything but `true` is refused, never taken as done. */
73
+ function assertDone(field, answer) {
74
+ if (answer === true)
75
+ return;
76
+ throw new UpstreamError({
77
+ code: 'UNEXPECTED_RESPONSE',
78
+ message: `The engine answered "${field}" with ${JSON.stringify(answer)}, not true.`,
79
+ status: 502,
80
+ service: 'vendure',
81
+ });
82
+ }
83
+ export function createPricingBulkCouponsModule(transport) {
84
+ return {
85
+ groups(promotionId, options) {
86
+ return fieldOf(transport, BULK_COUPON_GROUPS_QUERY, 'bulkCouponGroups', { promotionId }, options);
87
+ },
88
+ codes(groupId, options) {
89
+ return vendureListPage(transport, BULK_COUPON_CODES_QUERY, 'bulkCouponCodes', (skip, take) => ({ groupId, options: { skip, take } }), options);
90
+ },
91
+ generate(input, options) {
92
+ return fieldOf(transport, GENERATE_BULK_COUPONS_MUTATION, 'generateBulkCoupons', { input }, options);
93
+ },
94
+ activate(codeId, options) {
95
+ return fieldOf(transport, ACTIVATE_BULK_COUPON_CODE_MUTATION, 'activateBulkCouponCode', { id: codeId }, options);
96
+ },
97
+ deactivate(codeId, options) {
98
+ return fieldOf(transport, DEACTIVATE_BULK_COUPON_CODE_MUTATION, 'deactivateBulkCouponCode', { id: codeId }, options);
99
+ },
100
+ async deactivateGroup(groupId, options) {
101
+ const field = 'deactivateBulkCouponGroup';
102
+ assertDone(field, await fieldOf(transport, DEACTIVATE_BULK_COUPON_GROUP_MUTATION, field, { groupId }, options));
103
+ },
104
+ async deleteGroup(groupId, options) {
105
+ const field = 'deleteBulkCouponGroup';
106
+ assertDone(field, await fieldOf(transport, DELETE_BULK_COUPON_GROUP_MUTATION, field, { groupId }, options));
107
+ },
108
+ export(groupId, options) {
109
+ return fieldOf(transport, EXPORT_BULK_COUPON_CODES_MUTATION, 'exportBulkCouponCodes', { groupId }, options);
110
+ },
111
+ };
112
+ }
@@ -1,6 +1,8 @@
1
1
  import { type Page, type Transport } from '@sixtyninecommerce/core';
2
- import type { ConfigurableOperation, ConfigurableOperationInput, LanguageCode } from '../catalog/types.js';
3
- import type { Call } from '../types.js';
2
+ import { type ConfigurableOperation, type ConfigurableOperationInput, type LanguageCode } from '../catalog/types.js';
3
+ import type { Call, ConfigurableOperationDefinition, ListOptions } from '../types.js';
4
+ import { type PricingBulkCouponsModule } from './bulk-coupons.js';
5
+ import { type PricingPriceListsModule } from './price-lists.js';
4
6
  import { type PricingVouchersModule } from './vouchers.js';
5
7
  /**
6
8
  * Promotions at the register (headless spec §9.2 `pricing`; incentives spec §5,
@@ -36,6 +38,11 @@ export interface PricingModule {
36
38
  coupons: PricingCouponsModule;
37
39
  /** Personal vouchers: templates, issuing, a customer's vouchers (`./vouchers.ts`). */
38
40
  vouchers: PricingVouchersModule;
41
+ /**
42
+ * The store's B2B price lists: the lists, their entries, assignments and order rules, and
43
+ * bulk enable/disable/delete (`./price-lists.ts`).
44
+ */
45
+ priceLists: PricingPriceListsModule;
39
46
  /**
40
47
  * The order's discounts as they stand: its coupon codes, the order-level
41
48
  * discounts, and each line's discounts, every one naming the promotion it came
@@ -45,6 +52,80 @@ export interface PricingModule {
45
52
  discounts(orderId: string, options?: Call): Promise<OrderDiscounts>;
46
53
  }
47
54
  export interface PricingPromotionsModule {
55
+ /**
56
+ * One page of the store's promotions (`limit` 1 to 1,000, default 25), every state and date
57
+ * window: what a back office lists, unlike {@link active}. Walk them all with `for await`:
58
+ * every following page re-sends the same filters, sort and store.
59
+ *
60
+ * - `term` (trimmed; a blank one is ignored) matches a case-insensitive part of the name, in
61
+ * ANY of its languages, or of the coupon code. A row found through another language's name
62
+ * answers that language's `name`. EXCEPT while sorted by `name`: the engine then reads the
63
+ * name in the request's language only (the store's default language where a promotion has
64
+ * none in it), so a term matches no other language; sort by another key to search them all.
65
+ * - `enabled` keeps only the enabled (or disabled) ones; their date window is not judged.
66
+ * - `sort`: one key; the engine's own order when omitted.
67
+ *
68
+ * The store's auto-managed order-rule promotion is never listed (see {@link active}).
69
+ *
70
+ * Refused before sending: `INVALID_PAGE_SIZE` (`ValidationError`, 400) for a `limit` outside
71
+ * 1 to 1,000; `INVALID_PROMOTION_SORT` (`ValidationError`, 400) for a sort field or direction
72
+ * this method does not name; `INVALID_PROMOTION_FILTER` (`ValidationError`, 400) for a `term`
73
+ * that is not a string or an `enabled` that is not a boolean.
74
+ *
75
+ * @effect read
76
+ * @permission ReadPromotion
77
+ */
78
+ list(options?: PromotionListOptions): Promise<Page<PromotionListItem>>;
79
+ /**
80
+ * One promotion of this store with its translations, conditions and actions as stored (the
81
+ * stacking guard included), or `null` when the store has none by that id (another store's
82
+ * answers the same).
83
+ *
84
+ * The store's auto-managed order-rule promotion (the id an "Order discount" on an order names)
85
+ * is answered with `customFields.managedBy` set: it is read-only, every change and the delete
86
+ * are refused `MANAGED_PROMOTION_NOT_ALLOWED`; its rules are set on the price lists
87
+ * (`priceLists.orderRules`). A merchant's promotion answers `managedBy: null`.
88
+ *
89
+ * @effect read
90
+ * @permission ReadPromotion
91
+ */
92
+ get(id: string, options?: Call): Promise<PromotionDetail | null>;
93
+ /**
94
+ * Delete a promotion of this store. It stops applying: an order priced after the delete no
95
+ * longer gets its discount, and its coupon code (and every bulk code generated for it) is no
96
+ * longer accepted.
97
+ *
98
+ * Refusals: `ENTITY_NOT_FOUND` (`NotFoundError`, 404) for an id this store does not hold (one
99
+ * answer for another store's and an unknown one), `SHARED_PROMOTION_NOT_ALLOWED` (403) for a
100
+ * promotion other stores hold too, `MANAGED_PROMOTION_NOT_ALLOWED` (`PermissionDeniedError`,
101
+ * 403) for the store's auto-managed order-rule promotion, and `PROMOTION_NOT_DELETED`
102
+ * (`ConflictError`, 409) should the engine answer that it kept it.
103
+ *
104
+ * @effect destructive
105
+ * @permission DeletePromotion
106
+ */
107
+ delete(id: string, options?: Call): Promise<void>;
108
+ /**
109
+ * The conditions a promotion of this store can carry, each with its arguments, in the
110
+ * language of the request. Two the engine registers are left out because a caller never sets
111
+ * them: the stacking guard (`promotion_stacking_guard`, which {@link create} and
112
+ * {@link update} add themselves) and the price-list order-rule condition
113
+ * (`price_list_order_rules`, refused on every promotion but the store's auto-managed one).
114
+ *
115
+ * `args[].required` is NOT the enforced rule (see `ConfigArgDefinition.required`).
116
+ *
117
+ * @effect read
118
+ * @permission ReadPromotion
119
+ */
120
+ conditionDefinitions(options?: Call): Promise<ConfigurableOperationDefinition[]>;
121
+ /**
122
+ * The actions a promotion of this store can carry, as {@link conditionDefinitions} answers the
123
+ * conditions: the price-list order-rule action (`price_list_order_rules`) is left out.
124
+ *
125
+ * @effect read
126
+ * @permission ReadPromotion
127
+ */
128
+ actionDefinitions(options?: Call): Promise<ConfigurableOperationDefinition[]>;
48
129
  /**
49
130
  * The store's promotions that can apply right now: enabled, inside their date
50
131
  * window, not used up, and — with `customerId` — open to that customer (a
@@ -61,9 +142,17 @@ export interface PricingPromotionsModule {
61
142
  * location of this store that the credential may act at
62
143
  * (`LOCATION_NOT_IN_CHANNEL` / `LOCATION_NOT_ALLOWED`).
63
144
  *
145
+ * The store's auto-managed order-rule promotion is never listed: it applies
146
+ * the order rules of the store's price lists (`priceLists.orderRules`), is no
147
+ * offer, and is managed by the platform. Its discount still shows on an order
148
+ * ("Order discount", {@link PricingOrdersModule.discounts}), naming that
149
+ * promotion's id.
150
+ *
64
151
  * Needs `ReadPromotion`, `CreateOrder` or `OperatePos`. A `Page` because every
65
152
  * list in this SDK is one; the engine answers the whole list, so it is always
66
153
  * the last page.
154
+ *
155
+ * @effect read
67
156
  */
68
157
  active(filter?: ActivePromotionsFilter, options?: Call): Promise<Page<ActivePromotion>>;
69
158
  /**
@@ -85,12 +174,18 @@ export interface PricingPromotionsModule {
85
174
  * targeting or set argument the engine cannot read, a second set condition or
86
175
  * a set action without its condition (`argument: "conditions"`), or a set
87
176
  * condition without its action or a second copy of a set action
88
- * (`argument: "actions"`), judged on `update` for the pair the update leaves; `extensions.details` names the condition and
177
+ * (`argument: "actions"`), judged on `update` for the pair the update leaves,
178
+ * or the price-list order-rule pair `price_list_order_rules`, which only the
179
+ * store's own auto-managed promotion carries (`argument: "conditions"` or
180
+ * `"actions"`: order rules are set on a price list); `extensions.details` names the condition and
89
181
  * argument), `LOCATION_NOT_IN_CHANNEL` (a location of another store, or not
90
182
  * an id), `LOCATION_NOT_ALLOWED` (outside the credential's location
91
183
  * restriction), `FACET_VALUE_NOT_FOUND` / `COLLECTION_NOT_FOUND`
92
184
  * (`NotFoundError`, 404: a set component names a facet value or collection
93
185
  * this store does not have; another store's answers the same).
186
+ *
187
+ * @effect write
188
+ * @permission CreatePromotion
94
189
  */
95
190
  create(input: CreatePromotionInput, options?: Call): Promise<PricingPromotion>;
96
191
  /**
@@ -98,7 +193,10 @@ export interface PricingPromotionsModule {
98
193
  * replace the whole list (the guard is kept as on create). Needs
99
194
  * `UpdatePromotion`.
100
195
  *
101
- * Refusals: those of {@link PricingPromotionsModule.create}, and
196
+ * Refusals: those of {@link PricingPromotionsModule.create},
197
+ * `MANAGED_PROMOTION_NOT_ALLOWED` (`PermissionDeniedError`, 403) for the
198
+ * store's auto-managed order-rule promotion (the id an "Order discount" on an
199
+ * order names; change the price list's order rules instead), and
102
200
  * `MISSING_CONDITIONS_ERROR` (`BusinessRuleError`, 422) for one case: the input
103
201
  * does not name `conditions`, the STORED promotion has none (an imported
104
202
  * coupon, a seed: no guard was ever added), and the result would have no coupon
@@ -106,6 +204,9 @@ export interface PricingPromotionsModule {
106
204
  * conditions from the stored ones, and the guard is added only to conditions
107
205
  * the input sends: send `conditions` (even `[]`) to keep such a promotion
108
206
  * without a code.
207
+ *
208
+ * @effect write
209
+ * @permission UpdatePromotion
109
210
  */
110
211
  update(input: UpdatePromotionInput, options?: Call): Promise<PricingPromotion>;
111
212
  }
@@ -255,7 +356,71 @@ export interface PricingPromotion {
255
356
  priority: number | null;
256
357
  };
257
358
  }
359
+ /** What {@link PricingPromotionsModule.list} can sort by. */
360
+ export type PromotionSortField = 'name' | 'couponCode' | 'startsAt' | 'endsAt' | 'createdAt' | 'updatedAt';
361
+ export declare const PROMOTION_SORT_FIELDS: readonly PromotionSortField[];
362
+ export interface PromotionListOptions extends ListOptions {
363
+ /**
364
+ * A part of the name (any language, unless sorted by `name`: see `list`) or of the coupon code,
365
+ * capitals ignored; trimmed.
366
+ */
367
+ term?: string;
368
+ /** Only the enabled (`true`) or the disabled (`false`) ones. */
369
+ enabled?: boolean;
370
+ /** ONE sort key; the engine's own order when omitted. */
371
+ sort?: {
372
+ field: PromotionSortField;
373
+ direction: 'ASC' | 'DESC';
374
+ };
375
+ }
376
+ /** A promotion as {@link PricingPromotionsModule.list} answers it. */
377
+ export interface PromotionListItem {
378
+ id: string;
379
+ /** In the request's language, or the language whose name a `term` matched. */
380
+ name: string;
381
+ description: string;
382
+ couponCode: string | null;
383
+ enabled: boolean;
384
+ /** ISO-8601 instants; null for an open start or end. */
385
+ startsAt: string | null;
386
+ endsAt: string | null;
387
+ usageLimit: number | null;
388
+ perCustomerUsageLimit: number | null;
389
+ createdAt: string;
390
+ updatedAt: string;
391
+ customFields: {
392
+ combineWithB2b: boolean | null;
393
+ combineWithOtherPromotions: boolean | null;
394
+ priority: number | null;
395
+ };
396
+ }
397
+ /** A promotion as {@link PricingPromotionsModule.get} answers it. */
398
+ export interface PromotionDetail extends Omit<PromotionListItem, 'customFields'> {
399
+ translations: Array<{
400
+ id: string;
401
+ languageCode: LanguageCode;
402
+ name: string;
403
+ description: string;
404
+ }>;
405
+ /** As stored, the stacking guard (`promotion_stacking_guard`) included. */
406
+ conditions: ConfigurableOperation[];
407
+ actions: ConfigurableOperation[];
408
+ customFields: PromotionListItem['customFields'] & {
409
+ /**
410
+ * Set only on the store's auto-managed order-rule promotion (`price-list-order-rules`): a
411
+ * platform service owns it, and every change and the delete are refused. `null` for a
412
+ * merchant's promotion.
413
+ */
414
+ managedBy: string | null;
415
+ };
416
+ }
258
417
  export interface PricingCouponsModule {
418
+ /**
419
+ * Unique codes generated in bulk for a promotion with a coupon code (`./bulk-coupons.ts`):
420
+ * the groups, their codes, generating, switching a code or a group off, deleting a group, and
421
+ * a group's codes as CSV.
422
+ */
423
+ bulk: PricingBulkCouponsModule;
259
424
  /**
260
425
  * Apply a coupon code — a promotion's own code or a unique code generated for
261
426
  * it — to a DRAFT order of this store: a back-office draft, or an order
@@ -400,6 +565,11 @@ export declare const ORDER_DISCOUNTS_FIELDS = "\n id\n code\n state\n curren
400
565
  export declare const ACTIVE_PROMOTIONS_QUERY = "\n query ActivePromotions($locationId: ID, $customerId: ID) {\n activePromotions(locationId: $locationId, customerId: $customerId) {\n id\n name\n description\n startsAt\n endsAt\n requiresCouponCode\n usageLimit\n perCustomerUsageLimit\n conditions { code args { name value } summary }\n actions { code args { name value } summary }\n summary\n }\n }\n";
401
566
  export declare const CREATE_PROMOTION_MUTATION = "\n mutation CreatePromotion($input: CreatePromotionInput!) {\n createPromotion(input: $input) {\n ... on Promotion { \n id\n name\n description\n enabled\n couponCode\n startsAt\n endsAt\n usageLimit\n perCustomerUsageLimit\n conditions { code args { name value } }\n actions { code args { name value } }\n customFields { combineWithB2b combineWithOtherPromotions priority }\n }\n ... on ErrorResult { errorCode message }\n }\n }\n";
402
567
  export declare const UPDATE_PROMOTION_MUTATION = "\n mutation UpdatePromotion($input: UpdatePromotionInput!) {\n updatePromotion(input: $input) {\n ... on Promotion { \n id\n name\n description\n enabled\n couponCode\n startsAt\n endsAt\n usageLimit\n perCustomerUsageLimit\n conditions { code args { name value } }\n actions { code args { name value } }\n customFields { combineWithB2b combineWithOtherPromotions priority }\n }\n ... on ErrorResult { errorCode message }\n }\n }\n";
568
+ export declare const PROMOTIONS_QUERY = "\n query StorePromotions($options: PromotionListOptions) {\n promotions(options: $options) {\n items {\n \n id\n name\n description\n couponCode\n enabled\n startsAt\n endsAt\n usageLimit\n perCustomerUsageLimit\n createdAt\n updatedAt\n\n customFields { combineWithB2b combineWithOtherPromotions priority }\n }\n totalItems\n }\n }\n";
569
+ export declare const PROMOTION_QUERY = "\n query StorePromotion($id: ID!) {\n promotion(id: $id) {\n \n id\n name\n description\n couponCode\n enabled\n startsAt\n endsAt\n usageLimit\n perCustomerUsageLimit\n createdAt\n updatedAt\n\n translations { id languageCode name description }\n conditions { code args { name value } }\n actions { code args { name value } }\n customFields { combineWithB2b combineWithOtherPromotions priority managedBy }\n }\n }\n";
570
+ export declare const DELETE_PROMOTION_MUTATION = "\n mutation DeleteStorePromotion($id: ID!) {\n deletePromotion(id: $id) {\n result\n message\n }\n }\n";
571
+ export declare const PROMOTION_CONDITION_DEFINITIONS_QUERY = "\n query PromotionConditionDefinitions {\n promotionConditions { \n code\n description\n args {\n name\n type\n list\n required\n defaultValue\n label\n description\n ui\n }\n }\n }\n";
572
+ export declare const PROMOTION_ACTION_DEFINITIONS_QUERY = "\n query PromotionActionDefinitions {\n promotionActions { \n code\n description\n args {\n name\n type\n list\n required\n defaultValue\n label\n description\n ui\n }\n }\n }\n";
403
573
  /** The condition the dashboard and the admin app put on every promotion they save. */
404
574
  export declare const STACKING_GUARD_CONDITION = "promotion_stacking_guard";
405
575
  export declare const APPLY_COUPON_CODE_TO_ORDER_MUTATION = "\n mutation ApplyCouponCodeToOrder($orderId: ID!, $couponCode: String!, $idempotencyKey: String) {\n applyCouponCodeToOrder(\n orderId: $orderId\n couponCode: $couponCode\n idempotencyKey: $idempotencyKey\n ) {\n \n id\n code\n state\n currencyCode\n couponCodes\n subTotal\n subTotalWithTax\n shipping\n shippingWithTax\n total\n totalWithTax\n discounts { promotionId adjustmentSource type description amount amountWithTax }\n promotions { id name }\n lines {\n id\n quantity\n productVariant { id sku name }\n unitPrice\n unitPriceWithTax\n linePrice\n linePriceWithTax\n discountedLinePrice\n discountedLinePriceWithTax\n proratedLinePrice\n proratedLinePriceWithTax\n discounts { promotionId adjustmentSource type description amount amountWithTax }\n }\n surcharges { id description sku price priceWithTax }\n packages { promotionId label price priceWithTax lineIds quantity }\n\n }\n }\n";