@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,8 +1,15 @@
1
1
  import { createPage, idempotencyKey as mintIdempotencyKey, pageFromVendureList, readOffsetCursor, ValidationError, } from '@sixtyninecommerce/core';
2
+ import { storeCreditAware } from '../payments/store-credit-fields.js';
3
+ import { createArDocumentsModule } from './ar.js';
4
+ import { createDocumentEmailsModule } from './emails.js';
5
+ import { decodePdf } from './pdf.js';
6
+ // Also what `documents.ar.pdf` decodes with (headless W10-30).
7
+ export { decodePdf };
2
8
  const API_DOCUMENT_TYPE = {
3
9
  invoice: 'INVOICE',
4
10
  'credit-note': 'CREDIT_NOTE',
5
11
  'packing-slip': 'PACKING_SLIP',
12
+ 'purchase-order': 'PURCHASE_ORDER',
6
13
  };
7
14
  /**
8
15
  * Most blocks one document may carry. A longer list refuses the whole document
@@ -10,6 +17,12 @@ const API_DOCUMENT_TYPE = {
10
17
  * dropped the overflow — a document is a page, not a feed.
11
18
  */
12
19
  export const MAX_DOCUMENT_EXTENSIONS = 10;
20
+ /** Every {@link DocumentEmailEvent}, in the order the server's enum declares them. */
21
+ export const DOCUMENT_EMAIL_EVENTS = [
22
+ 'invoice_generated',
23
+ 'credit_note_issued',
24
+ 'proforma',
25
+ ];
13
26
  const DOCUMENT_LINE_FIELDS = /* GraphQL */ `
14
27
  description
15
28
  sku
@@ -40,6 +53,8 @@ const INVOICE_FIELDS = /* GraphQL */ `
40
53
  supplementsInvoiceId
41
54
  lines { ${DOCUMENT_LINE_FIELDS} }
42
55
  numberingProvider
56
+ amountPaid
57
+ amountDue
43
58
  createdAt
44
59
  `;
45
60
  const CREDIT_NOTE_FIELDS = /* GraphQL */ `
@@ -172,8 +187,8 @@ export const ORDER_CREDIT_NOTE_EMAIL_SENDS_QUERY = /* GraphQL */ `
172
187
  }
173
188
  `;
174
189
  export const ISSUE_PARTIAL_CREDIT_NOTE_MUTATION = /* GraphQL */ `
175
- mutation IssuePartialCreditNote($input: IssuePartialCreditNoteInput!) {
176
- issuePartialCreditNote(input: $input) { ${CREDIT_NOTE_FIELDS} }
190
+ mutation IssuePartialCreditNote($input: IssuePartialCreditNoteInput!, $idempotencyKey: String) {
191
+ issuePartialCreditNote(input: $input, idempotencyKey: $idempotencyKey) { ${CREDIT_NOTE_FIELDS} }
177
192
  }
178
193
  `;
179
194
  export const ISSUE_SUPPLEMENTARY_INVOICE_MUTATION = /* GraphQL */ `
@@ -232,9 +247,43 @@ const INVOICE_CORRECTION_PLAN_FIELDS = /* GraphQL */ `
232
247
  options { paymentId method amount refundable }
233
248
  recommendedPaymentId
234
249
  }
235
- accountCredit { available unavailableCode message }
250
+ accountCredit { available unavailableCode message book }
236
251
  settlement
237
252
  blockers { code message path }
253
+ returnedGoods {
254
+ lines {
255
+ orderLineId
256
+ description
257
+ quantity
258
+ returnedQuantity
259
+ creditedQuantity
260
+ creditableQuantity
261
+ creditableAmount
262
+ returnCodes
263
+ }
264
+ shipping { charged refunded credited creditable returnCodes }
265
+ }
266
+ givenBack {
267
+ lines {
268
+ orderLineId
269
+ description
270
+ quantity
271
+ returnedQuantity
272
+ creditedQuantity
273
+ priceCredited
274
+ creditableQuantity
275
+ creditableAmount
276
+ returnCodes
277
+ creditNoteNumbers
278
+ }
279
+ shipping { charged refunded credited creditable returnCodes creditNoteNumbers }
280
+ }
281
+ paymentTerms {
282
+ invoiced { summary paymentDays conditionCode dueOn }
283
+ replacement { summary paymentDays conditionCode dueOn }
284
+ accepts
285
+ unavailableMessage
286
+ }
238
287
  `;
239
288
  export const PLAN_INVOICE_CORRECTION_QUERY = /* GraphQL */ `
