@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
@@ -1,3 +1,18 @@
1
+ /**
2
+ * `admin.returns`: the returns (RMA) plugin. The reads (one return, an order's
3
+ * returns, the list, the open count, what of an order can be returned) and the
4
+ * plan for settling one (headless W9-47); every non-money step of a return's life
5
+ * (create, approve, reject, cancel, record a receipt, add a note), the store's
6
+ * return policy and the RMA numbering (headless W10-27). Settling moves money and
7
+ * is its own keyed call (`settle`, headless W10-28). Money is in MINOR UNITS
8
+ * throughout, as everywhere in this SDK.
9
+ *
10
+ * Every value set below is the engine's own and grows over time, so each field
11
+ * that carries one also accepts a string this version does not name: treat an
12
+ * unknown value as "not available".
13
+ */
14
+ import { NotFoundError, ValidationError } from '@sixtyninecommerce/core';
15
+ import { statedCustomerAgreed } from '../payments/customer-consent.js';
1
16
  /** A return's state: the latest row of its status log. */
2
17
  export const RETURN_STATES = [
3
18
  'requested',
@@ -13,9 +28,24 @@ export const RETURN_STATES = [
13
28
  * How a return is settled. `refund` gives money back to an original payment.
14
29
  * `store_credit` issues a credit note: on a store with an accounts-receivable
15
30
  * ledger it credits the customer's account, elsewhere it credits the order's
16
- * invoice and moves no money.
31
+ * invoice and moves no money. `account` puts the order's settled money on the
32
+ * customer's account as unapplied cash and makes no refund (an engine released
33
+ * before 2026-10-10 never answers it).
34
+ */
35
+ export const RETURN_SETTLEMENT_METHODS = ['refund', 'store_credit', 'account'];
36
+ /**
37
+ * A step of a return's life, as `allowedActions` names it. `CLOSE_CREDITED` is
38
+ * {@link ReturnsModule.closeAlreadyCredited}: closing a return invoice corrections already
39
+ * credited in full, moving no money.
17
40
  */
18
- export const RETURN_SETTLEMENT_METHODS = ['refund', 'store_credit'];
41
+ export const RETURN_ACTIONS = [
42
+ 'APPROVE',
43
+ 'REJECT',
44
+ 'RECORD_RECEIPT',
45
+ 'CANCEL',
46
+ 'SETTLE',
47
+ 'CLOSE_CREDITED',
48
+ ];
19
49
  /** Why a return cannot be settled now, in the order the engine checks them. */
20
50
  export const RETURN_SETTLEMENT_BLOCKERS = [
21
51
  'OUTCOME_UNKNOWN',
@@ -70,10 +100,31 @@ const RETURN_FIELDS = /* GraphQL */ `
70
100
  updatedAt
71
101
  }
72
102
  `;
73
- export const RETURN_QUERY = /* GraphQL */ `
74
- query SdkOrderReturn($id: ID!) {
75
- orderReturn(id: $id) {
76
- ${RETURN_FIELDS}
103
+ /** The fields of a `ReturnCoveringCreditNote` (a selection, spliced into several documents). */
104
+ const COVERING_CREDIT_NOTE_FIELDS = /* GraphQL */ `
105
+ creditNoteId
106
+ creditNoteNumber
107
+ ledger
108
+ `;
109
+ /** What `get` and `list` add to a return's fields (engines from 2026-10-11). */
110
+ const READ_FIELDS = /* GraphQL */ `
111
+ refundEstimate
112
+ customer {
113
+ id
114
+ firstName
115
+ lastName
116
+ emailAddress
117
+ addresses {
118
+ company
119
+ defaultBillingAddress
120
+ defaultShippingAddress
121
+ }
122
+ }
123
+ lines {
124
+ refundEstimate
125
+ }
126
+ `;
127
+ const HISTORY_FIELDS = /* GraphQL */ `
77
128
  history {
78
129
  state
79
130
  actor
@@ -81,6 +132,176 @@ export const RETURN_QUERY = /* GraphQL */ `
81
132
  reason
82
133
  createdAt
83
134
  }
135
+ `;
136
+ export const RETURN_QUERY = /* GraphQL */ `
137
+ query SdkOrderReturn($id: ID!) {
138
+ orderReturn(id: $id) {
139
+ ${RETURN_FIELDS}
140
+ alreadyCreditedBy {
141
+ ${COVERING_CREDIT_NOTE_FIELDS}
142
+ }
143
+ ${HISTORY_FIELDS}
144
+ ${READ_FIELDS}
145
+ allowedActions {
146
+ action
147
+ allowed
148
+ reasonCode
149
+ }
150
+ }
151
+ }
152
+ `;
153
+ /**
154
+ * {@link RETURN_QUERY} for an engine with `alreadyCreditedBy` (ruling U15) but released before
155
+ * `allowedActions`, `refundEstimate` and `customer` (2026-10-11).
156
+ */
157
+ export const RETURN_QUERY_BEFORE_ACTIONS = /* GraphQL */ `
158
+ query SdkOrderReturnBeforeActions($id: ID!) {
159
+ orderReturn(id: $id) {
160
+ ${RETURN_FIELDS}
161
+ alreadyCreditedBy {
162
+ ${COVERING_CREDIT_NOTE_FIELDS}
163
+ }
164
+ ${HISTORY_FIELDS}
165
+ }
166
+ }
167
+ `;
168
+ /** {@link RETURN_QUERY} for an engine released before `alreadyCreditedBy` (ruling U15). */
169
+ export const RETURN_QUERY_LEGACY = /* GraphQL */ `
170
+ query SdkOrderReturnLegacy($id: ID!) {
171
+ orderReturn(id: $id) {
172
+ ${RETURN_FIELDS}
173
+ ${HISTORY_FIELDS}
174
+ }
175
+ }
176
+ `;
177
+ export const RETURNS_LIST_QUERY = /* GraphQL */ `
178
+ query SdkOrderReturns($options: OrderReturnListOptions) {
179
+ orderReturns(options: $options) {
180
+ items {
181
+ ${RETURN_FIELDS}
182
+ alreadyCreditedBy {
183
+ ${COVERING_CREDIT_NOTE_FIELDS}
184
+ }
185
+ ${READ_FIELDS}
186
+ }
187
+ totalItems
188
+ }
189
+ }
190
+ `;
191
+ /** {@link RETURNS_LIST_QUERY} for an engine with `alreadyCreditedBy` but released before 2026-10-11. */
192
+ export const RETURNS_LIST_QUERY_BEFORE_ACTIONS = /* GraphQL */ `
193
+ query SdkOrderReturnsBeforeActions($options: OrderReturnListOptions) {
194
+ orderReturns(options: $options) {
195
+ items {
196
+ ${RETURN_FIELDS}
197
+ alreadyCreditedBy {
198
+ ${COVERING_CREDIT_NOTE_FIELDS}
199
+ }
200
+ }
201
+ totalItems
202
+ }
203
+ }
204
+ `;
205
+ /** {@link RETURNS_LIST_QUERY} for an engine released before `alreadyCreditedBy`. */
206
+ export const RETURNS_LIST_QUERY_LEGACY = /* GraphQL */ `
207
+ query SdkOrderReturnsLegacy($options: OrderReturnListOptions) {
208
+ orderReturns(options: $options) {
209
+ items {
210
+ ${RETURN_FIELDS}
211
+ }
212
+ totalItems
213
+ }
214
+ }
215
+ `;
216
+ export const OPEN_RETURNS_COUNT_QUERY = /* GraphQL */ `
217
+ query SdkOpenReturnsCount {
218
+ orderReturns(options: { take: 1, state: requested }) {
219
+ totalItems
220
+ }
221
+ }
222
+ `;
223
+ export const CREATE_RETURN_MUTATION = /* GraphQL */ `
224
+ mutation SdkCreateReturn($input: CreateReturnInput!) {
225
+ createReturn(input: $input) {
226
+ ${RETURN_FIELDS}
227
+ }
228
+ }
229
+ `;
230
+ export const APPROVE_RETURN_MUTATION = /* GraphQL */ `
231
+ mutation SdkApproveReturn($input: ApproveReturnInput!) {
232
+ approveReturn(input: $input) {
233
+ ${RETURN_FIELDS}
234
+ }
235
+ }
236
+ `;
237
+ export const REJECT_RETURN_MUTATION = /* GraphQL */ `
238
+ mutation SdkRejectReturn($id: ID!, $reason: String!) {
239
+ rejectReturn(id: $id, reason: $reason) {
240
+ ${RETURN_FIELDS}
241
+ }
242
+ }
243
+ `;
244
+ export const CANCEL_RETURN_MUTATION = /* GraphQL */ `
245
+ mutation SdkCancelReturn($id: ID!, $reason: String) {
246
+ cancelReturn(id: $id, reason: $reason) {
247
+ ${RETURN_FIELDS}
248
+ }
249
+ }
250
+ `;
251
+ export const RECORD_RETURN_RECEIPT_MUTATION = /* GraphQL */ `
252
+ mutation SdkRecordReturnReceipt($input: RecordReturnReceiptInput!) {
253
+ recordReturnReceipt(input: $input) {
254
+ ${RETURN_FIELDS}
255
+ }
256
+ }
257
+ `;
258
+ export const SETTLE_RETURN_MUTATION = /* GraphQL */ `
259
+ mutation SdkSettleReturn($input: SettleReturnInput!, $idempotencyKey: String) {
260
+ settleReturn(input: $input, idempotencyKey: $idempotencyKey) {
261
+ ${RETURN_FIELDS}
262
+ ${HISTORY_FIELDS}
263
+ }
264
+ }
265
+ `;
266
+ export const ADD_RETURN_NOTE_MUTATION = /* GraphQL */ `
267
+ mutation SdkAddReturnNote($id: ID!, $note: String!) {
268
+ addReturnNote(id: $id, note: $note) {
269
+ ${RETURN_FIELDS}
270
+ }
271
+ }
272
+ `;
273
+ const NUMBERING_FIELDS = /* GraphQL */ `
274
+ prefix
275
+ suffix
276
+ digits
277
+ yearFormat
278
+ yearReset
279
+ `;
280
+ export const RETURN_NUMBERING_QUERY = /* GraphQL */ `
281
+ query SdkReturnNumberingConfig {
282
+ returnNumberingConfig {
283
+ ${NUMBERING_FIELDS}
284
+ }
285
+ }
286
+ `;
287
+ export const UPDATE_RETURN_NUMBERING_MUTATION = /* GraphQL */ `
288
+ mutation SdkUpdateReturnNumberingConfig($input: UpdateReturnNumberingConfigInput!) {
289
+ updateReturnNumberingConfig(input: $input) {
290
+ ${NUMBERING_FIELDS}
291
+ }
292
+ }
293
+ `;
294
+ export const RETURNS_SETTINGS_QUERY = /* GraphQL */ `
295
+ query SdkReturnsSettings {
296
+ activeChannel {
297
+ id
298
+ customFields {
299
+ returnsEnabled
300
+ returnWindowDays
301
+ returnsAutoApprove
302
+ returnsRequireReceiptBeforeSettle
303
+ returnsDefaultRestockLocationId
304
+ }
84
305
  }
85
306
  }
86
307
  `;
@@ -88,11 +309,70 @@ export const RETURNS_FOR_ORDER_QUERY = /* GraphQL */ `
88
309
  query SdkReturnsForOrder($orderId: ID!) {
89
310
  returnsForOrder(orderId: $orderId) {
90
311
  ${RETURN_FIELDS}
312
+ alreadyCreditedBy {
313
+ ${COVERING_CREDIT_NOTE_FIELDS}
314
+ }
315
+ }
316
+ }
317
+ `;
318
+ /** {@link RETURNS_FOR_ORDER_QUERY} for an engine released before `alreadyCreditedBy`. */
319
+ export const RETURNS_FOR_ORDER_QUERY_LEGACY = /* GraphQL */ `
320
+ query SdkReturnsForOrderLegacy($orderId: ID!) {
321
+ returnsForOrder(orderId: $orderId) {
322
+ ${RETURN_FIELDS}
323
+ }
324
+ }
325
+ `;
326
+ export const CLOSE_RETURN_ALREADY_CREDITED_MUTATION = /* GraphQL */ `
327
+ mutation SdkCloseReturnAlreadyCredited($input: CloseReturnAlreadyCreditedInput!) {
328
+ closeReturnAlreadyCredited(input: $input) {
329
+ ${RETURN_FIELDS}
330
+ alreadyCreditedBy {
331
+ ${COVERING_CREDIT_NOTE_FIELDS}
332
+ }
333
+ ${HISTORY_FIELDS}
91
334
  }
92
335
  }
93
336
  `;
337
+ /** The fields of a `ReturnLineCorrectionCredit` (a selection, spliced into two documents). */
338
+ const CORRECTION_CREDIT_FIELDS = /* GraphQL */ `
339
+ orderLineId
340
+ creditNoteId
341
+ creditNoteNumber
342
+ ledger
343
+ quantity
344
+ amount
345
+ `;
94
346
  export const RETURN_ELIGIBILITY_QUERY = /* GraphQL */ `
95
347
  query SdkReturnEligibility($orderId: ID!) {
348
+ returnEligibilityForOrder(orderId: $orderId) {
349
+ orderId
350
+ eligible
351
+ reason
352
+ returnWindowEndsAt
353
+ lines {
354
+ orderLineId
355
+ productVariantId
356
+ productVariantName
357
+ productVariantSku
358
+ fulfilledQty
359
+ returnableQty
360
+ creditedQty
361
+ correctionCredits {
362
+ ${CORRECTION_CREDIT_FIELDS}
363
+ }
364
+ unitPriceWithTax
365
+ unitPriceWithTaxUnrounded
366
+ }
367
+ }
368
+ }
369
+ `;
370
+ /**
371
+ * {@link RETURN_ELIGIBILITY_QUERY} for an engine released before 2026-10-09, which has no
372
+ * `creditedQty`/`correctionCredits`: GraphQL refuses a whole document over one unknown field.
373
+ */
374
+ export const RETURN_ELIGIBILITY_QUERY_LEGACY = /* GraphQL */ `
375
+ query SdkReturnEligibilityLegacy($orderId: ID!) {
96
376
  returnEligibilityForOrder(orderId: $orderId) {
97
377
  orderId
98
378
  eligible
@@ -133,28 +413,493 @@ export const RETURN_SETTLEMENT_OPTIONS_QUERY = /* GraphQL */ `
133
413
  reasonCode
134
414
  invoiceNumber
135
415
  }
416
+ account {
417
+ available
418
+ reasonCode
419
+ message
420
+ held
421
+ book
422
+ }
423
+ initialMethod
424
+ defaultAmount
425
+ amountCeiling
426
+ correctionCredits {
427
+ ${CORRECTION_CREDIT_FIELDS}
428
+ }
429
+ shippingCeiling
430
+ alreadyCredited {
431
+ available
432
+ reasonCode
433
+ creditNotes {
434
+ ${COVERING_CREDIT_NOTE_FIELDS}
435
+ }
436
+ }
437
+ creditNoteTaxRate {
438
+ suggested
439
+ basis
440
+ rates
441
+ methods
442
+ invoiceTotal
443
+ }
444
+ }
445
+ }
446
+ `;
447
+ /**
448
+ * {@link RETURN_SETTLEMENT_OPTIONS_QUERY} for an engine with the account's book but released before
449
+ * the credit note's VAT rate (USER PD11, B6b).
450
+ */
451
+ export const RETURN_SETTLEMENT_OPTIONS_QUERY_BEFORE_TAX_RATE = /* GraphQL */ `
452
+ query SdkReturnSettlementOptionsBeforeTaxRate($returnId: ID!) {
453
+ returnSettlementOptions(returnId: $returnId) {
454
+ returnId
455
+ currencyCode
456
+ settleable
457
+ blockedBy
458
+ refund {
459
+ available
460
+ reasonCode
461
+ payments {
462
+ paymentId
463
+ method
464
+ refundable
465
+ }
466
+ }
467
+ creditNote {
468
+ available
469
+ ledger
470
+ reasonCode
471
+ invoiceNumber
472
+ }
473
+ account {
474
+ available
475
+ reasonCode
476
+ message
477
+ held
478
+ book
479
+ }
480
+ initialMethod
481
+ defaultAmount
482
+ amountCeiling
483
+ correctionCredits {
484
+ ${CORRECTION_CREDIT_FIELDS}
485
+ }
486
+ shippingCeiling
487
+ alreadyCredited {
488
+ available
489
+ reasonCode
490
+ creditNotes {
491
+ ${COVERING_CREDIT_NOTE_FIELDS}
492
+ }
493
+ }
494
+ }
495
+ }
496
+ `;
497
+ /**
498
+ * {@link RETURN_SETTLEMENT_OPTIONS_QUERY} for an engine with `alreadyCredited` but released before
499
+ * the account option named the store's book (incentives sprint 8 PR 4).
500
+ */
501
+ export const RETURN_SETTLEMENT_OPTIONS_QUERY_BEFORE_BOOK = /* GraphQL */ `
502
+ query SdkReturnSettlementOptionsBeforeBook($returnId: ID!) {
503
+ returnSettlementOptions(returnId: $returnId) {
504
+ returnId
505
+ currencyCode
506
+ settleable
507
+ blockedBy
508
+ refund {
509
+ available
510
+ reasonCode
511
+ payments {
512
+ paymentId
513
+ method
514
+ refundable
515
+ }
516
+ }
517
+ creditNote {
518
+ available
519
+ ledger
520
+ reasonCode
521
+ invoiceNumber
522
+ }
523
+ account {
524
+ available
525
+ reasonCode
526
+ message
527
+ held
528
+ }
136
529
  initialMethod
137
530
  defaultAmount
531
+ amountCeiling
532
+ correctionCredits {
533
+ ${CORRECTION_CREDIT_FIELDS}
534
+ }
535
+ shippingCeiling
536
+ alreadyCredited {
537
+ available
538
+ reasonCode
539
+ creditNotes {
540
+ ${COVERING_CREDIT_NOTE_FIELDS}
541
+ }
542
+ }
138
543
  }
139
544
  }
