@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,99 @@
1
+ /**
2
+ * `admin.orders.moneyView(orderId, { basis })`: an order's money as rows that add up exactly to
3
+ * its own totals, in one basis (pricing-display-consistency, USER O12). Every surface that shows
4
+ * an order's money prints these rows, so an order page, an email and an invoice cannot disagree
5
+ * by a cent. The engine builds them (`Order.moneyView`); this module only reads them.
6
+ */
7
+ import { NotFoundError, ValidationError, } from '@sixtyninecommerce/core';
8
+ import { isUnknownFieldRejection } from '../payments/store-credit-fields.js';
9
+ /**
10
+ * Which prices a view shows. `GROSS` = incl. VAT, `NET` = excl. VAT. `STORE` follows how the
11
+ * store sets its prices; `CUSTOMER` how the shop shows prices to the order's customer. The view
12
+ * answers the one it used, `GROSS` or `NET`.
13
+ */
14
+ export const ORDER_MONEY_BASES = ['STORE', 'CUSTOMER', 'GROSS', 'NET'];
15
+ const ROW_FIELDS = 'key description amount taxRate';
16
+ /** Every field of an `OrderMoneyView`, at every depth: the selection each document reads it with. */
17
+ export const ORDER_MONEY_VIEW_FIELDS = /* GraphQL */ `
18
+ basis
19
+ currencyCode
20
+ lines { orderLineId quantity taxRate unitAmount amount }
21
+ goodsAdjustments { ${ROW_FIELDS} }
22
+ surcharges { ${ROW_FIELDS} }
23
+ subtotal
24
+ shipping { ${ROW_FIELDS} }
25
+ shippingAdjustments { ${ROW_FIELDS} }
26
+ shippingTotal
27
+ totalExcludingTax
28
+ taxes { taxRate base amount }
29
+ taxIncluded
30
+ taxTotal
31
+ rounding
32
+ total
33
+ totalBeforeRounding
34
+ balance { paid giftCard storeCredit credited stillToPay stillToPayNote }
35
+ reconciles
36
+ `;
37
+ export const ORDER_MONEY_VIEW_QUERY = /* GraphQL */ `
38
+ query OrderMoneyView($id: ID!, $basis: OrderMoneyBasis!) {
39
+ order(id: $id) {
40
+ id
41
+ moneyView(basis: $basis) {${ORDER_MONEY_VIEW_FIELDS} }
42
+ }
43
+ }
44
+ `;
45
+ /** `INVALID_ORDER_MONEY_BASIS` for a basis not in `ORDER_MONEY_BASES`, before anything is sent. */
46
+ export function assertOrderMoneyBasis(basis) {
47
+ if (!ORDER_MONEY_BASES.includes(basis)) {
48
+ throw new ValidationError({
49
+ code: 'INVALID_ORDER_MONEY_BASIS',
50
+ message: `The basis must be one of ${ORDER_MONEY_BASES.join(', ')}.`,
51
+ status: 400,
52
+ service: 'vendure',
53
+ });
54
+ }
55
+ }
56
+ const STILL_TO_PAY_NOTE_FIELD = /\bstillToPayNote\b/g;
57
+ /** `document` without `stillToPayNote`: what an engine before it accepts. */
58
+ export function withoutStillToPayNote(document) {
59
+ return document.replace(STILL_TO_PAY_NOTE_FIELD, '');
60
+ }
61
+ /**
62
+ * The transport, sending a document that names `balance.stillToPayNote` (pricing-display-consistency
63
+ * B1c) once more without it when the engine refused it as unknown. Safe for a mutation too: a
64
+ * refused document never ran. The newest money-view field, so it falls away first: wrap it inside
65
+ * any other `*Aware` transport.
66
+ */
67
+ export function stillToPayNoteAware(transport) {
68
+ return {
69
+ async graphql(call, options) {
70
+ try {
71
+ return await transport.graphql(call, options);
72
+ }
73
+ catch (error) {
74
+ const legacy = withoutStillToPayNote(call.query);
75
+ if (legacy === call.query || !isUnknownFieldRejection(error))
76
+ throw error;
77
+ return transport.graphql({ ...call, query: legacy }, options);
78
+ }
79
+ },
80
+ };
81
+ }
82
+ export function createOrderMoneyViewModule(transport) {
83
+ return {
84
+ async moneyView(orderId, options) {
85
+ const basis = options?.basis ?? 'STORE';
86
+ assertOrderMoneyBasis(basis);
87
+ const data = await stillToPayNoteAware(transport).graphql({ api: 'admin', query: ORDER_MONEY_VIEW_QUERY, variables: { id: orderId, basis } }, options);
88
+ if (!data.order) {
89
+ throw new NotFoundError({
90
+ code: 'ORDER_NOT_FOUND',
91
+ message: `This store has no order ${orderId}.`,
92
+ status: 404,
93
+ service: 'vendure',
94
+ });
95
+ }
96
+ return data.order.moneyView;
97
+ },
98
+ };
99
+ }
@@ -13,19 +13,27 @@ export type ExternalLinePriceBasis = 'net' | 'gross';
13
13
  /**
14
14
  * What is going to happen to the goods.
15
15
  *
16
- * A fact the vertical STATES about the order rather than an instruction
17
- * commerce acts on in this release: nothing here creates a fulfilment or picks
18
- * a shipping method. It is recorded as the order's `platform.fulfilment`
19
- * metafield so a document, a WMS push or a later fulfilment flow can read back
20
- * what the caller actually asked for.
16
+ * Commerce ACTS on it. Nothing here creates a fulfilment or picks a shipping
17
+ * method, but the value decides whether the order needs a shipping method to be
18
+ * placed and whether a fulfilment of it owes a delivery charge. It is recorded
19
+ * as the order's `platform.fulfilment` metafield (only the platform writes it),
20
+ * so a document, a WMS push or a merchant can also read back what you asked for.
21
21
  *
22
22
  * - `pickup` — collected at a location. Needs no shipping method and no
23
- * address.
23
+ * address. Handed over through an ordinary fulfilment, which adds no delivery
24
+ * charge and is not held to a fulfilment profile's minimum.
24
25
  * - `ship` — shipped. The order still needs a shipping method before it can
25
26
  * leave `Draft`, and `transitionTo: 'ArrangingPayment'` on an order that has
26
27
  * none is refused by the platform's own placement gate, not by this call.
28
+ * Delivery charges and profile minimums apply as for any delivered order.
27
29
  * - `none` — neither shipped nor collected: a service, a subscription set-up,
28
- * a fee.
30
+ * a fee. Needs no shipping method, owes no delivery charge and takes no
31
+ * profile minimum. The order is marked as having nothing to ship, so it
32
+ * completes on its own once it is paid (after the store's completion grace
33
+ * period). It may not hold goods that are stock-tracked: such a catalog line
34
+ * is refused `LINE_NEEDS_FULFILMENT` here, and so is placing (or modifying)
35
+ * the order to carry one later. Send goods as a `pickup` order, a service as
36
+ * an external line.
29
37
  */
