@sixtyninecommerce/admin 0.9.0 → 0.11.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 (258) hide show
  1. package/README.md +4598 -128
  2. package/dist/catalog/assets.d.ts +120 -8
  3. package/dist/catalog/assets.js +98 -12
  4. package/dist/catalog/collections.d.ts +279 -14
  5. package/dist/catalog/collections.js +246 -15
  6. package/dist/catalog/index.d.ts +9 -2
  7. package/dist/catalog/index.js +4 -0
  8. package/dist/catalog/products.d.ts +318 -17
  9. package/dist/catalog/products.js +182 -14
  10. package/dist/catalog/properties.d.ts +102 -14
  11. package/dist/catalog/properties.js +13 -0
  12. package/dist/catalog/recommendations.d.ts +261 -0
  13. package/dist/catalog/recommendations.js +145 -0
  14. package/dist/catalog/reviews.d.ts +368 -0
  15. package/dist/catalog/reviews.js +318 -0
  16. package/dist/catalog/types.d.ts +17 -1
  17. package/dist/catalog/types.js +10 -0
  18. package/dist/catalog/variant-find.d.ts +136 -0
  19. package/dist/catalog/variant-find.js +239 -0
  20. package/dist/catalog/variants.d.ts +282 -25
  21. package/dist/catalog/variants.js +173 -25
  22. package/dist/catalog/visibility.d.ts +20 -5
  23. package/dist/catalog/visibility.js +19 -1
  24. package/dist/client.d.ts +116 -9
  25. package/dist/client.js +41 -7
  26. package/dist/content/assets.d.ts +286 -0
  27. package/dist/content/assets.js +181 -0
  28. package/dist/content/items.d.ts +269 -0
  29. package/dist/content/items.js +170 -0
  30. package/dist/content/types.d.ts +282 -0
  31. package/dist/content/types.js +100 -0
  32. package/dist/customers/age-verification.d.ts +66 -0
  33. package/dist/customers/age-verification.js +79 -0
  34. package/dist/customers/credit.d.ts +263 -0
  35. package/dist/customers/credit.js +244 -0
  36. package/dist/customers/delivery-preferences.d.ts +120 -0
  37. package/dist/customers/delivery-preferences.js +97 -0
  38. package/dist/customers/groups.d.ts +207 -0
  39. package/dist/customers/groups.js +438 -0
  40. package/dist/customers/index.d.ts +447 -37
  41. package/dist/customers/index.js +313 -40
  42. package/dist/customers/invitation-status.d.ts +57 -0
  43. package/dist/customers/invitation-status.js +21 -0
  44. package/dist/customers/notes.d.ts +67 -0
  45. package/dist/customers/notes.js +51 -0
  46. package/dist/customers/notification-recipients.d.ts +97 -0
  47. package/dist/customers/notification-recipients.js +84 -0
  48. package/dist/customers/saved-lists.d.ts +42 -0
  49. package/dist/customers/saved-lists.js +61 -0
  50. package/dist/customers/vat.d.ts +83 -0
  51. package/dist/customers/vat.js +46 -0
  52. package/dist/customers/wire.d.ts +20 -0
  53. package/dist/customers/wire.js +35 -0
  54. package/dist/documents/ar.d.ts +307 -0
  55. package/dist/documents/ar.js +254 -0
  56. package/dist/documents/index.d.ts +731 -21
  57. package/dist/documents/index.js +436 -24
  58. package/dist/documents/pdf.d.ts +2 -0
  59. package/dist/documents/pdf.js +11 -0
  60. package/dist/fulfillments/create.d.ts +167 -0
  61. package/dist/fulfillments/create.js +216 -0
  62. package/dist/fulfillments/index.d.ts +121 -10
  63. package/dist/fulfillments/index.js +120 -2
  64. package/dist/fulfillments/payment-policy.d.ts +64 -0
  65. package/dist/fulfillments/payment-policy.js +140 -0
  66. package/dist/fulfillments/warehouse.d.ts +724 -0
  67. package/dist/fulfillments/warehouse.js +914 -0
  68. package/dist/geo/index.d.ts +119 -0
  69. package/dist/geo/index.js +107 -0
  70. package/dist/index.d.ts +129 -30
  71. package/dist/index.js +47 -9
  72. package/dist/integrations/afas-actions.d.ts +234 -0
  73. package/dist/integrations/afas-actions.js +310 -0
  74. package/dist/integrations/afas-types.d.ts +483 -0
  75. package/dist/integrations/afas-types.js +5 -0
  76. package/dist/integrations/afas.d.ts +234 -0
  77. package/dist/integrations/afas.js +290 -0
  78. package/dist/integrations/connections.d.ts +103 -0
  79. package/dist/integrations/connections.js +55 -0
  80. package/dist/integrations/esp.d.ts +313 -0
  81. package/dist/integrations/esp.js +169 -0
  82. package/dist/integrations/exact-online-types.d.ts +423 -0
  83. package/dist/integrations/exact-online-types.js +6 -0
  84. package/dist/integrations/exact-online.d.ts +248 -0
  85. package/dist/integrations/exact-online.js +376 -0
  86. package/dist/integrations/index.d.ts +40 -0
  87. package/dist/integrations/index.js +24 -0
  88. package/dist/integrations/pipeline-keys.d.ts +13 -0
  89. package/dist/integrations/pipeline-keys.js +22 -0
  90. package/dist/integrations/pipelines.d.ts +114 -0
  91. package/dist/integrations/pipelines.js +46 -0
  92. package/dist/integrations/types.d.ts +322 -0
  93. package/dist/integrations/types.js +8 -0
  94. package/dist/jobs/bulk-action-run.d.ts +11 -2
  95. package/dist/jobs/bulk-action-run.js +4 -5
  96. package/dist/locations/index.d.ts +66 -0
  97. package/dist/locations/index.js +31 -0
  98. package/dist/meta/index.d.ts +162 -0
  99. package/dist/orders/bulk.d.ts +75 -0
  100. package/dist/orders/bulk.js +150 -0
  101. package/dist/orders/cancel-with-money.d.ts +227 -0
  102. package/dist/orders/cancel-with-money.js +153 -0
  103. package/dist/orders/commit-edit.d.ts +7 -1
  104. package/dist/orders/commit-edit.js +5 -1
  105. package/dist/orders/deposit-policy.d.ts +103 -0
  106. package/dist/orders/deposit-policy.js +202 -0
  107. package/dist/orders/drafts.d.ts +800 -0
  108. package/dist/orders/drafts.js +771 -0
  109. package/dist/orders/fields.d.ts +245 -0
  110. package/dist/orders/fields.js +188 -0
  111. package/dist/orders/get.d.ts +29 -19
  112. package/dist/orders/get.js +17 -8
  113. package/dist/orders/index.d.ts +125 -5
  114. package/dist/orders/index.js +35 -2
  115. package/dist/orders/lifecycle.d.ts +128 -0
  116. package/dist/orders/lifecycle.js +158 -0
  117. package/dist/orders/line-price-preview.d.ts +7 -2
  118. package/dist/orders/list.d.ts +222 -0
  119. package/dist/orders/list.js +377 -0
  120. package/dist/orders/manual-discounts.d.ts +11 -2
  121. package/dist/orders/manual-discounts.js +2 -0
  122. package/dist/orders/manual-pricing.d.ts +5 -0
  123. package/dist/orders/order-entry.d.ts +20 -7
  124. package/dist/orders/plan-edit.d.ts +1 -1
  125. package/dist/orders/plan-edit.js +4 -1
  126. package/dist/orders/settings.d.ts +201 -0
  127. package/dist/orders/settings.js +325 -0
  128. package/dist/orders/status.d.ts +159 -13
  129. package/dist/orders/status.js +21 -0
  130. package/dist/orders/surcharges.d.ts +8 -1
  131. package/dist/orders/surcharges.js +3 -2
  132. package/dist/payments/account-credit.d.ts +30 -0
  133. package/dist/payments/account-credit.js +19 -0
  134. package/dist/payments/ar.d.ts +292 -0
  135. package/dist/payments/ar.js +223 -0
  136. package/dist/payments/connected-account.d.ts +47 -0
  137. package/dist/payments/connected-account.js +61 -0
  138. package/dist/payments/credit-noted-fields.d.ts +12 -0
  139. package/dist/payments/credit-noted-fields.js +37 -0
  140. package/dist/payments/index.d.ts +263 -10
  141. package/dist/payments/index.js +133 -1
  142. package/dist/payments/methods.d.ts +332 -0
  143. package/dist/payments/methods.js +363 -0
  144. package/dist/payments/mollie-methods.d.ts +159 -0
  145. package/dist/payments/mollie-methods.js +141 -0
  146. package/dist/payments/payment-links.d.ts +180 -0
  147. package/dist/payments/payment-links.js +97 -0
  148. package/dist/payments/provider-keys.d.ts +150 -0
  149. package/dist/payments/provider-keys.js +118 -0
  150. package/dist/payments/providers.d.ts +86 -11
  151. package/dist/payments/providers.js +29 -0
  152. package/dist/payments/requests.d.ts +144 -0
  153. package/dist/payments/requests.js +92 -0
  154. package/dist/payments/store-credit-fields.d.ts +15 -0
  155. package/dist/payments/store-credit-fields.js +51 -0
  156. package/dist/pickups/index.d.ts +104 -0
  157. package/dist/pickups/index.js +105 -0
  158. package/dist/platform/channels.d.ts +132 -0
  159. package/dist/platform/channels.js +128 -0
  160. package/dist/platform/geo.d.ts +123 -0
  161. package/dist/platform/geo.js +144 -0
  162. package/dist/platform/tax.d.ts +154 -0
  163. package/dist/platform/tax.js +139 -0
  164. package/dist/pos/anomalies.d.ts +158 -0
  165. package/dist/pos/anomalies.js +64 -0
  166. package/dist/pos/assisted-selling.d.ts +79 -0
  167. package/dist/pos/assisted-selling.js +38 -0
  168. package/dist/pos/exchanges.d.ts +103 -0
  169. package/dist/pos/exchanges.js +22 -0
  170. package/dist/pos/gift-cards.d.ts +135 -0
  171. package/dist/pos/gift-cards.js +47 -0
  172. package/dist/pos/index.d.ts +2125 -32
  173. package/dist/pos/index.js +742 -4
  174. package/dist/pos/no-receipt.d.ts +94 -0
  175. package/dist/pos/no-receipt.js +25 -0
  176. package/dist/pos/offline-sales.d.ts +187 -0
  177. package/dist/pos/offline-sales.js +116 -0
  178. package/dist/pos/pay-by-link.d.ts +143 -0
  179. package/dist/pos/pay-by-link.js +57 -0
  180. package/dist/pos/quick-keys.d.ts +103 -0
  181. package/dist/pos/quick-keys.js +45 -0
  182. package/dist/pos/reports.d.ts +360 -0
  183. package/dist/pos/reports.js +62 -0
  184. package/dist/pos/returns.d.ts +217 -0
  185. package/dist/pos/returns.js +53 -0
  186. package/dist/pricing/bulk-coupons.d.ts +139 -0
  187. package/dist/pricing/bulk-coupons.js +112 -0
  188. package/dist/pricing/index.d.ts +177 -4
  189. package/dist/pricing/index.js +176 -1
  190. package/dist/pricing/price-lists.d.ts +604 -0
  191. package/dist/pricing/price-lists.js +600 -0
  192. package/dist/pricing/vouchers.d.ts +103 -0
  193. package/dist/pricing/vouchers.js +69 -0
  194. package/dist/purchasing/alerts.d.ts +89 -0
  195. package/dist/purchasing/alerts.js +62 -0
  196. package/dist/purchasing/cost.d.ts +110 -0
  197. package/dist/purchasing/cost.js +86 -0
  198. package/dist/purchasing/index.d.ts +36 -0
  199. package/dist/purchasing/index.js +16 -0
  200. package/dist/purchasing/purchase-orders.d.ts +548 -0
  201. package/dist/purchasing/purchase-orders.js +491 -0
  202. package/dist/purchasing/replenishment.d.ts +281 -0
  203. package/dist/purchasing/replenishment.js +240 -0
  204. package/dist/purchasing/settings.d.ts +152 -0
  205. package/dist/purchasing/settings.js +181 -0
  206. package/dist/purchasing/suppliers.d.ts +476 -0
  207. package/dist/purchasing/suppliers.js +438 -0
  208. package/dist/quotes/index.d.ts +501 -0
  209. package/dist/quotes/index.js +439 -0
  210. package/dist/reports/index.d.ts +71 -8
  211. package/dist/reports/index.js +74 -11
  212. package/dist/returns/index.d.ts +818 -0
  213. package/dist/returns/index.js +844 -0
  214. package/dist/search/index.d.ts +174 -0
  215. package/dist/search/index.js +125 -0
  216. package/dist/shipping/definitions.d.ts +29 -0
  217. package/dist/shipping/definitions.js +47 -0
  218. package/dist/shipping/fulfillment-profiles.d.ts +174 -0
  219. package/dist/shipping/fulfillment-profiles.js +104 -0
  220. package/dist/shipping/hendriks.d.ts +97 -0
  221. package/dist/shipping/hendriks.js +50 -0
  222. package/dist/shipping/index.d.ts +48 -0
  223. package/dist/shipping/index.js +25 -0
  224. package/dist/shipping/methods.d.ts +198 -0
  225. package/dist/shipping/methods.js +240 -0
  226. package/dist/shipping/myparcel.d.ts +254 -0
  227. package/dist/shipping/myparcel.js +178 -0
  228. package/dist/shipping/parcel-count-suggestion.d.ts +2 -0
  229. package/dist/shipping/parcel-rule.d.ts +6 -5
  230. package/dist/shipping/parcel-rule.js +21 -23
  231. package/dist/shipping/rate-tables.d.ts +179 -0
  232. package/dist/shipping/rate-tables.js +184 -0
  233. package/dist/stock/index.d.ts +10 -3
  234. package/dist/stock/index.js +3 -0
  235. package/dist/stock/locations.d.ts +144 -0
  236. package/dist/stock/locations.js +168 -0
  237. package/dist/stock/transfers.d.ts +216 -43
  238. package/dist/stock/transfers.js +140 -13
  239. package/dist/stored-value/index.d.ts +214 -4
  240. package/dist/stored-value/index.js +152 -0
  241. package/dist/subscriptions/index.d.ts +682 -0
  242. package/dist/subscriptions/index.js +815 -0
  243. package/dist/tax/index.d.ts +76 -1
  244. package/dist/tax/index.js +50 -0
  245. package/dist/tenant/email-style.d.ts +102 -0
  246. package/dist/tenant/email-style.js +72 -0
  247. package/dist/tenant/email-templates.d.ts +66 -0
  248. package/dist/tenant/email-templates.js +54 -0
  249. package/dist/tenant/notifications.d.ts +23 -17
  250. package/dist/tenant/settings-sources.d.ts +1 -1
  251. package/dist/tenant/time-zone.d.ts +17 -0
  252. package/dist/tenant/time-zone.js +11 -0
  253. package/dist/types.d.ts +51 -4
  254. package/dist/users/index.d.ts +3 -0
  255. package/dist/users/index.js +2 -0
  256. package/dist/users/warehouses.d.ts +50 -0
  257. package/dist/users/warehouses.js +51 -0
  258. package/package.json +2 -2