140
545
  `;
546
+ /**
547
+ * {@link RETURN_SETTLEMENT_OPTIONS_QUERY} for an engine with the account settlement (2026-10-10)
548
+ * but released before `alreadyCredited` (ruling U15).
549
+ */
550
+ export const RETURN_SETTLEMENT_OPTIONS_QUERY_BEFORE_CLOSE = /* GraphQL */ `
551
+ query SdkReturnSettlementOptionsBeforeClose($returnId: ID!) {
552
+ returnSettlementOptions(returnId: $returnId) {
553
+ returnId
554
+ currencyCode
555
+ settleable
556
+ blockedBy
557
+ refund {
558
+ available
559
+ reasonCode
560
+ payments {
561
+ paymentId
562
+ method
563
+ refundable
564
+ }
565
+ }
566
+ creditNote {
567
+ available
568
+ ledger
569
+ reasonCode
570
+ invoiceNumber
571
+ }
572
+ account {
573
+ available
574
+ reasonCode
575
+ message
576
+ held
577
+ }
578
+ initialMethod
579
+ defaultAmount
580
+ amountCeiling
581
+ correctionCredits {
582
+ ${CORRECTION_CREDIT_FIELDS}
583
+ }
584
+ shippingCeiling
585
+ }
586
+ }
587
+ `;
588
+ /**
589
+ * {@link RETURN_SETTLEMENT_OPTIONS_QUERY} for an engine with `shippingCeiling` but released before
590
+ * the account settlement (2026-10-10).
591
+ */
592
+ export const RETURN_SETTLEMENT_OPTIONS_QUERY_BEFORE_ACCOUNT = /* GraphQL */ `
593
+ query SdkReturnSettlementOptionsBeforeAccount($returnId: ID!) {
594
+ returnSettlementOptions(returnId: $returnId) {
595
+ returnId
596
+ currencyCode
597
+ settleable
598
+ blockedBy
599
+ refund {
600
+ available
601
+ reasonCode
602
+ payments {
603
+ paymentId
604
+ method
605
+ refundable
606
+ }
607
+ }
608
+ creditNote {
609
+ available
610
+ ledger
611
+ reasonCode
612
+ invoiceNumber
613
+ }
614
+ initialMethod
615
+ defaultAmount
616
+ amountCeiling
617
+ correctionCredits {
618
+ ${CORRECTION_CREDIT_FIELDS}
619
+ }
620
+ shippingCeiling
621
+ }
622
+ }
623
+ `;
624
+ /**
625
+ * {@link RETURN_SETTLEMENT_OPTIONS_QUERY} for an engine with the correction credits (2026-10-09)
626
+ * but released before `shippingCeiling`.
627
+ */
628
+ export const RETURN_SETTLEMENT_OPTIONS_QUERY_BEFORE_SHIPPING = /* GraphQL */ `
629
+ query SdkReturnSettlementOptionsBeforeShipping($returnId: ID!) {
630
+ returnSettlementOptions(returnId: $returnId) {
631
+ returnId
632
+ currencyCode
633
+ settleable
634
+ blockedBy
635
+ refund {
636
+ available
637
+ reasonCode
638
+ payments {
639
+ paymentId
640
+ method
641
+ refundable
642
+ }
643
+ }
644
+ creditNote {
645
+ available
646
+ ledger
647
+ reasonCode
648
+ invoiceNumber
649
+ }
650
+ initialMethod
651
+ defaultAmount
652
+ amountCeiling
653
+ correctionCredits {
654
+ ${CORRECTION_CREDIT_FIELDS}
655
+ }
656
+ }
657
+ }
658
+ `;
659
+ /**
660
+ * {@link RETURN_SETTLEMENT_OPTIONS_QUERY} for an engine with the plan (W9-47) but released before
661
+ * 2026-10-09, which has no `amountCeiling`/`correctionCredits`.
662
+ */
663
+ export const RETURN_SETTLEMENT_OPTIONS_QUERY_LEGACY = /* GraphQL */ `
664
+ query SdkReturnSettlementOptionsLegacy($returnId: ID!) {
665
+ returnSettlementOptions(returnId: $returnId) {
666
+ returnId
667
+ currencyCode
668
+ settleable
669
+ blockedBy
670
+ refund {
671
+ available
672
+ reasonCode
673
+ payments {
674
+ paymentId
675
+ method
676
+ refundable
677
+ }
678
+ }
679
+ creditNote {
680
+ available
681
+ ledger
682
+ reasonCode
683
+ invoiceNumber
684
+ }
685
+ initialMethod
686
+ defaultAmount
687
+ }
688
+ }
689
+ `;
690
+ /**
691
+ * Whether a failure is "this engine does not know that field yet": the document refused before
692
+ * it ran, never an execution-time refusal or a transient failure (degrading on those would hide
693
+ * an outage behind silently missing fields). graphql-js answers a validation failure with HTTP
694
+ * 400, which reaches the SDK as `BAD_REQUEST`, or coded `GRAPHQL_VALIDATION_FAILED` (the storefront
695
+ * SDK's `isUnknownFieldRejection` reads the same two).
696
+ */
697
+ function isUnknownFieldRejection(error) {
698
+ if (!(error instanceof ValidationError) || error.service !== 'vendure')
699
+ return false;
700
+ return (error.code === 'BAD_REQUEST' ||
701
+ error.code === 'GRAPHQL_VALIDATION_FAILED' ||
702
+ /Cannot query field/i.test(error.message));
703
+ }
704
+ /** The plan's documents, newest first: each drops the newest field the one before it asks. */
705
+ const SETTLEMENT_OPTIONS_DOCUMENTS = [
706
+ RETURN_SETTLEMENT_OPTIONS_QUERY,
707
+ RETURN_SETTLEMENT_OPTIONS_QUERY_BEFORE_TAX_RATE,
708
+ RETURN_SETTLEMENT_OPTIONS_QUERY_BEFORE_BOOK,
709
+ RETURN_SETTLEMENT_OPTIONS_QUERY_BEFORE_CLOSE,
710
+ RETURN_SETTLEMENT_OPTIONS_QUERY_BEFORE_ACCOUNT,
711
+ RETURN_SETTLEMENT_OPTIONS_QUERY_BEFORE_SHIPPING,
712
+ RETURN_SETTLEMENT_OPTIONS_QUERY_LEGACY,
713
+ ];
141
714
  export function createReturnsModule(transport) {
715
+ /**
716
+ * Latched once the engine proved it predates the correction-credit fields, so the downgrade
717
+ * costs one refused request per client.
718
+ */
719
+ let correctionCreditsUnsupported = false;
720
+ /** Which of {@link SETTLEMENT_OPTIONS_DOCUMENTS} this engine answers (latched, never back up). */
721
+ let settlementOptionsTier = 0;
722
+ /** Latched once the engine proved it predates `alreadyCreditedBy` (one refused request per client). */
723
+ let alreadyCreditedByUnsupported = false;
724
+ /** Sends the current document, or the legacy one once the engine refused the new fields. */
725
+ async function withFallback(query, legacy, variables, options) {
726
+ if (!correctionCreditsUnsupported) {
727
+ try {
728
+ return await transport.graphql({ api: 'admin', query, variables }, options);
729
+ }
730
+ catch (error) {
731
+ if (!isUnknownFieldRejection(error))
732
+ throw error;
733
+ }
734
+ }
735
+ const data = await transport.graphql({ api: 'admin', query: legacy, variables }, options);
736
+ correctionCreditsUnsupported = true;
737
+ return data;
738
+ }
739
+ /** The return reads: with `alreadyCreditedBy`, or without it once the engine refused it. */
740
+ async function readReturns(query, legacy, variables, options) {
741
+ if (!alreadyCreditedByUnsupported) {
742
+ try {
743
+ return await transport.graphql({ api: 'admin', query, variables }, options);
744
+ }
745
+ catch (error) {
746
+ if (!isUnknownFieldRejection(error))
747
+ throw error;
748
+ }
749
+ }
750
+ const data = await transport.graphql({ api: 'admin', query: legacy, variables }, options);
751
+ alreadyCreditedByUnsupported = true;
752
+ return data;
753
+ }
754
+ /**
755
+ * Which tier of the `get`/`list` documents this engine answers (latched, never back up): 0 has
756
+ * `allowedActions`/`refundEstimate`/`customer` (2026-10-11), 1 only `alreadyCreditedBy`
757
+ * (U15), 2 neither. Tier 2 also latches `alreadyCreditedByUnsupported`, as `forOrder` reads it.
758
+ */
759
+ let returnReadTier = 0;
760
+ async function readTiered(documents, variables, options) {
761
+ if (alreadyCreditedByUnsupported)
762
+ returnReadTier = 2;
763
+ for (;;) {
764
+ const tier = returnReadTier;
765
+ try {
766
+ const data = await transport.graphql({ api: 'admin', query: documents[tier], variables }, options);
767
+ if (tier === 2)
768
+ alreadyCreditedByUnsupported = true;
769
+ return data;
770
+ }
771
+ catch (error) {
772
+ if (tier === 2 || !isUnknownFieldRejection(error))
773
+ throw error;
774
+ // A refused document names no field the SDK can read (the transport answers a generic
775
+ // 400), so each older tier is asked in turn, once per client.
776
+ returnReadTier = tier + 1;
777
+ }
778
+ }
779
+ }
780
+ /** One write that answers the return it changed. */
781
+ async function write(field, query, variables, options) {
782
+ const data = await transport.graphql({ api: 'admin', query, variables }, options);
783
+ return data[field];
784
+ }
142
785
  return {
143
786
  async get(id, options) {
144
- const data = await transport.graphql({ api: 'admin', query: RETURN_QUERY, variables: { id } }, options);
787
+ const data = await readTiered([RETURN_QUERY, RETURN_QUERY_BEFORE_ACTIONS, RETURN_QUERY_LEGACY], { id }, options);
145
788
  return data.orderReturn;
146
789
  },
790
+ async list(filter, options) {
791
+ const data = await readTiered([RETURNS_LIST_QUERY, RETURNS_LIST_QUERY_BEFORE_ACTIONS, RETURNS_LIST_QUERY_LEGACY], { options: filter ?? {} }, options);
792
+ return data.orderReturns;
793
+ },
147
794
  async forOrder(orderId, options) {
148
- const data = await transport.graphql({ api: 'admin', query: RETURNS_FOR_ORDER_QUERY, variables: { orderId } }, options);
795
+ const data = await readReturns(RETURNS_FOR_ORDER_QUERY, RETURNS_FOR_ORDER_QUERY_LEGACY, { orderId }, options);
149
796
  return data.returnsForOrder;
150
797
  },
151
798
  async eligibility(orderId, options) {
152
- const data = await transport.graphql({ api: 'admin', query: RETURN_ELIGIBILITY_QUERY, variables: { orderId } }, options);
799
+ const data = await withFallback(RETURN_ELIGIBILITY_QUERY, RETURN_ELIGIBILITY_QUERY_LEGACY, { orderId }, options);
153
800
  return data.returnEligibilityForOrder;
154
801
  },
155
802
  async settlementOptions(returnId, options) {
156
- const data = await transport.graphql({ api: 'admin', query: RETURN_SETTLEMENT_OPTIONS_QUERY, variables: { returnId } }, options);
157
- return data.returnSettlementOptions;
803
+ const last = SETTLEMENT_OPTIONS_DOCUMENTS.length - 1;
804
+ // An engine that refused the correction credits on `eligibility` predates every newer tier.
805
+ if (correctionCreditsUnsupported)
806
+ settlementOptionsTier = last;
807
+ for (;;) {
808
+ const tier = settlementOptionsTier;
809
+ try {
810
+ const data = await transport.graphql({
811
+ api: 'admin',
812
+ query: SETTLEMENT_OPTIONS_DOCUMENTS[tier],
813
+ variables: { returnId },
814
+ }, options);
815
+ if (tier === last)
816
+ correctionCreditsUnsupported = true;
817
+ return data.returnSettlementOptions;
818
+ }
819
+ catch (error) {
820
+ if (tier === last || !isUnknownFieldRejection(error))
821
+ throw error;
822
+ settlementOptionsTier = tier + 1;
823
+ }
824
+ }
825
+ },
826
+ async openCount(options) {
827
+ const data = await transport.graphql({ api: 'admin', query: OPEN_RETURNS_COUNT_QUERY }, options);
828
+ return data.orderReturns.totalItems;
829
+ },
830
+ create: (input, options) => write('createReturn', CREATE_RETURN_MUTATION, { input }, options),
831
+ approve: (id, input, options) => write('approveReturn', APPROVE_RETURN_MUTATION, { input: { id, ...input } }, options),
832
+ reject: (id, reason, options) => write('rejectReturn', REJECT_RETURN_MUTATION, { id, reason }, options),
833
+ cancel: (id, input, options) => write('cancelReturn', CANCEL_RETURN_MUTATION, { id, reason: input?.reason ?? null }, options),
834
+ recordReceipt: (id, input, options) => write('recordReturnReceipt', RECORD_RETURN_RECEIPT_MUTATION, { input: { id, lines: input.lines } }, options),
835
+ addNote: (id, note, options) => write('addReturnNote', ADD_RETURN_NOTE_MUTATION, { id, note }, options),
836
+ async settle(returnId, input, options) {
837
+ const data = await transport.graphql({
838
+ api: 'admin',
839
+ query: SETTLE_RETURN_MUTATION,
840
+ variables: {
841
+ input: {
842
+ id: returnId,
843
+ method: input.method,
844
+ ...(input.paymentId != null ? { paymentId: input.paymentId } : {}),
845
+ ...(input.amountOverride != null ? { amountOverride: input.amountOverride } : {}),
846
+ ...(input.shippingRefundAmount != null
847
+ ? { shippingRefundAmount: input.shippingRefundAmount }
848
+ : {}),
849
+ ...(input.reason != null ? { reason: input.reason } : {}),
850
+ ...statedCustomerAgreed(input.customerAgreed),
851
+ ...(input.taxRate != null ? { taxRate: input.taxRate } : {}),
852
+ },
853
+ // A variable, not a header: the Admin API takes the key as an argument. `undefined`
854
+ // when omitted, never null: `JSON.stringify` drops it, so no key stays off the wire.
855
+ idempotencyKey: options?.idempotencyKey,
856
+ },
857
+ }, options);
858
+ return data.settleReturn;
859
+ },
860
+ numbering: {
861
+ async get(options) {
862
+ const data = await transport.graphql({ api: 'admin', query: RETURN_NUMBERING_QUERY }, options);
863
+ return data.returnNumberingConfig;
864
+ },
865
+ async set(input, options) {
866
+ const data = await transport.graphql({ api: 'admin', query: UPDATE_RETURN_NUMBERING_MUTATION, variables: { input } }, options);
867
+ return data.updateReturnNumberingConfig;
868
+ },
869
+ },
870
+ settings: {
871
+ async get(options) {
872
+ const data = await transport.graphql({ api: 'admin', query: RETURNS_SETTINGS_QUERY }, options);
873
+ const channel = data.activeChannel;
874
+ if (!channel) {
875
+ throw new NotFoundError({
876
+ code: 'CHANNEL_NOT_FOUND',
877
+ message: 'No store is active for this session, so it has no return policy to read.',
878
+ status: 404,
879
+ service: 'vendure',
880
+ });
881
+ }
882
+ const fields = channel.customFields;
883
+ return {
884
+ channelId: channel.id,
885
+ // The engine's own defaults (the plugin's field declarations) for a field it answers null.
886
+ returnsEnabled: fields?.returnsEnabled === true,
887
+ returnWindowDays: fields?.returnWindowDays ?? 30,
888
+ returnsAutoApprove: fields?.returnsAutoApprove === true,
889
+ returnsRequireReceiptBeforeSettle: fields?.returnsRequireReceiptBeforeSettle !== false,
890
+ returnsDefaultRestockLocationId: fields?.returnsDefaultRestockLocationId ?? null,
891
+ };
892
+ },
893
+ },
894
+ async closeAlreadyCredited(returnId, input, options) {
895
+ const data = await transport.graphql({
896
+ api: 'admin',
897
+ query: CLOSE_RETURN_ALREADY_CREDITED_MUTATION,
898
+ variables: {
899
+ input: { id: returnId, ...(input?.reason != null ? { reason: input.reason } : {}) },
900
+ },
901
+ }, options);
902
+ return data.closeReturnAlreadyCredited;
158
903
  },
159
904
  };
160
905
  }