30
38
  export type ExternalOrderFulfilment = 'pickup' | 'ship' | 'none';
31
39
  /**
@@ -478,6 +486,11 @@ export interface OrderEntryModule {
478
486
  * - `LINE_DUPLICATE_VARIANT` — two catalog lines name the same variant.
479
487
  * `details` carries the second one's `position` and the first one's
480
488
  * `firstPosition`. Send one line with the quantity you want.
489
+ * - `LINE_NEEDS_FULFILMENT` — a catalog line whose variant is stock-tracked on
490
+ * an order with `fulfilment: 'none'`. Nothing ships or is handed over on
491
+ * such an order, so nothing would ever sell or release that stock.
492
+ * `details` carries its `position` and `variantId`. Send the order as
493
+ * `pickup` (or `ship`), or the service as an external line.
481
494
  * - `EXTERNAL_LINE_PROMOTION_UNSUPPORTED` — a promotion discounted one of your
482
495
  * externally priced lines. An order-level promotion is shared across every
483
496
  * line of an order by the engine, so the platform refuses rather than
@@ -1,5 +1,6 @@
1
1
  import type { Transport } from '@sixtyninecommerce/core';
2
2
  import type { Call } from '../types.js';
3
+ import { type OrderMoneyBasis, type OrderMoneyView } from './money-view.js';
3
4
  import type { OverpaymentOption } from './surcharges.js';
4
5
  /**
5
6
  * How a one-time discount is stated. A whole-order discount is `PERCENTAGE` or
@@ -376,6 +377,22 @@ export interface OrderEditPreview {
376
377
  taxSummary: OrderEditTaxSummaryLine[];
377
378
  /** The order's total with tax before the edit. */
378
379
  totalWithTaxBefore: number;