@@ -0,0 +1,844 @@
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
+ /** A return's state: the latest row of its status log. */
16
+ export const RETURN_STATES = [
17
+ 'requested',
18
+ 'approved',
19
+ 'rejected',
20
+ 'cancelled',
21
+ 'items_received',
22
+ 'settlement_pending',
23
+ 'settlement_failed',
24
+ 'settled',
25
+ ];
26
+ /**
27
+ * How a return is settled. `refund` gives money back to an original payment.
28
+ * `store_credit` issues a credit note: on a store with an accounts-receivable
29
+ * ledger it credits the customer's account, elsewhere it credits the order's
30
+ * invoice and moves no money. `account` puts the order's settled money on the
31
+ * customer's account as unapplied cash and makes no refund (an engine released
32
+ * before 2026-10-10 never answers it).
33
+ */
34
+ export const RETURN_SETTLEMENT_METHODS = ['refund', 'store_credit', 'account'];
35
+ /**
36
+ * A step of a return's life, as `allowedActions` names it. `CLOSE_CREDITED` is
37
+ * {@link ReturnsModule.closeAlreadyCredited}: closing a return invoice corrections already
38
+ * credited in full, moving no money.
39
+ */
40
+ export const RETURN_ACTIONS = [
41
+ 'APPROVE',
42
+ 'REJECT',
43
+ 'RECORD_RECEIPT',
44
+ 'CANCEL',
45
+ 'SETTLE',
46
+ 'CLOSE_CREDITED',
47
+ ];
48
+ /** Why a return cannot be settled now, in the order the engine checks them. */
49
+ export const RETURN_SETTLEMENT_BLOCKERS = [
50
+ 'OUTCOME_UNKNOWN',
51
+ 'ALREADY_SETTLED',
52
+ 'IN_PROGRESS',
53
+ 'RECEIPT_REQUIRED',
54
+ 'STATE',
55
+ ];
56
+ /** The fields of an `OrderReturn` every read selects (a selection, spliced into each document). */
57
+ const RETURN_FIELDS = /* GraphQL */ `
58
+ id
59
+ code
60
+ channelId
61
+ orderId
62
+ orderCode
63
+ customerId
64
+ currencyCode
65
+ state
66
+ initiator
67
+ customerNote
68
+ adminNote
69
+ preferredSettlementMethod
70
+ settlementMethod
71
+ shippingRefundAmount
72
+ settledAmount
73
+ refundId
74
+ creditNoteId
75
+ creditNoteNumber
76
+ requestedAt
77
+ resolvedAt
78
+ createdAt
79
+ updatedAt
80
+ lines {
81
+ id
82
+ returnId
83
+ orderLineId
84
+ productVariantId
85
+ productVariantName
86
+ productVariantSku
87
+ requestedQty
88
+ approvedQty
89
+ receivedQty
90
+ restockQty
91
+ writeOffQty
92
+ restockLocationId
93
+ reasonCode
94
+ reasonNote
95
+ unitPriceWithTax
96
+ unitPriceWithTaxUnrounded
97
+ refundAmount
98
+ createdAt
99
+ updatedAt
100
+ }
101
+ `;
102
+ /** The fields of a `ReturnCoveringCreditNote` (a selection, spliced into several documents). */
103
+ const COVERING_CREDIT_NOTE_FIELDS = /* GraphQL */ `
104
+ creditNoteId
105
+ creditNoteNumber
106
+ ledger
107
+ `;
108
+ /** What `get` and `list` add to a return's fields (engines from 2026-10-11). */
109
+ const READ_FIELDS = /* GraphQL */ `
110
+ refundEstimate
111
+ customer {
112
+ id
113
+ firstName
114
+ lastName
115
+ emailAddress
116
+ addresses {
117
+ company
118
+ defaultBillingAddress
119
+ defaultShippingAddress
120
+ }
121
+ }
122
+ lines {
123
+ refundEstimate
124
+ }
125
+ `;
126
+ const HISTORY_FIELDS = /* GraphQL */ `
127
+ history {
128
+ state
129
+ actor
130
+ actorUserId
131
+ reason
132
+ createdAt
133
+ }
134
+ `;
135
+ export const RETURN_QUERY = /* GraphQL */ `
136
+ query SdkOrderReturn($id: ID!) {
137
+ orderReturn(id: $id) {
138
+ ${RETURN_FIELDS}
139
+ alreadyCreditedBy {
140
+ ${COVERING_CREDIT_NOTE_FIELDS}
141
+ }
142
+ ${HISTORY_FIELDS}
143
+ ${READ_FIELDS}
144
+ allowedActions {
145
+ action
146
+ allowed
147
+ reasonCode
148
+ }
149
+ }
150
+ }
151
+ `;
152
+ /**
153
+ * {@link RETURN_QUERY} for an engine with `alreadyCreditedBy` (ruling U15) but released before
154
+ * `allowedActions`, `refundEstimate` and `customer` (2026-10-11).
155
+ */
156
+ export const RETURN_QUERY_BEFORE_ACTIONS = /* GraphQL */ `
157
+ query SdkOrderReturnBeforeActions($id: ID!) {
158
+ orderReturn(id: $id) {
159
+ ${RETURN_FIELDS}
160
+ alreadyCreditedBy {
161
+ ${COVERING_CREDIT_NOTE_FIELDS}
162
+ }
163
+ ${HISTORY_FIELDS}
164
+ }
165
+ }
166
+ `;
167
+ /** {@link RETURN_QUERY} for an engine released before `alreadyCreditedBy` (ruling U15). */
168
+ export const RETURN_QUERY_LEGACY = /* GraphQL */ `
169
+ query SdkOrderReturnLegacy($id: ID!) {
170
+ orderReturn(id: $id) {
171
+ ${RETURN_FIELDS}
172
+ ${HISTORY_FIELDS}
173
+ }
174
+ }
175
+ `;
176
+ export const RETURNS_LIST_QUERY = /* GraphQL */ `
177
+ query SdkOrderReturns($options: OrderReturnListOptions) {
178
+ orderReturns(options: $options) {
179
+ items {
180
+ ${RETURN_FIELDS}
181
+ alreadyCreditedBy {
182
+ ${COVERING_CREDIT_NOTE_FIELDS}
183
+ }
184
+ ${READ_FIELDS}
185
+ }
186
+ totalItems
187
+ }
188
+ }
189
+ `;
190
+ /** {@link RETURNS_LIST_QUERY} for an engine with `alreadyCreditedBy` but released before 2026-10-11. */
191
+ export const RETURNS_LIST_QUERY_BEFORE_ACTIONS = /* GraphQL */ `
192
+ query SdkOrderReturnsBeforeActions($options: OrderReturnListOptions) {
193
+ orderReturns(options: $options) {
194
+ items {
195
+ ${RETURN_FIELDS}
196
+ alreadyCreditedBy {
197
+ ${COVERING_CREDIT_NOTE_FIELDS}
198
+ }
199
+ }
200
+ totalItems
201
+ }
202
+ }
203
+ `;
204
+ /** {@link RETURNS_LIST_QUERY} for an engine released before `alreadyCreditedBy`. */
205
+ export const RETURNS_LIST_QUERY_LEGACY = /* GraphQL */ `
206
+ query SdkOrderReturnsLegacy($options: OrderReturnListOptions) {
207
+ orderReturns(options: $options) {
208
+ items {
209
+ ${RETURN_FIELDS}
210
+ }
211
+ totalItems
212
+ }
213
+ }
214
+ `;
215
+ export const OPEN_RETURNS_COUNT_QUERY = /* GraphQL */ `
216
+ query SdkOpenReturnsCount {
217
+ orderReturns(options: { take: 1, state: requested }) {
218
+ totalItems
219
+ }
220
+ }
221
+ `;
222
+ export const CREATE_RETURN_MUTATION = /* GraphQL */ `
223
+ mutation SdkCreateReturn($input: CreateReturnInput!) {
224
+ createReturn(input: $input) {
225
+ ${RETURN_FIELDS}
226
+ }
227
+ }
228
+ `;
229
+ export const APPROVE_RETURN_MUTATION = /* GraphQL */ `
230
+ mutation SdkApproveReturn($input: ApproveReturnInput!) {
231
+ approveReturn(input: $input) {
232
+ ${RETURN_FIELDS}
233
+ }
234
+ }
235
+ `;
236
+ export const REJECT_RETURN_MUTATION = /* GraphQL */ `
237
+ mutation SdkRejectReturn($id: ID!, $reason: String!) {
238
+ rejectReturn(id: $id, reason: $reason) {
239
+ ${RETURN_FIELDS}
240
+ }
241
+ }
242
+ `;
243
+ export const CANCEL_RETURN_MUTATION = /* GraphQL */ `
244
+ mutation SdkCancelReturn($id: ID!, $reason: String) {
245
+ cancelReturn(id: $id, reason: $reason) {
246
+ ${RETURN_FIELDS}
247
+ }
248
+ }
249
+ `;
250
+ export const RECORD_RETURN_RECEIPT_MUTATION = /* GraphQL */ `
251
+ mutation SdkRecordReturnReceipt($input: RecordReturnReceiptInput!) {
252
+ recordReturnReceipt(input: $input) {
253
+ ${RETURN_FIELDS}
254
+ }
255
+ }
256
+ `;
257
+ export const SETTLE_RETURN_MUTATION = /* GraphQL */ `
258
+ mutation SdkSettleReturn($input: SettleReturnInput!, $idempotencyKey: String) {
259
+ settleReturn(input: $input, idempotencyKey: $idempotencyKey) {
260
+ ${RETURN_FIELDS}
261
+ ${HISTORY_FIELDS}
262
+ }
263
+ }
264
+ `;
265
+ export const ADD_RETURN_NOTE_MUTATION = /* GraphQL */ `
266
+ mutation SdkAddReturnNote($id: ID!, $note: String!) {
267
+ addReturnNote(id: $id, note: $note) {
268
+ ${RETURN_FIELDS}
269
+ }
270
+ }
271
+ `;
272
+ const NUMBERING_FIELDS = /* GraphQL */ `
273
+ prefix
274
+ suffix
275
+ digits
276
+ yearFormat
277
+ yearReset
278
+ `;
279
+ export const RETURN_NUMBERING_QUERY = /* GraphQL */ `
280
+ query SdkReturnNumberingConfig {
281
+ returnNumberingConfig {
282
+ ${NUMBERING_FIELDS}
283
+ }
284
+ }
285
+ `;
286
+ export const UPDATE_RETURN_NUMBERING_MUTATION = /* GraphQL */ `
287
+ mutation SdkUpdateReturnNumberingConfig($input: UpdateReturnNumberingConfigInput!) {
288
+ updateReturnNumberingConfig(input: $input) {
289
+ ${NUMBERING_FIELDS}
290
+ }
291
+ }
292
+ `;
293
+ export const RETURNS_SETTINGS_QUERY = /* GraphQL */ `
294
+ query SdkReturnsSettings {
295
+ activeChannel {
296
+ id
297
+ customFields {
298
+ returnsEnabled
299
+ returnWindowDays
300
+ returnsAutoApprove
301
+ returnsRequireReceiptBeforeSettle
302
+ returnsDefaultRestockLocationId
303
+ }
304
+ }
305
+ }
306
+ `;
307
+ export const RETURNS_FOR_ORDER_QUERY = /* GraphQL */ `
308
+ query SdkReturnsForOrder($orderId: ID!) {
309
+ returnsForOrder(orderId: $orderId) {
310
+ ${RETURN_FIELDS}
311
+ alreadyCreditedBy {
312
+ ${COVERING_CREDIT_NOTE_FIELDS}
313
+ }
314
+ }
315
+ }
316
+ `;
317
+ /** {@link RETURNS_FOR_ORDER_QUERY} for an engine released before `alreadyCreditedBy`. */
318
+ export const RETURNS_FOR_ORDER_QUERY_LEGACY = /* GraphQL */ `
319
+ query SdkReturnsForOrderLegacy($orderId: ID!) {
320
+ returnsForOrder(orderId: $orderId) {
321
+ ${RETURN_FIELDS}
322
+ }
323
+ }
324
+ `;
325
+ export const CLOSE_RETURN_ALREADY_CREDITED_MUTATION = /* GraphQL */ `
326
+ mutation SdkCloseReturnAlreadyCredited($input: CloseReturnAlreadyCreditedInput!) {
327
+ closeReturnAlreadyCredited(input: $input) {
328
+ ${RETURN_FIELDS}
329
+ alreadyCreditedBy {
330
+ ${COVERING_CREDIT_NOTE_FIELDS}
331
+ }
332
+ ${HISTORY_FIELDS}
333
+ }
334
+ }
335
+ `;
336
+ /** The fields of a `ReturnLineCorrectionCredit` (a selection, spliced into two documents). */
337
+ const CORRECTION_CREDIT_FIELDS = /* GraphQL */ `
338
+ orderLineId
339
+ creditNoteId
340
+ creditNoteNumber
341
+ ledger
342
+ quantity
343
+ amount
344
+ `;
345
+ export const RETURN_ELIGIBILITY_QUERY = /* GraphQL */ `
346
+ query SdkReturnEligibility($orderId: ID!) {
347
+ returnEligibilityForOrder(orderId: $orderId) {
348
+ orderId
349
+ eligible
350
+ reason
351
+ returnWindowEndsAt
352
+ lines {
353
+ orderLineId
354
+ productVariantId
355
+ productVariantName
356
+ productVariantSku
357
+ fulfilledQty
358
+ returnableQty
359
+ creditedQty
360
+ correctionCredits {
361
+ ${CORRECTION_CREDIT_FIELDS}
362
+ }
363
+ unitPriceWithTax
364
+ unitPriceWithTaxUnrounded
365
+ }
366
+ }
367
+ }
368
+ `;
369
+ /**
370
+ * {@link RETURN_ELIGIBILITY_QUERY} for an engine released before 2026-10-09, which has no
371
+ * `creditedQty`/`correctionCredits`: GraphQL refuses a whole document over one unknown field.
372
+ */
373
+ export const RETURN_ELIGIBILITY_QUERY_LEGACY = /* GraphQL */ `
374
+ query SdkReturnEligibilityLegacy($orderId: ID!) {
375
+ returnEligibilityForOrder(orderId: $orderId) {
376
+ orderId
377
+ eligible
378
+ reason
379
+ returnWindowEndsAt
380
+ lines {
381
+ orderLineId
382
+ productVariantId
383
+ productVariantName
384
+ productVariantSku
385
+ fulfilledQty
386
+ returnableQty
387
+ unitPriceWithTax
388
+ unitPriceWithTaxUnrounded
389
+ }
390
+ }
391
+ }
392
+ `;
393
+ export const RETURN_SETTLEMENT_OPTIONS_QUERY = /* GraphQL */ `
394
+ query SdkReturnSettlementOptions($returnId: ID!) {
395
+ returnSettlementOptions(returnId: $returnId) {
396
+ returnId
397
+ currencyCode
398
+ settleable
399
+ blockedBy
400
+ refund {
401
+ available
402
+ reasonCode
403
+ payments {
404
+ paymentId
405
+ method
406
+ refundable
407
+ }
408
+ }
409
+ creditNote {
410
+ available
411
+ ledger
412
+ reasonCode
413
+ invoiceNumber
414
+ }
415
+ account {
416
+ available
417
+ reasonCode
418
+ message
419
+ held
420
+ book
421
+ }
422
+ initialMethod
423
+ defaultAmount
424
+ amountCeiling
425
+ correctionCredits {
426
+ ${CORRECTION_CREDIT_FIELDS}
427
+ }
428
+ shippingCeiling
429
+ alreadyCredited {
430
+ available
431
+ reasonCode
432
+ creditNotes {
433
+ ${COVERING_CREDIT_NOTE_FIELDS}
434
+ }
435
+ }
436
+ }
437
+ }
438
+ `;
439
+ /**
440
+ * {@link RETURN_SETTLEMENT_OPTIONS_QUERY} for an engine with `alreadyCredited` but released before
441
+ * the account option named the store's book (incentives sprint 8 PR 4).
442
+ */
443
+ export const RETURN_SETTLEMENT_OPTIONS_QUERY_BEFORE_BOOK = /* GraphQL */ `
444
+ query SdkReturnSettlementOptionsBeforeBook($returnId: ID!) {
445
+ returnSettlementOptions(returnId: $returnId) {
446
+ returnId
447
+ currencyCode
448
+ settleable
449
+ blockedBy
450
+ refund {
451
+ available
452
+ reasonCode
453
+ payments {
454
+ paymentId
455
+ method
456
+ refundable
457
+ }
458
+ }
459
+ creditNote {
460
+ available
461
+ ledger
462
+ reasonCode
463
+ invoiceNumber
464
+ }
465
+ account {
466
+ available
467
+ reasonCode
468
+ message
469
+ held
470
+ }
471
+ initialMethod
472
+ defaultAmount
473
+ amountCeiling
474
+ correctionCredits {
475
+ ${CORRECTION_CREDIT_FIELDS}
476
+ }
477
+ shippingCeiling
478
+ alreadyCredited {
479
+ available
480
+ reasonCode
481
+ creditNotes {
482
+ ${COVERING_CREDIT_NOTE_FIELDS}
483
+ }
484
+ }
485
+ }
486
+ }
487
+ `;
488
+ /**
489
+ * {@link RETURN_SETTLEMENT_OPTIONS_QUERY} for an engine with the account settlement (2026-10-10)
490
+ * but released before `alreadyCredited` (ruling U15).
491
+ */
492
+ export const RETURN_SETTLEMENT_OPTIONS_QUERY_BEFORE_CLOSE = /* GraphQL */ `
493
+ query SdkReturnSettlementOptionsBeforeClose($returnId: ID!) {
494
+ returnSettlementOptions(returnId: $returnId) {
495
+ returnId
496
+ currencyCode
497
+ settleable
498
+ blockedBy
499
+ refund {
500
+ available
501
+ reasonCode
502
+ payments {
503
+ paymentId
504
+ method
505
+ refundable
506
+ }
507
+ }
508
+ creditNote {
509
+ available
510
+ ledger
511
+ reasonCode
512
+ invoiceNumber
513
+ }
514
+ account {
515
+ available
516
+ reasonCode
517
+ message
518
+ held
519
+ }
520
+ initialMethod
521
+ defaultAmount
522
+ amountCeiling
523
+ correctionCredits {
524
+ ${CORRECTION_CREDIT_FIELDS}
525
+ }
526
+ shippingCeiling
527
+ }
528
+ }
529
+ `;
530
+ /**
531
+ * {@link RETURN_SETTLEMENT_OPTIONS_QUERY} for an engine with `shippingCeiling` but released before
532
+ * the account settlement (2026-10-10).
533
+ */
534
+ export const RETURN_SETTLEMENT_OPTIONS_QUERY_BEFORE_ACCOUNT = /* GraphQL */ `
535
+ query SdkReturnSettlementOptionsBeforeAccount($returnId: ID!) {
536
+ returnSettlementOptions(returnId: $returnId) {
537
+ returnId
538
+ currencyCode
539
+ settleable
540
+ blockedBy
541
+ refund {
542
+ available
543
+ reasonCode
544
+ payments {
545
+ paymentId
546
+ method
547
+ refundable
548
+ }
549
+ }
550
+ creditNote {
551
+ available
552
+ ledger
553
+ reasonCode
554
+ invoiceNumber
555
+ }
556
+ initialMethod
557
+ defaultAmount
558
+ amountCeiling
559
+ correctionCredits {
560
+ ${CORRECTION_CREDIT_FIELDS}
561
+ }
562
+ shippingCeiling
563
+ }
564
+ }
565
+ `;
566
+ /**
567
+ * {@link RETURN_SETTLEMENT_OPTIONS_QUERY} for an engine with the correction credits (2026-10-09)
568
+ * but released before `shippingCeiling`.
569
+ */
570
+ export const RETURN_SETTLEMENT_OPTIONS_QUERY_BEFORE_SHIPPING = /* GraphQL */ `
571
+ query SdkReturnSettlementOptionsBeforeShipping($returnId: ID!) {
572
+ returnSettlementOptions(returnId: $returnId) {
573
+ returnId
574
+ currencyCode
575
+ settleable
576
+ blockedBy
577
+ refund {
578
+ available
579
+ reasonCode
580
+ payments {
581
+ paymentId
582
+ method
583
+ refundable
584
+ }
585
+ }
586
+ creditNote {
587
+ available
588
+ ledger
589
+ reasonCode
590
+ invoiceNumber
591
+ }
592
+ initialMethod
593
+ defaultAmount
594
+ amountCeiling
595
+ correctionCredits {
596
+ ${CORRECTION_CREDIT_FIELDS}
597
+ }
598
+ }
599
+ }
600
+ `;
601
+ /**
602
+ * {@link RETURN_SETTLEMENT_OPTIONS_QUERY} for an engine with the plan (W9-47) but released before
603
+ * 2026-10-09, which has no `amountCeiling`/`correctionCredits`.
604
+ */
605
+ export const RETURN_SETTLEMENT_OPTIONS_QUERY_LEGACY = /* GraphQL */ `
606
+ query SdkReturnSettlementOptionsLegacy($returnId: ID!) {
607
+ returnSettlementOptions(returnId: $returnId) {
608
+ returnId
609
+ currencyCode
610
+ settleable
611
+ blockedBy
612
+ refund {
613
+ available
614
+ reasonCode
615
+ payments {
616
+ paymentId
617
+ method
618
+ refundable
619
+ }
620
+ }
621
+ creditNote {
622
+ available
623
+ ledger
624
+ reasonCode
625
+ invoiceNumber
626
+ }
627
+ initialMethod
628
+ defaultAmount
629
+ }
630
+ }
631
+ `;
632
+ /**
633
+ * Whether a failure is "this engine does not know that field yet": the document refused before
634
+ * it ran, never an execution-time refusal or a transient failure (degrading on those would hide
635
+ * an outage behind silently missing fields). graphql-js answers a validation failure with HTTP
636
+ * 400, which reaches the SDK as `BAD_REQUEST`, or coded `GRAPHQL_VALIDATION_FAILED` (the storefront
637
+ * SDK's `isUnknownFieldRejection` reads the same two).
638
+ */
639
+ function isUnknownFieldRejection(error) {
640
+ if (!(error instanceof ValidationError) || error.service !== 'vendure')
641
+ return false;
642
+ return (error.code === 'BAD_REQUEST' ||
643
+ error.code === 'GRAPHQL_VALIDATION_FAILED' ||
644
+ /Cannot query field/i.test(error.message));
645
+ }
646
+ /** The plan's documents, newest first: each drops the newest field the one before it asks. */
647
+ const SETTLEMENT_OPTIONS_DOCUMENTS = [
648
+ RETURN_SETTLEMENT_OPTIONS_QUERY,
649
+ RETURN_SETTLEMENT_OPTIONS_QUERY_BEFORE_BOOK,
650
+ RETURN_SETTLEMENT_OPTIONS_QUERY_BEFORE_CLOSE,
651
+ RETURN_SETTLEMENT_OPTIONS_QUERY_BEFORE_ACCOUNT,
652
+ RETURN_SETTLEMENT_OPTIONS_QUERY_BEFORE_SHIPPING,
653
+ RETURN_SETTLEMENT_OPTIONS_QUERY_LEGACY,
654
+ ];
655
+ export function createReturnsModule(transport) {
656
+ /**
657
+ * Latched once the engine proved it predates the correction-credit fields, so the downgrade
658
+ * costs one refused request per client.
659
+ */
660
+ let correctionCreditsUnsupported = false;
661
+ /** Which of {@link SETTLEMENT_OPTIONS_DOCUMENTS} this engine answers (latched, never back up). */
662
+ let settlementOptionsTier = 0;
663
+ /** Latched once the engine proved it predates `alreadyCreditedBy` (one refused request per client). */
664
+ let alreadyCreditedByUnsupported = false;
665
+ /** Sends the current document, or the legacy one once the engine refused the new fields. */
666
+ async function withFallback(query, legacy, variables, options) {
667
+ if (!correctionCreditsUnsupported) {
668
+ try {
669
+ return await transport.graphql({ api: 'admin', query, variables }, options);
670
+ }
671
+ catch (error) {
672
+ if (!isUnknownFieldRejection(error))
673
+ throw error;
674
+ }
675
+ }
676
+ const data = await transport.graphql({ api: 'admin', query: legacy, variables }, options);
677
+ correctionCreditsUnsupported = true;
678
+ return data;
679
+ }
680
+ /** The return reads: with `alreadyCreditedBy`, or without it once the engine refused it. */
681
+ async function readReturns(query, legacy, variables, options) {
682
+ if (!alreadyCreditedByUnsupported) {
683
+ try {
684
+ return await transport.graphql({ api: 'admin', query, variables }, options);
685
+ }
686
+ catch (error) {
687
+ if (!isUnknownFieldRejection(error))
688
+ throw error;
689
+ }
690
+ }
691
+ const data = await transport.graphql({ api: 'admin', query: legacy, variables }, options);
692
+ alreadyCreditedByUnsupported = true;
693
+ return data;
694
+ }
695
+ /**
696
+ * Which tier of the `get`/`list` documents this engine answers (latched, never back up): 0 has
697
+ * `allowedActions`/`refundEstimate`/`customer` (2026-10-11), 1 only `alreadyCreditedBy`
698
+ * (U15), 2 neither. Tier 2 also latches `alreadyCreditedByUnsupported`, as `forOrder` reads it.
699
+ */
700
+ let returnReadTier = 0;
701
+ async function readTiered(documents, variables, options) {
702
+ if (alreadyCreditedByUnsupported)
703
+ returnReadTier = 2;
704
+ for (;;) {
705
+ const tier = returnReadTier;
706
+ try {
707
+ const data = await transport.graphql({ api: 'admin', query: documents[tier], variables }, options);
708
+ if (tier === 2)
709
+ alreadyCreditedByUnsupported = true;
710
+ return data;
711
+ }
712
+ catch (error) {
713
+ if (tier === 2 || !isUnknownFieldRejection(error))
714
+ throw error;
715
+ // A refused document names no field the SDK can read (the transport answers a generic
716
+ // 400), so each older tier is asked in turn, once per client.
717
+ returnReadTier = tier + 1;
718
+ }
719
+ }
720
+ }
721
+ /** One write that answers the return it changed. */
722
+ async function write(field, query, variables, options) {
723
+ const data = await transport.graphql({ api: 'admin', query, variables }, options);
724
+ return data[field];
725
+ }
726
+ return {
727
+ async get(id, options) {
728
+ const data = await readTiered([RETURN_QUERY, RETURN_QUERY_BEFORE_ACTIONS, RETURN_QUERY_LEGACY], { id }, options);
729
+ return data.orderReturn;
730
+ },
731
+ async list(filter, options) {
732
+ const data = await readTiered([RETURNS_LIST_QUERY, RETURNS_LIST_QUERY_BEFORE_ACTIONS, RETURNS_LIST_QUERY_LEGACY], { options: filter ?? {} }, options);
733
+ return data.orderReturns;
734
+ },
735
+ async forOrder(orderId, options) {
736
+ const data = await readReturns(RETURNS_FOR_ORDER_QUERY, RETURNS_FOR_ORDER_QUERY_LEGACY, { orderId }, options);
737
+ return data.returnsForOrder;
738
+ },
739
+ async eligibility(orderId, options) {
740
+ const data = await withFallback(RETURN_ELIGIBILITY_QUERY, RETURN_ELIGIBILITY_QUERY_LEGACY, { orderId }, options);
741
+ return data.returnEligibilityForOrder;
742
+ },
743
+ async settlementOptions(returnId, options) {
744
+ const last = SETTLEMENT_OPTIONS_DOCUMENTS.length - 1;
745
+ // An engine that refused the correction credits on `eligibility` predates every newer tier.
746
+ if (correctionCreditsUnsupported)
747
+ settlementOptionsTier = last;
748
+ for (;;) {
749
+ const tier = settlementOptionsTier;
750
+ try {
751
+ const data = await transport.graphql({
752
+ api: 'admin',
753
+ query: SETTLEMENT_OPTIONS_DOCUMENTS[tier],
754
+ variables: { returnId },
755
+ }, options);
756
+ if (tier === last)
757
+ correctionCreditsUnsupported = true;
758
+ return data.returnSettlementOptions;
759
+ }
760
+ catch (error) {
761
+ if (tier === last || !isUnknownFieldRejection(error))
762
+ throw error;
763
+ settlementOptionsTier = tier + 1;
764
+ }
765
+ }
766
+ },
767
+ async openCount(options) {
768
+ const data = await transport.graphql({ api: 'admin', query: OPEN_RETURNS_COUNT_QUERY }, options);
769
+ return data.orderReturns.totalItems;
770
+ },
771
+ create: (input, options) => write('createReturn', CREATE_RETURN_MUTATION, { input }, options),
772
+ approve: (id, input, options) => write('approveReturn', APPROVE_RETURN_MUTATION, { input: { id, ...input } }, options),
773
+ reject: (id, reason, options) => write('rejectReturn', REJECT_RETURN_MUTATION, { id, reason }, options),
774
+ cancel: (id, input, options) => write('cancelReturn', CANCEL_RETURN_MUTATION, { id, reason: input?.reason ?? null }, options),
775
+ recordReceipt: (id, input, options) => write('recordReturnReceipt', RECORD_RETURN_RECEIPT_MUTATION, { input: { id, lines: input.lines } }, options),
776
+ addNote: (id, note, options) => write('addReturnNote', ADD_RETURN_NOTE_MUTATION, { id, note }, options),
777
+ async settle(returnId, input, options) {
778
+ const data = await transport.graphql({
779
+ api: 'admin',
780
+ query: SETTLE_RETURN_MUTATION,
781
+ variables: {
782
+ input: {
783
+ id: returnId,
784
+ method: input.method,
785
+ ...(input.paymentId != null ? { paymentId: input.paymentId } : {}),
786
+ ...(input.amountOverride != null ? { amountOverride: input.amountOverride } : {}),
787
+ ...(input.shippingRefundAmount != null
788
+ ? { shippingRefundAmount: input.shippingRefundAmount }
789
+ : {}),
790
+ ...(input.reason != null ? { reason: input.reason } : {}),
791
+ },
792
+ // A variable, not a header: the Admin API takes the key as an argument. `undefined`
793
+ // when omitted, never null: `JSON.stringify` drops it, so no key stays off the wire.
794
+ idempotencyKey: options?.idempotencyKey,
795
+ },
796
+ }, options);
797
+ return data.settleReturn;
798
+ },
799
+ numbering: {
800
+ async get(options) {
801
+ const data = await transport.graphql({ api: 'admin', query: RETURN_NUMBERING_QUERY }, options);
802
+ return data.returnNumberingConfig;
803
+ },
804
+ async set(input, options) {
805
+ const data = await transport.graphql({ api: 'admin', query: UPDATE_RETURN_NUMBERING_MUTATION, variables: { input } }, options);
806
+ return data.updateReturnNumberingConfig;
807
+ },
808
+ },
809
+ settings: {
810
+ async get(options) {
811
+ const data = await transport.graphql({ api: 'admin', query: RETURNS_SETTINGS_QUERY }, options);
812
+ const channel = data.activeChannel;
813
+ if (!channel) {
814
+ throw new NotFoundError({
815
+ code: 'CHANNEL_NOT_FOUND',
816
+ message: 'No store is active for this session, so it has no return policy to read.',
817
+ status: 404,
818
+ service: 'vendure',
819
+ });
820
+ }
821
+ const fields = channel.customFields;
822
+ return {
823
+ channelId: channel.id,
824
+ // The engine's own defaults (the plugin's field declarations) for a field it answers null.
825
+ returnsEnabled: fields?.returnsEnabled === true,
826
+ returnWindowDays: fields?.returnWindowDays ?? 30,
827
+ returnsAutoApprove: fields?.returnsAutoApprove === true,
828
+ returnsRequireReceiptBeforeSettle: fields?.returnsRequireReceiptBeforeSettle !== false,
829
+ returnsDefaultRestockLocationId: fields?.returnsDefaultRestockLocationId ?? null,
830
+ };
831
+ },
832
+ },
833
+ async closeAlreadyCredited(returnId, input, options) {
834
+ const data = await transport.graphql({
835
+ api: 'admin',
836
+ query: CLOSE_RETURN_ALREADY_CREDITED_MUTATION,
837
+ variables: {
838
+ input: { id: returnId, ...(input?.reason != null ? { reason: input.reason } : {}) },
839
+ },
840
+ }, options);
841
+ return data.closeReturnAlreadyCredited;
842
+ },
843
+ };
844
+ }