240
289
  query PlanInvoiceCorrection($input: InvoiceCorrectionInput!) {
@@ -269,7 +318,7 @@ export const COMMIT_INVOICE_CORRECTION_MUTATION = /* GraphQL */ `
269
318
  numberingProvider
270
319
  }
271
320
  refund { id state total paymentId }
272
- accountCredit { amount currencyCode unappliedCashIds }
321
+ accountCredit { amount currencyCode unappliedCashIds book storeCreditEntryIds }
273
322
  }
274
323
  }
275
324
  `;
@@ -288,6 +337,231 @@ export const DELETE_DOCUMENT_EXTENSION_MUTATION = /* GraphQL */ `
288
337
  deleteDocumentExtension(key: $key)
289
338
  }
290
339
  `;
340
+ /**
341
+ * The invoice config every engine answers. `columnUnitPriceAfterDiscount` arrived after the rest
342
+ * (2026-10-09), and an engine without it refuses the whole document, so each document has a
343
+ * `_LEGACY` twin selecting only these, sent once the engine refused the current one.
344
+ */
345
+ const INVOICE_CONFIG_FIELDS_LEGACY = /* GraphQL */ `
346
+ id
347
+ enabled
348
+ prefix
349
+ suffix
350
+ nextNumber
351
+ digits
352
+ yearFormat
353
+ yearReset
354
+ creditNoteNextNumber
355
+ creditNotePrefix
356
+ creditNoteSuffix
357
+ creditNoteDigits
358
+ creditNoteYearFormat
359
+ creditNoteYearReset
360
+ columnProduct
361
+ columnSku
362
+ columnQuantity
363
+ columnUnitPriceExcl
364
+ columnUnitPriceDiscount
365
+ columnUnitPriceIncl
366
+ columnLineTotal
367
+ columnLineDiscount
368
+ columnTaxRate
369
+ columnTaxAmount
370
+ columnTotal
371
+ showLogo
372
+ legalIdentityBlock
373
+ footerText
374
+ defaultLanguage
375
+ externalNumberOrderField
376
+ invoicingProvider
377
+ `;
378
+ const INVOICE_CONFIG_FIELDS = /* GraphQL */ `
379
+ ${INVOICE_CONFIG_FIELDS_LEGACY}
380
+ columnUnitPriceAfterDiscount
381
+ `;
382
+ export const INVOICE_CONFIG_QUERY = /* GraphQL */ `
383
+ query InvoiceConfig {
384
+ invoiceConfig { ${INVOICE_CONFIG_FIELDS} }
385
+ }
386
+ `;
387
+ export const UPDATE_INVOICE_CONFIG_MUTATION = /* GraphQL */ `
388
+ mutation UpdateInvoiceConfig($input: UpdateInvoiceConfigInput!) {
389
+ updateInvoiceConfig(input: $input) { ${INVOICE_CONFIG_FIELDS} }
390
+ }
391
+ `;
392
+ /** {@link INVOICE_CONFIG_QUERY} for an engine without `columnUnitPriceAfterDiscount`. */
393
+ export const INVOICE_CONFIG_QUERY_LEGACY = /* GraphQL */ `
394
+ query InvoiceConfig {
395
+ invoiceConfig { ${INVOICE_CONFIG_FIELDS_LEGACY} }
396
+ }
397
+ `;
398
+ /** {@link UPDATE_INVOICE_CONFIG_MUTATION} for an engine without `columnUnitPriceAfterDiscount`. */
399
+ export const UPDATE_INVOICE_CONFIG_MUTATION_LEGACY = /* GraphQL */ `
400
+ mutation UpdateInvoiceConfig($input: UpdateInvoiceConfigInput!) {
401
+ updateInvoiceConfig(input: $input) { ${INVOICE_CONFIG_FIELDS_LEGACY} }
402
+ }
403
+ `;
404
+ /** {@link SET_INVOICING_PROVIDER_MUTATION} for an engine without `columnUnitPriceAfterDiscount`. */
405
+ export const SET_INVOICING_PROVIDER_MUTATION_LEGACY = /* GraphQL */ `
406
+ mutation SetInvoicingProvider($code: String!) {
407
+ setInvoicingProvider(code: $code) { ${INVOICE_CONFIG_FIELDS_LEGACY} }
408
+ }
409
+ `;
410
+ export const INVOICING_PROVIDERS_QUERY = /* GraphQL */ `
411
+ query InvoicingProviders {
412
+ invoicingProviders {
413
+ code
414
+ label
415
+ external
416
+ documents
417
+ ready
418
+ notReadyReason
419
+ }
420
+ }
421
+ `;
422
+ export const SET_INVOICING_PROVIDER_MUTATION = /* GraphQL */ `
423
+ mutation SetInvoicingProvider($code: String!) {
424
+ setInvoicingProvider(code: $code) { ${INVOICE_CONFIG_FIELDS} }
425
+ }
426
+ `;
427
+ const FINANCIAL_DOCUMENT_ISSUE_FIELDS = /* GraphQL */ `
428
+ id
429
+ provider
430
+ operationKey
431
+ documentType
432
+ ledger
433
+ orderId
434
+ status
435
+ externalRef
436
+ externalNumber
437
+ documentDate
438
+ attempts
439
+ lastError
440
+ reservedAt
441
+ bookedAt
442
+ recordedAt
443
+ abandonReason
444
+ `;
445
+ export const FINANCIAL_DOCUMENT_ISSUES_QUERY = /* GraphQL */ `
446
+ query FinancialDocumentIssues($unresolvedOnly: Boolean, $take: Int, $skip: Int) {
447
+ financialDocumentIssues(unresolvedOnly: $unresolvedOnly, take: $take, skip: $skip) {
448
+ totalItems
449
+ items { ${FINANCIAL_DOCUMENT_ISSUE_FIELDS} }
450
+ }
451
+ }
452
+ `;
453
+ export const ABANDON_FINANCIAL_DOCUMENT_ISSUE_MUTATION = /* GraphQL */ `
454
+ mutation AbandonFinancialDocumentIssue($id: ID!, $reason: String!) {
455
+ abandonFinancialDocumentIssue(id: $id, reason: $reason) { ${FINANCIAL_DOCUMENT_ISSUE_FIELDS} }
456
+ }
457
+ `;
458
+ export const RESOLVE_FINANCIAL_DOCUMENT_ISSUE_MUTATION = /* GraphQL */ `
459
+ mutation ResolveFinancialDocumentIssue($id: ID!, $reason: String!) {
460
+ resolveFinancialDocumentIssue(id: $id, reason: $reason) { ${FINANCIAL_DOCUMENT_ISSUE_FIELDS} }
461
+ }
462
+ `;
463
+ export const SEND_PROFORMA_INVOICE_MUTATION = /* GraphQL */ `
464
+ mutation SendProformaInvoice($input: SendProformaInvoiceInput!) {
465
+ sendProformaInvoice(input: $input)
466
+ }
467
+ `;
468
+ export const ORDER_PROFORMA_SENDS_QUERY = /* GraphQL */ `
469
+ query OrderProformaSends($orderId: ID!) {
470
+ orderProformaSends(orderId: $orderId) {
471
+ id
472
+ orderId
473
+ recipients
474
+ message
475
+ invoicedOn
476
+ createdAt
477
+ }
478
+ }
479
+ `;
480
+ export const ORDER_INVOICE_EMAIL_SENDS_QUERY = /* GraphQL */ `
481
+ query OrderInvoiceEmailSends($orderId: ID!) {
482
+ orderInvoiceEmailSends(orderId: $orderId) {
483
+ id
484
+ orderId
485
+ recipientsTo
486
+ recipientsCc
487
+ createdAt
488
+ }
489
+ }
490
+ `;
491
+ /** Its own document: `documentEmailRecipients` is new, so on an older engine this call alone fails. */
492
+ export const DOCUMENT_EMAIL_RECIPIENTS_QUERY = /* GraphQL */ `
493
+ query DocumentEmailRecipients($orderId: ID!, $event: DocumentEmailEvent!) {
494
+ documentEmailRecipients(orderId: $orderId, event: $event) {
495
+ to
496
+ cc
497
+ }
498
+ }
499
+ `;
500
+ export const REGENERATE_PACKING_SLIP_MUTATION = /* GraphQL */ `
501
+ mutation RegeneratePackingSlip($fulfillmentId: ID!, $languageCode: String) {
502
+ regeneratePackingSlip(fulfillmentId: $fulfillmentId, languageCode: $languageCode) {
503
+ ${PACKING_SLIP_FIELDS}
504
+ }
505
+ }
506
+ `;
507
+ export const PACKING_SLIP_FIELDS_QUERY = /* GraphQL */ `
508
+ query PackingSlipFulfillmentFields {
509
+ packingSlipFulfillmentFields {
510
+ handlerCode
511
+ handlerName
512
+ fields {
513
+ key
514
+ label
515
+ type
516
+ defaultVisible
517
+ }
518
+ }
519
+ }
520
+ `;
521
+ const PACKING_SLIP_CONFIG_FIELDS = /* GraphQL */ `
522
+ id
523
+ enabled
524
+ prefix
525
+ suffix
526
+ nextNumber
527
+ digits
528
+ yearFormat
529
+ yearReset
530
+ columnRowNumber
531
+ columnProduct
532
+ columnSku
533
+ columnQuantity
534
+ showLogo
535
+ showInvoiceNumber
536
+ fulfillmentFieldVisibility
537
+ footerText
538
+ defaultLanguage
539
+ `;
540
+ export const PACKING_SLIP_CONFIG_QUERY = /* GraphQL */ `
541
+ query PackingSlipConfig {
542
+ packingSlipConfig { ${PACKING_SLIP_CONFIG_FIELDS} }
543
+ }
544
+ `;
545
+ export const UPDATE_PACKING_SLIP_CONFIG_MUTATION = /* GraphQL */ `
546
+ mutation UpdatePackingSlipConfig($input: UpdatePackingSlipConfigInput!) {
547
+ updatePackingSlipConfig(input: $input) { ${PACKING_SLIP_CONFIG_FIELDS} }
548
+ }
549
+ `;
550
+ /**
551
+ * Whether a failure is "this engine does not know that field yet": the document refused before it
552
+ * ran (graphql-js answers a validation failure with HTTP 400 → `BAD_REQUEST`, or coded
553
+ * `GRAPHQL_VALIDATION_FAILED`), never an execution-time refusal or a transient failure. The
554
+ * returns module reads the same signs.
555
+ */
556
+ function isUnknownFieldRejection(error) {
557
+ if (!(error instanceof ValidationError) || error.service !== 'vendure')
558
+ return false;
559
+ return (error.code === 'BAD_REQUEST' ||
560
+ error.code === 'GRAPHQL_VALIDATION_FAILED' ||
561
+ /Cannot query field/i.test(error.message));
562
+ }
563
+ /** The server's default page of booking attempts; the SDK states it so the cursor arithmetic knows the size. */
564
+ const ISSUES_PAGE_SIZE = 50;
291
565
  /** A complete array behind the SDK's page shape (spec §9.2). */
292
566
  function wholeList(items, what) {
293
567
  return createPage(items, { nextCursor: null, hasNext: false, total: items.length }, () => {
@@ -322,19 +596,18 @@ function fromApiTypes(values) {
322
596
  function toSchema(raw) {
323
597
  return { ...raw, documentTypes: fromApiTypes(raw.documentTypes) };
324
598
  }
325
- /** Decode the base64 a PDF-returning mutation answers with. */
326
- function decodePdf(base64) {
327
- // Node and every modern runtime have `atob`; Buffer would tie this package
328
- // to Node, and it ships to browsers as the dashboard's client.
329
- const binary = atob(base64);
330
- const bytes = new Uint8Array(binary.length);
331
- for (let index = 0; index < binary.length; index += 1) {
332
- bytes[index] = binary.charCodeAt(index);
333
- }
334
- return bytes;
335
- }
336
599
  /** The server's default page; the SDK states it so the cursor arithmetic knows the size. */
337
600
  const CUSTOMER_DOCUMENTS_PAGE_SIZE = 25;
601
+ /**
602
+ * The key a caller retries an attempt under, put on the error the attempt threw (when nothing below
603
+ * put one there already). Returns the same error.
604
+ */
605
+ function withAttemptKey(error, key) {
606
+ if (error !== null && typeof error === 'object' && !('idempotencyKey' in error)) {
607
+ Object.defineProperty(error, 'idempotencyKey', { value: key, enumerable: true });
608
+ }
609
+ return error;
610
+ }
338
611
  export function createDocumentsModule(transport) {
339
612
  const customerDocumentsPage = async (customerId, skip, take, options) => {
340
613
  const data = await transport.graphql({
@@ -346,6 +619,31 @@ export function createDocumentsModule(transport) {
346
619
  const items = list.items.map((item) => ({ ...item, type: fromApiType(item.type) }));
347
620
  return pageFromVendureList({ items, totalItems: list.totalItems }, skip, take, (cursor) => customerDocumentsPage(customerId, readOffsetCursor(cursor), take, options));
348
621
  };
622
+ /** Latched once the engine proved it predates `columnUnitPriceAfterDiscount` (one refused request per client). */
623
+ let afterDiscountUnsupported = false;
624
+ /** Sends the current invoice-config document, or its legacy twin once the engine refused the column. */
625
+ async function withInvoiceConfigFallback(query, legacy, variables, options) {
626
+ if (!afterDiscountUnsupported) {
627
+ try {
628
+ return await transport.graphql({ api: 'admin', query, variables }, options);
629
+ }
630
+ catch (error) {
631
+ if (!isUnknownFieldRejection(error))
632
+ throw error;
633
+ }
634
+ }
635
+ const data = await transport.graphql({ api: 'admin', query: legacy, variables }, options);
636
+ afterDiscountUnsupported = true;
637
+ return data;
638
+ }
639
+ const issuesPage = async (skip, take, options) => {
640
+ const data = await transport.graphql({
641
+ api: 'admin',
642
+ query: FINANCIAL_DOCUMENT_ISSUES_QUERY,
643
+ variables: { unresolvedOnly: options?.unresolvedOnly ?? false, take, skip },
644
+ }, options);
645
+ return pageFromVendureList(data.financialDocumentIssues, skip, take, (cursor) => issuesPage(readOffsetCursor(cursor), take, options));
646
+ };
349
647
  return {
350
648
  // One implementation behind the two overloads the interface declares; the
351
649
  // cast is the standard TypeScript shape for that, since an implementation
@@ -460,17 +758,31 @@ export function createDocumentsModule(transport) {
460
758
  return wholeList(data.orderCreditNoteEmailSends, 'orderCreditNoteEmailSends');
461
759
  },
462
760
  async issuePartialCreditNote(input, options) {
463
- const data = await transport.graphql({ api: 'admin', query: ISSUE_PARTIAL_CREDIT_NOTE_MUTATION, variables: { input } }, options);
464
- return data.issuePartialCreditNote;
761
+ const key = options?.idempotencyKey ?? mintIdempotencyKey();
762
+ try {
763
+ const data = await transport.graphql({
764
+ api: 'admin',
765
+ query: ISSUE_PARTIAL_CREDIT_NOTE_MUTATION,
766
+ // A retry of this attempt sends the same input under the same key.
767
+ variables: { input, idempotencyKey: key },
768
+ }, { ...options, idempotencyKey: key });
769
+ return { ...data.issuePartialCreditNote, idempotencyKey: key };
770
+ }
771
+ catch (error) {
772
+ throw withAttemptKey(error, key);
773
+ }
465
774
  },
466
775
  async planCorrection(input, options) {
467
- const data = await transport.graphql({ api: 'admin', query: PLAN_INVOICE_CORRECTION_QUERY, variables: { input } }, options);
776
+ // `book` (incentives sprint 8 PR 4): dropped once for an engine before it.
777
+ const data = await storeCreditAware(transport).graphql({ api: 'admin', query: PLAN_INVOICE_CORRECTION_QUERY, variables: { input } }, options);
468
778
  return data.planInvoiceCorrection;
469
779
  },
470
780
  async commitCorrection(input, options) {
471
781
  const key = options.idempotencyKey ?? mintIdempotencyKey();
472
782
  try {
473
- const data = await transport.graphql({
783
+ // `book` and `storeCreditEntryIds` (sprint 8 PR 4): an engine before them refuses the
784
+ // document before it runs, and it is sent once more without them under the same key.
785
+ const data = await storeCreditAware(transport).graphql({
474
786
  api: 'admin',
475
787
  query: COMMIT_INVOICE_CORRECTION_MUTATION,
476
788
  // The input goes out as given, never normalised: it must be the request the plan was
@@ -480,17 +792,119 @@ export function createDocumentsModule(transport) {
480
792
  return { ...data.commitInvoiceCorrection, idempotencyKey: key };
481
793
  }
482
794
  catch (error) {
483
- // The key the caller retries under, when it did not choose one.
484
- if (error !== null && typeof error === 'object' && !('idempotencyKey' in error)) {
485
- Object.defineProperty(error, 'idempotencyKey', { value: key, enumerable: true });
486
- }
487
- throw error;
795
+ throw withAttemptKey(error, key);
488
796
  }
489
797
  },
490
798
  async issueSupplementaryInvoice(input, options) {
491
799
  const data = await transport.graphql({ api: 'admin', query: ISSUE_SUPPLEMENTARY_INVOICE_MUTATION, variables: { input } }, options);
492
800
  return data.issueSupplementaryInvoice;
493
801
  },
802
+ async sendProforma(orderId, input, options) {
803
+ const data = await transport.graphql({
804
+ api: 'admin',
805
+ query: SEND_PROFORMA_INVOICE_MUTATION,
806
+ variables: {
807
+ input: {
808
+ orderId,
809
+ invoicedOn: input.invoicedOn,
810
+ recipients: input.recipients,
811
+ message: input.message ?? null,
812
+ languageCode: input.languageCode ?? null,
813
+ },
814
+ },
815
+ }, options);
816
+ return data.sendProformaInvoice;
817
+ },
818
+ async proformaSends(orderId, options) {
819
+ const data = await transport.graphql({ api: 'admin', query: ORDER_PROFORMA_SENDS_QUERY, variables: { orderId } }, options);
820
+ return wholeList(data.orderProformaSends, 'orderProformaSends');
821
+ },
822
+ async invoiceEmailSends(orderId, options) {
823
+ const data = await transport.graphql({ api: 'admin', query: ORDER_INVOICE_EMAIL_SENDS_QUERY, variables: { orderId } }, options);
824
+ return wholeList(data.orderInvoiceEmailSends, 'orderInvoiceEmailSends');
825
+ },
826
+ async emailRecipients(orderId, event, options) {
827
+ if (!DOCUMENT_EMAIL_EVENTS.includes(event)) {
828
+ throw new ValidationError({
829
+ code: 'INVALID_DOCUMENT_EMAIL_EVENT',
830
+ message: `"${String(event)}" is not a document email. Expected one of ${DOCUMENT_EMAIL_EVENTS.join(', ')}.`,
831
+ status: 400,
832
+ service: 'vendure',
833
+ });
834
+ }
835
+ const data = await transport.graphql({ api: 'admin', query: DOCUMENT_EMAIL_RECIPIENTS_QUERY, variables: { orderId, event } }, options);
836
+ return data.documentEmailRecipients;
837
+ },
838
+ async regeneratePackingSlip(fulfillmentId, options) {
839
+ const data = await transport.graphql({
840
+ api: 'admin',
841
+ query: REGENERATE_PACKING_SLIP_MUTATION,
842
+ variables: { fulfillmentId, languageCode: options?.languageCode ?? null },
843
+ }, options);
844
+ return data.regeneratePackingSlip;
845
+ },
846
+ async packingSlipFields(options) {
847
+ const data = await transport.graphql({ api: 'admin', query: PACKING_SLIP_FIELDS_QUERY }, options);
848
+ return wholeList(data.packingSlipFulfillmentFields, 'packingSlipFulfillmentFields');
849
+ },
850
+ invoiceConfig: {
851
+ async get(options) {
852
+ const data = await withInvoiceConfigFallback(INVOICE_CONFIG_QUERY, INVOICE_CONFIG_QUERY_LEGACY, {}, options);
853
+ return data.invoiceConfig;
854
+ },
855
+ async update(input, options) {
856
+ // Validation refuses the document before anything runs, so the legacy send is the first
857
+ // attempt, never a repeat.
858
+ const data = await withInvoiceConfigFallback(UPDATE_INVOICE_CONFIG_MUTATION, UPDATE_INVOICE_CONFIG_MUTATION_LEGACY, { input }, options);
859
+ return data.updateInvoiceConfig;
860
+ },
861
+ },
862
+ invoicingProviders: {
863
+ async list(options) {
864
+ const data = await transport.graphql({ api: 'admin', query: INVOICING_PROVIDERS_QUERY }, options);
865
+ return wholeList(data.invoicingProviders, 'invoicingProviders');
866
+ },
867
+ async set(provider, options) {
868
+ const data = await withInvoiceConfigFallback(SET_INVOICING_PROVIDER_MUTATION, SET_INVOICING_PROVIDER_MUTATION_LEGACY, { code: provider }, options);
869
+ return data.setInvoicingProvider;
870
+ },
871
+ },
872
+ issues: {
873
+ list(options) {
874
+ // The Admin API is offset-paged; the offset hides inside the cursor (spec §9.3).
875
+ const take = options?.limit ?? ISSUES_PAGE_SIZE;
876
+ const skip = options?.after === undefined ? 0 : readOffsetCursor(options.after);
877
+ return issuesPage(skip, take, options);
878
+ },
879
+ async abandon(id, reason, options) {
880
+ const data = await transport.graphql({
881
+ api: 'admin',
882
+ query: ABANDON_FINANCIAL_DOCUMENT_ISSUE_MUTATION,
883
+ variables: { id, reason },
884
+ }, options);
885
+ return data.abandonFinancialDocumentIssue;
886
+ },
887
+ async resolve(id, reason, options) {
888
+ const data = await transport.graphql({
889
+ api: 'admin',
890
+ query: RESOLVE_FINANCIAL_DOCUMENT_ISSUE_MUTATION,
891
+ variables: { id, reason },
892
+ }, options);
893
+ return data.resolveFinancialDocumentIssue;
894
+ },
895
+ },
896
+ packingSlipConfig: {
897
+ async get(options) {
898
+ const data = await transport.graphql({ api: 'admin', query: PACKING_SLIP_CONFIG_QUERY }, options);
899
+ return data.packingSlipConfig;
900
+ },
901
+ async update(input, options) {
902
+ const data = await transport.graphql({ api: 'admin', query: UPDATE_PACKING_SLIP_CONFIG_MUTATION, variables: { input } }, options);
903
+ return data.updatePackingSlipConfig;
904
+ },
905
+ },
906
+ ar: createArDocumentsModule(transport),
907
+ emails: createDocumentEmailsModule(transport),
494
908
  extensions: {
495
909
  async list(options) {
496
910
  const data = await transport.graphql({ api: 'admin', query: DOCUMENT_EXTENSIONS_QUERY }, options);
@@ -0,0 +1,2 @@
1
+ /** Decode the base64 a PDF-returning call answers with (`documents.previewInvoice`, `documents.ar.pdf`). */
2
+ export declare function decodePdf(base64: string): Uint8Array;
@@ -0,0 +1,11 @@
1
+ /** Decode the base64 a PDF-returning call answers with (`documents.previewInvoice`, `documents.ar.pdf`). */
2
+ export function decodePdf(base64) {
3
+ // Node and every modern runtime have `atob`; Buffer would tie this package
4
+ // to Node, and it ships to browsers as the dashboard's client.
5
+ const binary = atob(base64);
6
+ const bytes = new Uint8Array(binary.length);
7
+ for (let index = 0; index < binary.length; index += 1) {
8
+ bytes[index] = binary.charCodeAt(index);
9
+ }
10
+ return bytes;
11
+ }