380
+ /**
381
+ * The order's money after the edit as the order page prints it once the edit is saved
382
+ * (`orders.moneyView`'s rows, in `planEdit`'s `moneyBasis`), read inside the preview's run.
383
+ * Its `balance` is the order's payments before the plan's `refund`. Print these rows, never
384
+ * the figures above: they are the engine's, before a staff rounding. `null` from an engine
385
+ * before it; absent from `commitEdit`'s plan (read the saved order's `moneyView`).
386
+ */
387
+ moneyView?: OrderMoneyView | null;
388
+ /** The order's money before the edit, read in the same run, in the same basis. */
389
+ moneyViewBefore?: OrderMoneyView | null;
390
+ /**
391
+ * What the edit changes the billable total by (a staff rounding included):
392
+ * `moneyView.total - moneyViewBefore.total`, computed by the engine. Print it as the
393
+ * difference; `totalWithTax - totalWithTaxBefore` ignores the rounding.
394
+ */
395
+ totalDifference?: number | null;
379
396
  }
380
397
  export interface OrderEditPlan {
381
398
  orderId: string;
@@ -422,7 +439,12 @@ export interface OrderEditPlan {
422
439
  * the order-edit plan, so on an older one this call alone fails validation and
423
440
  * no other order call does.
424
441
  */
425
- export declare const PLAN_ORDER_EDIT_QUERY = "\n query PlanOrderEdit($orderId: ID!, $diff: OrderEditDiffInput!) {\n planOrderEdit(orderId: $orderId, diff: $diff) {\n orderId\n planHash\n orderVersion\n steps {\n kind\n input\n moneyEffect\n }\n refund {\n paymentId\n amount\n }\n overpayment {\n amount\n currencyCode\n surchargeIds\n refund {\n available\n code\n message\n }\n accountCredit {\n available\n code\n message\n }\n refundWhenChosen {\n paymentId\n amount\n }\n }\n returnState\n blockers {\n code\n message\n details\n }\n notices {\n code\n message\n details\n }\n payment {\n collected\n reason\n method\n }\n preview {\n currencyCode\n subTotal\n subTotalWithTax\n shipping\n shippingWithTax\n surcharges\n surchargesWithTax\n total\n totalWithTax\n taxSummary {\n description\n taxRate\n taxBase\n taxTotal\n }\n totalWithTaxBefore\n }\n }\n }\n";
442
+ export declare const PLAN_ORDER_EDIT_QUERY = "\n query PlanOrderEdit($orderId: ID!, $diff: OrderEditDiffInput!, $moneyBasis: OrderMoneyBasis!) {\n planOrderEdit(orderId: $orderId, diff: $diff) {\n orderId\n planHash\n orderVersion\n steps {\n kind\n input\n moneyEffect\n }\n refund {\n paymentId\n amount\n }\n overpayment {\n amount\n currencyCode\n surchargeIds\n refund {\n available\n code\n message\n book\n }\n accountCredit {\n available\n code\n message\n book\n }\n refundWhenChosen {\n paymentId\n amount\n }\n }\n returnState\n blockers {\n code\n message\n details\n }\n notices {\n code\n message\n details\n }\n payment {\n collected\n reason\n method\n }\n preview {\n currencyCode\n subTotal\n subTotalWithTax\n shipping\n shippingWithTax\n surcharges\n surchargesWithTax\n total\n totalWithTax\n taxSummary {\n description\n taxRate\n taxBase\n taxTotal\n }\n totalWithTaxBefore\n moneyView(basis: $moneyBasis) {\n basis\n currencyCode\n lines { orderLineId quantity taxRate unitAmount amount }\n goodsAdjustments { key description amount taxRate }\n surcharges { key description amount taxRate }\n subtotal\n shipping { key description amount taxRate }\n shippingAdjustments { key description amount taxRate }\n shippingTotal\n totalExcludingTax\n taxes { taxRate base amount }\n taxIncluded\n taxTotal\n rounding\n total\n totalBeforeRounding\n balance { paid giftCard storeCredit credited stillToPay stillToPayNote }\n reconciles\n }\n moneyViewBefore(basis: $moneyBasis) {\n basis\n currencyCode\n lines { orderLineId quantity taxRate unitAmount amount }\n goodsAdjustments { key description amount taxRate }\n surcharges { key description amount taxRate }\n subtotal\n shipping { key description amount taxRate }\n shippingAdjustments { key description amount taxRate }\n shippingTotal\n totalExcludingTax\n taxes { taxRate base amount }\n taxIncluded\n taxTotal\n rounding\n total\n totalBeforeRounding\n balance { paid giftCard storeCredit credited stillToPay stillToPayNote }\n reconciles\n }\n totalDifference\n }\n }\n }\n";
443
+ /**
444
+ * The document for an engine before the preview's money view (pricing-display-consistency B3):
445
+ * the same plan without `moneyView`, `moneyViewBefore`, `totalDifference` and their basis.
446
+ */
447
+ export declare const PLAN_ORDER_EDIT_QUERY_BEFORE_MONEY_VIEW = "\n query PlanOrderEdit($orderId: ID!, $diff: OrderEditDiffInput!) {\n planOrderEdit(orderId: $orderId, diff: $diff) {\n orderId\n planHash\n orderVersion\n steps {\n kind\n input\n moneyEffect\n }\n refund {\n paymentId\n amount\n }\n overpayment {\n amount\n currencyCode\n surchargeIds\n refund {\n available\n code\n message\n book\n }\n accountCredit {\n available\n code\n message\n book\n }\n refundWhenChosen {\n paymentId\n amount\n }\n }\n returnState\n blockers {\n code\n message\n details\n }\n notices {\n code\n message\n details\n }\n payment {\n collected\n reason\n method\n }\n preview {\n currencyCode\n subTotal\n subTotalWithTax\n shipping\n shippingWithTax\n surcharges\n surchargesWithTax\n total\n totalWithTax\n taxSummary {\n description\n taxRate\n taxBase\n taxTotal\n }\n totalWithTaxBefore\n }\n }\n }\n";
426
448
  export interface OrderPlanEditModule {
427
449
  /**
428
450
  * How an edit of a placed order would be carried out, and what the order
@@ -466,6 +488,12 @@ export interface OrderPlanEditModule {
466
488
  * Keep `planHash` with what you show: `commitEdit` carries the edit out and
467
489
  * names it, so what is saved is what the merchant saw.
468
490
  *
491
+ * Show the edit's money from `preview.moneyView` (after) and `moneyViewBefore`, in
492
+ * `options.moneyBasis` (default `STORE`; `INVALID_ORDER_MONEY_BASIS` before sending for any
493
+ * other value than `ORDER_MONEY_BASES`): the same rows the order page prints once the edit is
494
+ * saved, each promotion, fee, VAT rate and staff rounding its own row. The difference is
495
+ * `preview.totalDifference`. An engine before them answers the plan without them (`null`).
496
+ *
469
497
  * Refusals of the call:
470
498
  * - `ORDER_EDIT_ORDER_NOT_FOUND`, `ORDER_EDIT_LINE_NOT_FOUND`,
471
499
  * `ORDER_EDIT_SURCHARGE_NOT_FOUND` and `ORDER_EDIT_VARIANT_NOT_FOUND`
@@ -483,7 +511,11 @@ export interface OrderPlanEditModule {
483
511
  * was made from the default channel instead of the order's own.
484
512
  * - `ORDER_BUSY` (`ConflictError`, 409): another change of the order was
485
513
  * still being applied. Ask again.
514
+ *
515
+ * @effect read
486
516
  */
487
- planEdit(orderId: string, diff: OrderEditDiff, options?: Call): Promise<OrderEditPlan>;
517
+ planEdit(orderId: string, diff: OrderEditDiff, options?: Call & {
518
+ moneyBasis?: OrderMoneyBasis;
519
+ }): Promise<OrderEditPlan>;
488
520
  }
489
521
  export declare function createOrderPlanEditModule(transport: Transport): OrderPlanEditModule;
@@ -1,9 +1,91 @@
1
+ import { isUnknownFieldRejection, storeCreditAware } from '../payments/store-credit-fields.js';
2
+ import { assertOrderMoneyBasis, ORDER_MONEY_VIEW_FIELDS, stillToPayNoteAware, } from './money-view.js';
1
3
  /**
2
4
  * Its own document on purpose: `planOrderEdit` exists only on an engine with
3
5
  * the order-edit plan, so on an older one this call alone fails validation and
4
6
  * no other order call does.
5
7
  */
6
8
  export const PLAN_ORDER_EDIT_QUERY = /* GraphQL */ `
9
+ query PlanOrderEdit($orderId: ID!, $diff: OrderEditDiffInput!, $moneyBasis: OrderMoneyBasis!) {
10
+ planOrderEdit(orderId: $orderId, diff: $diff) {
11
+ orderId
12
+ planHash
13
+ orderVersion
14
+ steps {
15
+ kind
16
+ input
17
+ moneyEffect
18
+ }
19
+ refund {
20
+ paymentId
21
+ amount
22
+ }
23
+ overpayment {
24
+ amount
25
+ currencyCode
26
+ surchargeIds
27
+ refund {
28
+ available
29
+ code
30
+ message
31
+ book
32
+ }
33
+ accountCredit {
34
+ available
35
+ code
36
+ message
37
+ book
38
+ }
39
+ refundWhenChosen {
40
+ paymentId
41
+ amount
42
+ }
43
+ }
44
+ returnState
45
+ blockers {
46
+ code
47
+ message
48
+ details
49
+ }
50
+ notices {
51
+ code
52
+ message
53
+ details
54
+ }
55
+ payment {
56
+ collected
57
+ reason
58
+ method
59
+ }
60
+ preview {
61
+ currencyCode
62
+ subTotal
63
+ subTotalWithTax
64
+ shipping
65
+ shippingWithTax
66
+ surcharges
67
+ surchargesWithTax
68
+ total
69
+ totalWithTax
70
+ taxSummary {
71
+ description
72
+ taxRate
73
+ taxBase
74
+ taxTotal
75
+ }
76
+ totalWithTaxBefore
77
+ moneyView(basis: $moneyBasis) {${ORDER_MONEY_VIEW_FIELDS} }
78
+ moneyViewBefore(basis: $moneyBasis) {${ORDER_MONEY_VIEW_FIELDS} }
79
+ totalDifference
80
+ }
81
+ }
82
+ }
83
+ `;
84
+ /**
85
+ * The document for an engine before the preview's money view (pricing-display-consistency B3):
86
+ * the same plan without `moneyView`, `moneyViewBefore`, `totalDifference` and their basis.
87
+ */
88
+ export const PLAN_ORDER_EDIT_QUERY_BEFORE_MONEY_VIEW = /* GraphQL */ `
7
89
  query PlanOrderEdit($orderId: ID!, $diff: OrderEditDiffInput!) {
8
90
  planOrderEdit(orderId: $orderId, diff: $diff) {
9
91
  orderId
@@ -26,11 +108,13 @@ export const PLAN_ORDER_EDIT_QUERY = /* GraphQL */ `
26
108
  available
27
109
  code
28
110
  message
111
+ book
29
112
  }
30
113
  accountCredit {
31
114
  available
32
115
  code
33
116
  message
117
+ book
34
118
  }
35
119
  refundWhenChosen {
36
120
  paymentId
@@ -77,17 +161,34 @@ export const PLAN_ORDER_EDIT_QUERY = /* GraphQL */ `
77
161
  export function createOrderPlanEditModule(transport) {
78
162
  return {
79
163
  async planEdit(orderId, diff, options) {
80
- const data = await transport.graphql({
81
- api: 'admin',
82
- query: PLAN_ORDER_EDIT_QUERY,
83
- // The diff goes out as given, never normalised: `orderDiscount` left
84
- // out, `null` and a value are three different requests to the engine
85
- // (keep, remove, set). `JSON.stringify` drops a key that is
86
- // `undefined` and keeps a `null`, so a default here would turn
87
- // "keep" into "remove".
88
- variables: { orderId, diff },
89
- }, options);
90
- return data.planOrderEdit;
164
+ const moneyBasis = options?.moneyBasis ?? 'STORE';
165
+ assertOrderMoneyBasis(moneyBasis);
166
+ const send = (query, variables) => storeCreditAware(stillToPayNoteAware(transport)).graphql(
167
+ // The diff goes out as given, never normalised: `orderDiscount` left
168
+ // out, `null` and a value are three different requests to the engine
169
+ // (keep, remove, set). `JSON.stringify` drops a key that is
170
+ // `undefined` and keeps a `null`, so a default here would turn
171
+ // "keep" into "remove".
172
+ { api: 'admin', query, variables: { orderId, diff, ...variables } }, options);
173
+ try {
174
+ return (await send(PLAN_ORDER_EDIT_QUERY, { moneyBasis })).planOrderEdit;
175
+ }
176
+ catch (error) {
177
+ // An engine before the preview's money refuses the document before it runs, so
178
+ // nothing was planned: ask again without it.
179
+ if (!isUnknownFieldRejection(error))
180
+ throw error;
181
+ const { planOrderEdit } = await send(PLAN_ORDER_EDIT_QUERY_BEFORE_MONEY_VIEW, {});
182
+ return {
183
+ ...planOrderEdit,
184
+ preview: planOrderEdit.preview && {
185
+ ...planOrderEdit.preview,
186
+ moneyView: null,
187
+ moneyViewBefore: null,
188
+ totalDifference: null,
189
+ },
190
+ };
191
+ }
91
192
  },
92
193
  };
93
194
  }
@@ -0,0 +1,201 @@
1
+ import { type Transport } from '@sixtyninecommerce/core';
2
+ import type { SettingsSourceKind } from '../tenant/settings-sources.js';
3
+ import type { Call } from '../types.js';
4
+ /** The states an order status rule may move a placed order to. */
5
+ export declare const ORDER_STATUS_RULE_TARGET_STATES: readonly ["AwaitingApproval", "PaymentAuthorized", "PaymentSettled"];
6
+ /** What an order status rule matches on. */
7
+ export declare const ORDER_STATUS_RULE_CONDITION_TYPES: readonly ["product", "coupon", "collection", "facet_value"];
8
+ /** The fewest zero-padded digits of a sequential order number. */
9
+ export declare const ORDER_CODE_DIGITS_MIN = 4;
10
+ /** The most zero-padded digits of a sequential order number. */
11
+ export declare const ORDER_CODE_DIGITS_MAX = 8;
12
+ /**
13
+ * The longest order-number prefix. The engine stores more, but every order code is
14
+ * `NAMESPACE-PREFIX00001` in a 255-character column: a long prefix fails EVERY order placement.
15
+ */
16
+ export declare const ORDER_CODE_PREFIX_MAX_LENGTH = 20;
17
+ /** The youngest minimum purchase age (the engine checks no age below 1: `minimumAge > 0`). */
18
+ export declare const MINIMUM_AGE_MIN = 1;
19
+ /** The oldest minimum purchase age the platform accepts. */
20
+ export declare const MINIMUM_AGE_MAX = 99;
21
+ /**
22
+ * The largest amount (minor units) the minimum and the thresholds hold: the columns are Vendure
23
+ * `int` custom fields, GraphQL `Int` (32 bits). ₩30,000,000 is 3,000,000,000 hundredths, past it.
24
+ */
25
+ export declare const ORDER_SETTINGS_AMOUNT_MAX = 2147483647;
26
+ export type OrderStatusRuleTargetState = (typeof ORDER_STATUS_RULE_TARGET_STATES)[number];
27
+ export type OrderStatusRuleConditionType = (typeof ORDER_STATUS_RULE_CONDITION_TYPES)[number];
28
+ /**
29
+ * A rule that moves an order into `targetState` on its FIRST placement when it matches. Rules run
30
+ * in array order and the first enabled match wins; a rule whose list for its `conditionType` is
31
+ * empty never fires.
32
+ */
33
+ export interface OrderStatusRule {
34
+ id: string;
35
+ /** For people only. `''` for a stored rule that has none: the engine fires it all the same. */
36
+ name: string;
37
+ targetState: OrderStatusRuleTargetState;
38
+ conditionType: OrderStatusRuleConditionType;
39
+ /** Read for `product`. */
40
+ productVariantIds?: string[];
41
+ /** Read for `coupon`, compared without case. */
42
+ couponCodes?: string[];
43
+ /** Read for `collection`. */
44
+ collectionIds?: string[];
45
+ /** Read for `facet_value`. */
46
+ facetValueIds?: string[];
47
+ enabled: boolean;
48
+ }
49
+ /** Where the minimum purchase age the engine applies comes from (`settings.age_verification`). */
50
+ export interface MinimumAgeSource {
51
+ /** `channel`: the store's own `minimumAge`; `organization`: its organization's. */
52
+ source: SettingsSourceKind | (string & {});
53
+ /**
54
+ * The organization locked the group: {@link OrderSettingsModule.set} refuses a changed
55
+ * `minimumAge` with `MANAGED_BY_ORGANIZATION`, SuperAdmins included.
56
+ */
57
+ locked: boolean;
58
+ /** The organization shares the group without locking it. */
59
+ inheritable: boolean;
60
+ /** The store keeps its own value although the organization shares the group. */
61
+ overridden: boolean;
62
+ /** The age the engine applies to this store's checkout; null when none. */
63
+ effective: number | null;
64
+ }
65
+ /**
66
+ * The ACTIVE store's order settings, as its channel stores them. Every amount is in minor units
67
+ * (hundredths, for every currency: ¥5,000 is 500000, as the platform stores all money) of
68
+ * {@link OrderSettings.currencyCode}, the store's default currency.
69
+ */
70
+ export interface OrderSettings {
71
+ /** The store these are the settings of (its channel id). */
72
+ channelId: string;
73
+ /** The store's default currency (ISO 4217): the minimum and both thresholds are in it. */
74
+ currencyCode: string;
75
+ /**
76
+ * The least an order may cost (with tax) before it can be placed; null when there is no
77
+ * minimum. An order in another currency is held to it converted at the checkout's rate.
78
+ */
79
+ minOrderAmount: number | null;
80
+ /** Customer groups whose members are not held to the minimum. */
81
+ exemptCustomerGroupIds: string[];
82
+ /** Collections whose items do not count toward the minimum. */
83
+ exemptCollectionIds: string[];
84
+ /** Placed orders get sequential numbers (`NAMESPACE-PREFIX00001`); off: random codes. */
85
+ orderCodeEnabled: boolean;
86
+ /**
87
+ * The store's part of every sequential order number, set by the platform (from the store's
88
+ * code) and never by a caller; read-only here. Null until sequential numbers were first on.
89
+ */
90
+ orderCodeNamespace: string | null;
91
+ /** The merchant's part after the namespace, e.g. `VIN-`; null for none. */
92
+ orderCodePrefix: string | null;
93
+ /** How many zero-padded digits the number has, 4 to 8; null is the platform's 5. */
94
+ orderCodeDigits: number | null;
95
+ /**
96
+ * The store's OWN minimum purchase age, what {@link OrderSettingsModule.set} writes; null for
97
+ * none. While the store takes `settings.age_verification` from its organization the engine
98
+ * applies the organization's instead: see {@link OrderSettings.minimumAgeSource}.
99
+ */
100
+ minimumAge: number | null;
101
+ minimumAgeSource: MinimumAgeSource;
102
+ /**
103
+ * The rules the engine applies, read as the engine reads them: an entry without a string `id`,
104
+ * a known `targetState` and a known `conditionType` is left out (the engine never fires it);
105
+ * a rule without a name reads `name: ''`, its `enabled` as the engine takes it, and its lists
106
+ * as their non-empty strings.
107
+ */
108
+ orderStatusRules: OrderStatusRule[];
109
+ /** A customer's balance above this shows as a warning; null for no warning tier. */
110
+ outstandingBalanceWarningThreshold: number | null;
111
+ /** A customer's balance above this shows as critical; null for no critical tier. */
112
+ outstandingBalanceCriticalThreshold: number | null;
113
+ }
114
+ /**
115
+ * A PATCH of {@link OrderSettings}: a key left out is unchanged, `null` clears it. At least one
116
+ * key. There is no `orderCodeNamespace`: the platform sets it (ruling G125).
117
+ */
118
+ export interface UpdateOrderSettingsInput {
119
+ /** Whole minor units, 0 to {@link ORDER_SETTINGS_AMOUNT_MAX}; null for no minimum. */
120
+ minOrderAmount?: number | null;
121
+ /** The whole list (it replaces the stored one); empty for none. */
122
+ exemptCustomerGroupIds?: string[];
123
+ /** The whole list (it replaces the stored one); empty for none. */
124
+ exemptCollectionIds?: string[];
125
+ /**
126
+ * Switching it on for a store that never had sequential numbers also sets its namespace to the
127
+ * store's code in capitals, as provisioning does for a new store.
128
+ */
129
+ orderCodeEnabled?: boolean;
130
+ /** At most 20 characters; null for none. */
131
+ orderCodePrefix?: string | null;
132
+ /** A whole number from 4 to 8; null for the platform's 5. */
133
+ orderCodeDigits?: number | null;
134
+ /** A whole number of years from 1 to 99; null for no age check. */
135
+ minimumAge?: number | null;
136
+ /** The whole list, in priority order (it replaces the stored one); empty for none. */
137
+ orderStatusRules?: OrderStatusRule[];
138
+ /** Whole minor units, 0 to {@link ORDER_SETTINGS_AMOUNT_MAX}; null for no warning tier. */
139
+ outstandingBalanceWarningThreshold?: number | null;
140
+ /** Whole minor units, 0 to {@link ORDER_SETTINGS_AMOUNT_MAX}; null for no critical tier. */
141
+ outstandingBalanceCriticalThreshold?: number | null;
142
+ }
143
+ /**
144
+ * `admin.orders.settings`: the ACTIVE store's order settings (Settings → Orders): its order
145
+ * minimum and who is exempt from it, how its orders are numbered, the minimum purchase age, the
146
+ * rules that route a placed order into a state, and the outstanding-balance warning tiers. Stored
147
+ * as Channel custom fields; written through core `updateChannel` (typed per domain, ruling G80).
148
+ *
149
+ * The deposit policy (`orders.depositPolicy`) and the fulfilment payment policy
150
+ * (`fulfillments.paymentPolicy`) have doors of their own.
151
+ */
152
+ export interface OrderSettingsModule {
153
+ /**
154
+ * The settings as the engine applies them, with where the minimum age comes from. Reading
155
+ * needs an administrator of the store with any permission beyond `Authenticated`.
156
+ *
157
+ * @effect read
158
+ */
159
+ get(options?: Call): Promise<OrderSettings>;
160
+ /**
161
+ * Change the settings `patch` names, and answer them all as the engine now stores them.
162
+ *
163
+ * Changing the minimum or its exemptions changes which orders the store accepts from the next
164
+ * checkout on; orders already placed keep the rule they were placed under.
165
+ *
166
+ * **Coded refusals:**
167
+ * - `ORDER_SETTINGS_INVALID` → {@link ValidationError} (400), before any request: an empty
168
+ * patch; a key that is not an order setting (`orderCodeNamespace` included: the platform
169
+ * sets it); an amount that is not a whole number of minor units from 0 to
170
+ * {@link ORDER_SETTINGS_AMOUNT_MAX} (the column is a 32-bit `Int`); digits outside
171
+ * 4–8; a prefix longer than 20 characters; an age outside 1–99; a list that is not an array.
172
+ * One `details[]` entry per failing key, `field` naming it.
173
+ * - `CHANNEL_SETTINGS_INVALID` → {@link ValidationError} (400), from the engine: an exemption
174
+ * list that is not distinct non-empty ids (at most 255 characters encoded, about six ids),
175
+ * a malformed status rule, or a critical threshold not above the warning threshold
176
+ * (`code: 'MUST_EXCEED_WARNING'`). `details[].field` is the input path, such as
177
+ * `customFields.outstandingBalanceCriticalThreshold`; `details[].message` is the engine's
178
+ * sentence, with the amounts in the store's currency.
179
+ * - `MANAGED_BY_ORGANIZATION` → `BusinessRuleError` (422): a changed `minimumAge` while the
180
+ * organization locks `settings.age_verification`.
181
+ * - `ORGANIZATION_SETTINGS_INHERITED` → `BusinessRuleError` (422): a changed `minimumAge`
182
+ * while the store inherits the group; `tenant.settingsSources.override` it first. Sending
183
+ * the stored value back unchanged is accepted and changes nothing.
184
+ * - `FORBIDDEN` → `PermissionDeniedError` (403): the credential lacks `UpdateChannel`.
185
+ *
186
+ * @effect write
187
+ * @permission UpdateChannel
188
+ */
189
+ set(patch: UpdateOrderSettingsInput, options?: Call): Promise<OrderSettings>;
190
+ }
191
+ export declare const ORDER_SETTINGS_QUERY = "\n query OrderSettings {\n activeChannel { \n id\n code\n defaultCurrencyCode\n customFields {\n minOrderAmount\n exemptCustomerGroupIds\n exemptCollectionIds\n orderCodeNamespace\n orderCodePrefix\n orderCodeDigits\n orderCodeEnabled\n minimumAge\n orderStatusRules\n outstandingBalanceWarningThreshold\n outstandingBalanceCriticalThreshold\n }\n }\n channelSettingsSources { group source locked overridden inheritable values }\n }\n";
192
+ export declare const UPDATE_ORDER_SETTINGS_MUTATION = "\n mutation UpdateOrderSettings($input: UpdateChannelInput!) {\n updateChannel(input: $input) {\n ... on Channel { \n id\n code\n defaultCurrencyCode\n customFields {\n minOrderAmount\n exemptCustomerGroupIds\n exemptCollectionIds\n orderCodeNamespace\n orderCodePrefix\n orderCodeDigits\n orderCodeEnabled\n minimumAge\n orderStatusRules\n outstandingBalanceWarningThreshold\n outstandingBalanceCriticalThreshold\n }\n }\n ... on ErrorResult { errorCode message }\n }\n }\n";
193
+ /**
194
+ * The column as the engine's `parseRules` keeps it: an entry with a string `id`, a known
195
+ * `targetState` and a known `conditionType`. A rule the engine keeps is never dropped here (a
196
+ * stricter reader would erase it on the next save, turning off the transition it performs), so
197
+ * a missing `name` reads `''` and `enabled` reads as the engine takes it (truthy fires). Only the
198
+ * rule's own keys come back, so the list can be sent back as the engine's schema wants it.
199
+ */
200
+ export declare function readOrderStatusRules(raw: unknown): OrderStatusRule[];
201
+ export declare function createOrderSettingsModule(transport: Transport): OrderSettingsModule;