@sixtyninecommerce/admin 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/README.md +5772 -118
  2. package/dist/auth/index.d.ts +7 -1
  3. package/dist/auth/index.js +8 -1
  4. package/dist/catalog/assets.d.ts +120 -8
  5. package/dist/catalog/assets.js +98 -12
  6. package/dist/catalog/collections.d.ts +279 -14
  7. package/dist/catalog/collections.js +246 -15
  8. package/dist/catalog/documents.d.ts +142 -0
  9. package/dist/catalog/documents.js +114 -0
  10. package/dist/catalog/index.d.ts +54 -6
  11. package/dist/catalog/index.js +10 -1
  12. package/dist/catalog/metadata.d.ts +244 -0
  13. package/dist/catalog/metadata.js +220 -0
  14. package/dist/catalog/products.d.ts +159 -19
  15. package/dist/catalog/products.js +88 -13
  16. package/dist/catalog/properties.d.ts +140 -14
  17. package/dist/catalog/properties.js +65 -1
  18. package/dist/catalog/recommendations.d.ts +288 -0
  19. package/dist/catalog/recommendations.js +237 -0
  20. package/dist/catalog/reviews.d.ts +381 -0
  21. package/dist/catalog/reviews.js +325 -0
  22. package/dist/catalog/types.d.ts +17 -1
  23. package/dist/catalog/types.js +10 -0
  24. package/dist/catalog/variant-find.d.ts +136 -0
  25. package/dist/catalog/variant-find.js +239 -0
  26. package/dist/catalog/variants.d.ts +293 -26
  27. package/dist/catalog/variants.js +164 -7
  28. package/dist/catalog/visibility.d.ts +38 -7
  29. package/dist/catalog/visibility.js +19 -1
  30. package/dist/client.d.ts +121 -9
  31. package/dist/client.js +53 -14
  32. package/dist/content/assets.d.ts +285 -0
  33. package/dist/content/assets.js +181 -0
  34. package/dist/content/forms.d.ts +332 -1
  35. package/dist/content/forms.js +140 -4
  36. package/dist/content/items.d.ts +292 -0
  37. package/dist/content/items.js +170 -0
  38. package/dist/content/menus.d.ts +254 -0
  39. package/dist/content/menus.js +70 -0
  40. package/dist/content/strings.d.ts +137 -0
  41. package/dist/content/strings.js +82 -0
  42. package/dist/content/types.d.ts +282 -0
  43. package/dist/content/types.js +100 -0
  44. package/dist/customers/age-verification.d.ts +66 -0
  45. package/dist/customers/age-verification.js +79 -0
  46. package/dist/customers/credit.d.ts +263 -0
  47. package/dist/customers/credit.js +244 -0
  48. package/dist/customers/delivery-preferences.d.ts +120 -0
  49. package/dist/customers/delivery-preferences.js +97 -0
  50. package/dist/customers/delivery-terms.d.ts +44 -0
  51. package/dist/customers/delivery-terms.js +32 -0
  52. package/dist/customers/groups.d.ts +207 -0
  53. package/dist/customers/groups.js +438 -0
  54. package/dist/customers/index.d.ts +462 -37
  55. package/dist/customers/index.js +317 -40
  56. package/dist/customers/invitation-status.d.ts +57 -0
  57. package/dist/customers/invitation-status.js +21 -0
  58. package/dist/customers/notes.d.ts +67 -0
  59. package/dist/customers/notes.js +51 -0
  60. package/dist/customers/notification-recipients.d.ts +97 -0
  61. package/dist/customers/notification-recipients.js +84 -0
  62. package/dist/customers/saved-lists.d.ts +42 -0
  63. package/dist/customers/saved-lists.js +61 -0
  64. package/dist/customers/vat.d.ts +83 -0
  65. package/dist/customers/vat.js +46 -0
  66. package/dist/customers/wire.d.ts +20 -0
  67. package/dist/customers/wire.js +35 -0
  68. package/dist/documents/ar.d.ts +307 -0
  69. package/dist/documents/ar.js +254 -0
  70. package/dist/documents/emails.d.ts +150 -0
  71. package/dist/documents/emails.js +220 -0
  72. package/dist/documents/index.d.ts +744 -21
  73. package/dist/documents/index.js +438 -24
  74. package/dist/documents/pdf.d.ts +2 -0
  75. package/dist/documents/pdf.js +11 -0
  76. package/dist/fulfillments/create.d.ts +167 -0
  77. package/dist/fulfillments/create.js +216 -0
  78. package/dist/fulfillments/index.d.ts +163 -11
  79. package/dist/fulfillments/index.js +135 -6
  80. package/dist/fulfillments/payment-policy.d.ts +64 -0
  81. package/dist/fulfillments/payment-policy.js +140 -0
  82. package/dist/fulfillments/warehouse.d.ts +724 -0
  83. package/dist/fulfillments/warehouse.js +914 -0
  84. package/dist/geo/index.d.ts +119 -0
  85. package/dist/geo/index.js +107 -0
  86. package/dist/index.d.ts +147 -39
  87. package/dist/index.js +51 -12
  88. package/dist/integrations/afas-actions.d.ts +234 -0
  89. package/dist/integrations/afas-actions.js +310 -0
  90. package/dist/integrations/afas-types.d.ts +483 -0
  91. package/dist/integrations/afas-types.js +5 -0
  92. package/dist/integrations/afas.d.ts +234 -0
  93. package/dist/integrations/afas.js +290 -0
  94. package/dist/integrations/connections.d.ts +103 -0
  95. package/dist/integrations/connections.js +55 -0
  96. package/dist/integrations/esp.d.ts +313 -0
  97. package/dist/integrations/esp.js +169 -0
  98. package/dist/integrations/exact-online-types.d.ts +965 -0
  99. package/dist/integrations/exact-online-types.js +6 -0
  100. package/dist/integrations/exact-online.d.ts +784 -0
  101. package/dist/integrations/exact-online.js +1089 -0
  102. package/dist/integrations/index.d.ts +44 -3
  103. package/dist/integrations/index.js +23 -3
  104. package/dist/integrations/pipeline-discoveries.d.ts +65 -0
  105. package/dist/integrations/pipeline-discoveries.js +65 -0
  106. package/dist/integrations/pipeline-keys.d.ts +13 -0
  107. package/dist/integrations/pipeline-keys.js +22 -0
  108. package/dist/integrations/pipeline-runs.d.ts +119 -0
  109. package/dist/integrations/pipeline-runs.js +87 -0
  110. package/dist/integrations/pipelines.d.ts +87 -15
  111. package/dist/integrations/pipelines.js +41 -22
  112. package/dist/integrations/price-import.d.ts +223 -0
  113. package/dist/integrations/price-import.js +124 -0
  114. package/dist/integrations/types.d.ts +367 -3
  115. package/dist/integrations/types.js +4 -3
  116. package/dist/locations/index.d.ts +66 -0
  117. package/dist/locations/index.js +31 -0
  118. package/dist/meta/index.d.ts +172 -0
  119. package/dist/metafields/index.d.ts +8 -1
  120. package/dist/metafields/index.js +10 -0
  121. package/dist/orders/cancel-with-money.d.ts +237 -0
  122. package/dist/orders/cancel-with-money.js +155 -0
  123. package/dist/orders/commit-edit.d.ts +23 -1
  124. package/dist/orders/commit-edit.js +19 -2
  125. package/dist/orders/deposit-policy.d.ts +3 -1
  126. package/dist/orders/drafts.d.ts +800 -0
  127. package/dist/orders/drafts.js +771 -0
  128. package/dist/orders/fields.d.ts +245 -0
  129. package/dist/orders/fields.js +188 -0
  130. package/dist/orders/get.d.ts +29 -19
  131. package/dist/orders/get.js +17 -8
  132. package/dist/orders/index.d.ts +66 -15
  133. package/dist/orders/index.js +25 -2
  134. package/dist/orders/lifecycle.d.ts +128 -0
  135. package/dist/orders/lifecycle.js +158 -0
  136. package/dist/orders/line-price-preview.d.ts +7 -2
  137. package/dist/orders/list.d.ts +243 -0
  138. package/dist/orders/list.js +487 -0
  139. package/dist/orders/manual-discounts.d.ts +13 -5
  140. package/dist/orders/manual-pricing.d.ts +5 -0
  141. package/dist/orders/money-view.d.ts +149 -0
  142. package/dist/orders/money-view.js +99 -0
  143. package/dist/orders/order-entry.d.ts +20 -7
  144. package/dist/orders/plan-edit.d.ts +34 -2
  145. package/dist/orders/plan-edit.js +112 -11
  146. package/dist/orders/settings.d.ts +201 -0
  147. package/dist/orders/settings.js +325 -0
  148. package/dist/orders/status.d.ts +159 -13
  149. package/dist/orders/status.js +21 -0
  150. package/dist/orders/surcharges.d.ts +20 -1
  151. package/dist/orders/surcharges.js +37 -11
  152. package/dist/payments/account-credit.d.ts +46 -0
  153. package/dist/payments/account-credit.js +42 -0
  154. package/dist/payments/ar.d.ts +292 -0
  155. package/dist/payments/ar.js +223 -0
  156. package/dist/payments/connected-account.d.ts +47 -0
  157. package/dist/payments/connected-account.js +61 -0
  158. package/dist/payments/credit-noted-fields.d.ts +19 -0
  159. package/dist/payments/credit-noted-fields.js +69 -0
  160. package/dist/payments/customer-consent.d.ts +30 -0
  161. package/dist/payments/customer-consent.js +49 -0
  162. package/dist/payments/index.d.ts +340 -19
  163. package/dist/payments/index.js +151 -1
  164. package/dist/payments/methods.d.ts +303 -8
  165. package/dist/payments/methods.js +337 -7
  166. package/dist/payments/mollie-methods.d.ts +159 -0
  167. package/dist/payments/mollie-methods.js +141 -0
  168. package/dist/payments/payment-links.d.ts +180 -0
  169. package/dist/payments/payment-links.js +97 -0
  170. package/dist/payments/provider-keys.d.ts +150 -0
  171. package/dist/payments/provider-keys.js +118 -0
  172. package/dist/payments/providers.d.ts +86 -11
  173. package/dist/payments/providers.js +29 -0
  174. package/dist/payments/requests.d.ts +147 -0
  175. package/dist/payments/requests.js +93 -0
  176. package/dist/payments/store-credit-fields.d.ts +15 -0
  177. package/dist/payments/store-credit-fields.js +51 -0
  178. package/dist/pickups/index.d.ts +106 -0
  179. package/dist/pickups/index.js +108 -0
  180. package/dist/platform/channels.d.ts +132 -0
  181. package/dist/platform/channels.js +128 -0
  182. package/dist/platform/email-gateways.d.ts +165 -0
  183. package/dist/platform/email-gateways.js +78 -0
  184. package/dist/platform/geo.d.ts +123 -0
  185. package/dist/platform/geo.js +144 -0
  186. package/dist/platform/tax.d.ts +162 -0
  187. package/dist/platform/tax.js +169 -0
  188. package/dist/pos/anomalies.d.ts +158 -0
  189. package/dist/pos/anomalies.js +64 -0
  190. package/dist/pos/assisted-selling.d.ts +79 -0
  191. package/dist/pos/assisted-selling.js +38 -0
  192. package/dist/pos/exchanges.d.ts +108 -0
  193. package/dist/pos/exchanges.js +22 -0
  194. package/dist/pos/gift-cards.d.ts +135 -0
  195. package/dist/pos/gift-cards.js +47 -0
  196. package/dist/pos/index.d.ts +2370 -58
  197. package/dist/pos/index.js +854 -7
  198. package/dist/pos/no-receipt.d.ts +94 -0
  199. package/dist/pos/no-receipt.js +25 -0
  200. package/dist/pos/offline-sales.d.ts +228 -0
  201. package/dist/pos/offline-sales.js +170 -0
  202. package/dist/pos/pay-by-link.d.ts +143 -0
  203. package/dist/pos/pay-by-link.js +57 -0
  204. package/dist/pos/quick-keys.d.ts +103 -0
  205. package/dist/pos/quick-keys.js +45 -0
  206. package/dist/pos/reports.d.ts +360 -0
  207. package/dist/pos/reports.js +62 -0
  208. package/dist/pos/returns.d.ts +244 -0
  209. package/dist/pos/returns.js +83 -0
  210. package/dist/pricing/bulk-coupons.d.ts +139 -0
  211. package/dist/pricing/bulk-coupons.js +112 -0
  212. package/dist/pricing/index.d.ts +174 -4
  213. package/dist/pricing/index.js +174 -1
  214. package/dist/pricing/price-lists.d.ts +606 -0
  215. package/dist/pricing/price-lists.js +600 -0
  216. package/dist/purchasing/alerts.d.ts +104 -0
  217. package/dist/purchasing/alerts.js +88 -0
  218. package/dist/purchasing/backorders.d.ts +61 -0
  219. package/dist/purchasing/backorders.js +92 -0
  220. package/dist/purchasing/cost.d.ts +110 -0
  221. package/dist/purchasing/cost.js +86 -0
  222. package/dist/purchasing/index.d.ts +54 -0
  223. package/dist/purchasing/index.js +24 -0
  224. package/dist/purchasing/links.d.ts +263 -0
  225. package/dist/purchasing/links.js +192 -0
  226. package/dist/purchasing/purchase-orders.d.ts +551 -0
  227. package/dist/purchasing/purchase-orders.js +491 -0
  228. package/dist/purchasing/receipts.d.ts +396 -0
  229. package/dist/purchasing/receipts.js +287 -0
  230. package/dist/purchasing/replenishment.d.ts +281 -0
  231. package/dist/purchasing/replenishment.js +240 -0
  232. package/dist/purchasing/returns.d.ts +273 -0
  233. package/dist/purchasing/returns.js +229 -0
  234. package/dist/purchasing/settings.d.ts +152 -0
  235. package/dist/purchasing/settings.js +181 -0
  236. package/dist/purchasing/suppliers.d.ts +476 -0
  237. package/dist/purchasing/suppliers.js +438 -0
  238. package/dist/quotes/index.d.ts +518 -0
  239. package/dist/quotes/index.js +439 -0
  240. package/dist/reports/index.d.ts +71 -8
  241. package/dist/reports/index.js +74 -11
  242. package/dist/returns/index.d.ts +675 -21
  243. package/dist/returns/index.js +756 -11
  244. package/dist/search/index.d.ts +76 -1
  245. package/dist/search/index.js +63 -0
  246. package/dist/seo/config.d.ts +128 -0
  247. package/dist/seo/config.js +95 -0
  248. package/dist/seo/redirects.d.ts +125 -0
  249. package/dist/seo/redirects.js +60 -1
  250. package/dist/seo/settings.d.ts +147 -0
  251. package/dist/seo/settings.js +209 -0
  252. package/dist/shipping/definitions.d.ts +29 -0
  253. package/dist/shipping/definitions.js +47 -0
  254. package/dist/shipping/fulfillment-profiles.d.ts +174 -0
  255. package/dist/shipping/fulfillment-profiles.js +104 -0
  256. package/dist/shipping/hendriks.d.ts +97 -0
  257. package/dist/shipping/hendriks.js +50 -0
  258. package/dist/shipping/index.d.ts +54 -0
  259. package/dist/shipping/index.js +27 -0
  260. package/dist/shipping/methods.d.ts +205 -0
  261. package/dist/shipping/methods.js +240 -0
  262. package/dist/shipping/myparcel.d.ts +668 -0
  263. package/dist/shipping/myparcel.js +466 -0
  264. package/dist/shipping/parcel-count-suggestion.d.ts +2 -0
  265. package/dist/shipping/parcel-rule.d.ts +6 -5
  266. package/dist/shipping/parcel-rule.js +21 -23
  267. package/dist/shipping/rate-tables.d.ts +324 -0
  268. package/dist/shipping/rate-tables.js +390 -0
  269. package/dist/shipping/ship-to-countries.d.ts +75 -0
  270. package/dist/shipping/ship-to-countries.js +47 -0
  271. package/dist/stock/by-location.d.ts +86 -0
  272. package/dist/stock/by-location.js +94 -0
  273. package/dist/stock/index.d.ts +18 -4
  274. package/dist/stock/index.js +7 -0
  275. package/dist/stock/locations.d.ts +144 -0
  276. package/dist/stock/locations.js +168 -0
  277. package/dist/stock/settings.d.ts +106 -0
  278. package/dist/stock/settings.js +103 -0
  279. package/dist/stock/transfers.d.ts +386 -52
  280. package/dist/stock/transfers.js +222 -17
  281. package/dist/stored-value/index.d.ts +312 -11
  282. package/dist/stored-value/index.js +223 -4
  283. package/dist/subscriptions/index.d.ts +682 -0
  284. package/dist/subscriptions/index.js +815 -0
  285. package/dist/tax/display-policy.d.ts +105 -0
  286. package/dist/tax/display-policy.js +84 -0
  287. package/dist/tax/index.d.ts +79 -1
  288. package/dist/tax/index.js +52 -0
  289. package/dist/tenant/email-style.d.ts +102 -0
  290. package/dist/tenant/email-style.js +72 -0
  291. package/dist/tenant/email-templates.d.ts +287 -0
  292. package/dist/tenant/email-templates.js +271 -0
  293. package/dist/tenant/notifications.d.ts +23 -17
  294. package/dist/tenant/settings-sources.d.ts +1 -1
  295. package/dist/tenant/time-zone.d.ts +17 -0
  296. package/dist/tenant/time-zone.js +11 -0
  297. package/dist/types.d.ts +50 -3
  298. package/dist/users/index.d.ts +3 -0
  299. package/dist/users/index.js +2 -0
  300. package/dist/users/warehouses.d.ts +50 -0
  301. package/dist/users/warehouses.js +51 -0
  302. package/package.json +2 -2
@@ -0,0 +1,105 @@
1
+ import { type Transport } from '@sixtyninecommerce/core';
2
+ import type { Call } from '../types.js';
3
+ /** `channel` follows the store's "prices include tax"; `gross` = incl. tax; `net` = excl. tax. */
4
+ export type TaxDisplayDefault = 'channel' | 'gross' | 'net';
5
+ /** `inherit` leaves B2B and trade customers on the default. */
6
+ export type TaxDisplayB2b = 'inherit' | 'gross' | 'net';
7
+ /** What a shopper is shown: `GROSS` = incl. tax, `NET` = excl. tax (the Shop API's casing). */
8
+ export type TaxDisplayMode = 'GROSS' | 'NET';
9
+ /** The shoppers a policy is answered for, in the order a settings screen lists them. */
10
+ export type TaxDisplayAudience = 'VISITOR' | 'RETAIL_CUSTOMER' | 'B2B_CUSTOMER' | 'LISTED_COUNTRY_CUSTOMER';
11
+ /**
12
+ * A store's price-display policy: who sees prices with or without tax. Three Channel custom fields
13
+ * (`taxDisplayDefault`, `taxDisplayB2b`, `taxExclusiveCountries`), in the organization settings
14
+ * group `settings.tax_display`.
15
+ */
16
+ export interface TaxDisplayPolicy {
17
+ default: TaxDisplayDefault;
18
+ b2b: TaxDisplayB2b;
19
+ /**
20
+ * Upper-case ISO-3166 alpha-2 codes; empty turns the rule off. A customer shipping to a listed
21
+ * country always sees prices excl. tax, whatever the other two say, AND is taxed by that
22
+ * country's tax zone instead of the store's: this list changes what customers are charged, not
23
+ * only what they are shown.
24
+ */
25
+ countries: string[];
26
+ }
27
+ export interface TaxDisplayAudienceAnswer {
28
+ audience: TaxDisplayAudience;
29
+ /** The listed country the answer is judged for (`LISTED_COUNTRY_CUSTOMER` only); else null. */
30
+ countryCode: string | null;
31
+ /** What this shopper is shown, by the rule the storefront applies. Null when `dependsOnStore`. */
32
+ mode: TaxDisplayMode | null;
33
+ /**
34
+ * True only in an organization's workspace, for an answer that falls back to "prices include
35
+ * tax": each member store keeps its own, so there is no one answer.
36
+ */
37
+ dependsOnStore: boolean;
38
+ }
39
+ /** A policy and who it shows which tax figure, as the engine answers it. */
40
+ export interface TaxDisplayPolicyView extends TaxDisplayPolicy {
41
+ /** The store's own storage mode, the policy's last fallback. */
42
+ pricesIncludeTax: boolean;
43
+ /**
44
+ * Visitor, retail customer, B2B or trade customer, then a customer in the FIRST listed country
45
+ * (absent while none is listed). The same rule decides the storefront's prices and the prices an
46
+ * order's emails, receipts and invoices show its customer.
47
+ */
48
+ audiences: TaxDisplayAudienceAnswer[];
49
+ }
50
+ /**
51
+ * The ACTIVE store's price-display policy (`admin.tax.displayPolicy`). Reading needs any
52
+ * administrator permission on the store; writing needs `UpdateChannel` (the policy is stored on
53
+ * the channel and written through core `updateChannel`).
54
+ *
55
+ * The engine owns the rule: who sees what is never worked out in the client. Ask {@link preview}
56
+ * for a policy the merchant has not saved.
57
+ */
58
+ export interface TaxDisplayPolicyModule {
59
+ /**
60
+ * The policy the storefront applies and who it shows which figure. For a store that inherits
61
+ * `settings.tax_display` from its organization this is the organization's policy. An unreadable
62
+ * stored value reads as its default (`channel` / `inherit` / no countries); a stored choice is
63
+ * read trimmed and lower-cased, as the storefront reads it.
64
+ *
65
+ * @effect read
66
+ */
67
+ get(options?: Call): Promise<TaxDisplayPolicyView>;
68
+ /**
69
+ * Who `policy` WOULD show which figure on this store, without saving anything.
70
+ *
71
+ * Refused `CHANNEL_SETTINGS_INVALID` (`ValidationError`, one `details[]` entry per field named
72
+ * `customFields.<field>`) for a policy the save would refuse: a choice that is not exactly one of
73
+ * the values above, a country code that is not two letters, a country listed twice, or more than
74
+ * 300 countries.
75
+ *
76
+ * @effect read
77
+ */
78
+ preview(policy: TaxDisplayPolicy, options?: Call): Promise<TaxDisplayPolicyView>;
79
+ /**
80
+ * Replace the whole policy, and answer it as the engine now applies it.
81
+ *
82
+ * Pass all three fields: read with {@link get}, change what you mean to, send it back. An empty
83
+ * country list clears the stored list.
84
+ *
85
+ * Refused, before anything is written, `CHANNEL_SETTINGS_INVALID` (`ValidationError`) for a policy
86
+ * {@link preview} refuses. Refused by the save itself:
87
+ * - `ORGANIZATION_SETTINGS_INHERITED` (`BusinessRuleError`, 422) while the store uses its
88
+ * organization's policy: override it first (`tenant.settingsSources`), or change it in the
89
+ * organization's workspace;
90
+ * - `MANAGED_BY_ORGANIZATION` (`BusinessRuleError`, 422) if the organization manages the group;
91
+ * - `FORBIDDEN` without `UpdateChannel`.
92
+ *
93
+ * @effect write
94
+ */
95
+ set(policy: TaxDisplayPolicy, options?: Call): Promise<TaxDisplayPolicyView>;
96
+ }
97
+ export declare const TAX_DISPLAY_POLICY_QUERY = "\n query TaxDisplayPolicy {\n taxDisplayPolicy { \n default\n b2b\n countries\n pricesIncludeTax\n audiences {\n audience\n countryCode\n mode\n dependsOnStore\n }\n }\n }\n";
98
+ export declare const PREVIEW_TAX_DISPLAY_POLICY_QUERY = "\n query PreviewTaxDisplayPolicy($input: TaxDisplayPolicyInput!) {\n previewTaxDisplayPolicy(input: $input) { \n default\n b2b\n countries\n pricesIncludeTax\n audiences {\n audience\n countryCode\n mode\n dependsOnStore\n }\n }\n }\n";
99
+ /**
100
+ * The save's first step: the engine judges the policy (the preview's refusal is the save's) and
101
+ * names the channel `updateChannel` must be given, in one request with the save's call options.
102
+ */
103
+ export declare const CHECK_TAX_DISPLAY_POLICY_QUERY = "\n query CheckTaxDisplayPolicy($input: TaxDisplayPolicyInput!) {\n activeChannel { id }\n previewTaxDisplayPolicy(input: $input) { default }\n }\n";
104
+ export declare const SET_TAX_DISPLAY_POLICY_MUTATION = "\n mutation SetTaxDisplayPolicy($input: UpdateChannelInput!) {\n updateChannel(input: $input) {\n ... on Channel { id }\n ... on ErrorResult { errorCode message }\n }\n }\n";
105
+ export declare function createTaxDisplayPolicyModule(transport: Transport): TaxDisplayPolicyModule;
@@ -0,0 +1,84 @@
1
+ import { errorFromErrorResult, isErrorResult, } from '@sixtyninecommerce/core';
2
+ const VIEW_FIELDS = /* GraphQL */ `
3
+ default
4
+ b2b
5
+ countries
6
+ pricesIncludeTax
7
+ audiences {
8
+ audience
9
+ countryCode
10
+ mode
11
+ dependsOnStore
12
+ }
13
+ `;
14
+ export const TAX_DISPLAY_POLICY_QUERY = /* GraphQL */ `
15
+ query TaxDisplayPolicy {
16
+ taxDisplayPolicy { ${VIEW_FIELDS} }
17
+ }
18
+ `;
19
+ export const PREVIEW_TAX_DISPLAY_POLICY_QUERY = /* GraphQL */ `
20
+ query PreviewTaxDisplayPolicy($input: TaxDisplayPolicyInput!) {
21
+ previewTaxDisplayPolicy(input: $input) { ${VIEW_FIELDS} }
22
+ }
23
+ `;
24
+ /**
25
+ * The save's first step: the engine judges the policy (the preview's refusal is the save's) and
26
+ * names the channel `updateChannel` must be given, in one request with the save's call options.
27
+ */
28
+ export const CHECK_TAX_DISPLAY_POLICY_QUERY = /* GraphQL */ `
29
+ query CheckTaxDisplayPolicy($input: TaxDisplayPolicyInput!) {
30
+ activeChannel { id }
31
+ previewTaxDisplayPolicy(input: $input) { default }
32
+ }
33
+ `;
34
+ export const SET_TAX_DISPLAY_POLICY_MUTATION = /* GraphQL */ `
35
+ mutation SetTaxDisplayPolicy($input: UpdateChannelInput!) {
36
+ updateChannel(input: $input) {
37
+ ... on Channel { id }
38
+ ... on ErrorResult { errorCode message }
39
+ }
40
+ }
41
+ `;
42
+ /** Exactly the input the engine takes: no extra keys travel. */
43
+ function inputOf(policy) {
44
+ return { default: policy.default, b2b: policy.b2b, countries: [...policy.countries] };
45
+ }
46
+ export function createTaxDisplayPolicyModule(transport) {
47
+ const get = async (options) => {
48
+ const data = await transport.graphql({ api: 'admin', query: TAX_DISPLAY_POLICY_QUERY }, options);
49
+ return data.taxDisplayPolicy;
50
+ };
51
+ return {
52
+ get,
53
+ async preview(policy, options) {
54
+ const data = await transport.graphql({
55
+ api: 'admin',
56
+ query: PREVIEW_TAX_DISPLAY_POLICY_QUERY,
57
+ variables: { input: inputOf(policy) },
58
+ }, options);
59
+ return data.previewTaxDisplayPolicy;
60
+ },
61
+ async set(policy, options) {
62
+ const input = inputOf(policy);
63
+ const checked = await transport.graphql({ api: 'admin', query: CHECK_TAX_DISPLAY_POLICY_QUERY, variables: { input } }, options);
64
+ const data = await transport.graphql({
65
+ api: 'admin',
66
+ query: SET_TAX_DISPLAY_POLICY_MUTATION,
67
+ variables: {
68
+ input: {
69
+ id: checked.activeChannel.id,
70
+ customFields: {
71
+ taxDisplayDefault: input.default,
72
+ taxDisplayB2b: input.b2b,
73
+ // `null` is the column's "off", and the only value that clears a stored list.
74
+ taxExclusiveCountries: input.countries.length === 0 ? null : JSON.stringify(input.countries),
75
+ },
76
+ },
77
+ },
78
+ }, options);
79
+ if (isErrorResult(data.updateChannel))
80
+ throw errorFromErrorResult(data.updateChannel);
81
+ return get(options);
82
+ },
83
+ };
84
+ }
@@ -1,5 +1,6 @@
1
1
  import { type Page, type Transport } from '@sixtyninecommerce/core';
2
- import type { Call } from '../types.js';
2
+ import type { Call, ListOptions } from '../types.js';
3
+ import { type TaxDisplayPolicyModule } from './display-policy.js';
3
4
  /**
4
5
  * The mapping used when no mapping names the country the money is taxed in.
5
6
  *
@@ -115,10 +116,87 @@ export interface TaxMappingsModule {
115
116
  /** Drop one country's mapping. Silent when there was none. */
116
117
  remove(key: string, countryCode: string, options?: Call): Promise<TaxClass>;
117
118
  }
119
+ /**
120
+ * A platform-wide tax category (`Standard`, `Reduced`, `Zero`): what a tax class maps a country
121
+ * onto, and what a tax rate prices in a zone. Shared by every store.
122
+ */
123
+ export interface TaxCategory {
124
+ id: string;
125
+ name: string;
126
+ /** The category the platform's own tax setup treats as the default. */
127
+ isDefault: boolean;
128
+ createdAt: string;
129
+ updatedAt: string;
130
+ }
131
+ /**
132
+ * A platform-wide tax rate: the percentage a category is taxed at in a zone, optionally only for
133
+ * one customer group.
134
+ */
135
+ export interface TaxRate {
136
+ id: string;
137
+ name: string;
138
+ /** A percentage: `21` is 21 %. Not money. */
139
+ value: number;
140
+ /** A disabled rate is never applied. */
141
+ enabled: boolean;
142
+ category: {
143
+ id: string;
144
+ name: string;
145
+ };
146
+ zone: {
147
+ id: string;
148
+ name: string;
149
+ };
150
+ /** Null for a rate that applies to every customer. */
151
+ customerGroup: {
152
+ id: string;
153
+ name: string;
154
+ } | null;
155
+ createdAt: string;
156
+ updatedAt: string;
157
+ }
158
+ /** The platform's tax categories (read-only here; a SuperAdmin writes them through `platform.tax.categories`). */
159
+ export interface TaxCategoriesModule {
160
+ /**
161
+ * Every tax category, in id order. Reading needs `ReadTaxCategory`, which every store role holds.
162
+ *
163
+ * A `Page`: walk it (`for await`, or `.next()` until null) for the COMPLETE list. Nothing is cut
164
+ * at a fixed size; every following page keeps the same order and per-call options.
165
+ *
166
+ * @effect read
167
+ */
168
+ list(options?: ListOptions): Promise<Page<TaxCategory>>;
169
+ }
170
+ /** The platform's tax rates (read-only here; a SuperAdmin writes them through `platform.tax.rates`). */
171
+ export interface TaxRatesModule {
172
+ /**
173
+ * Every tax rate, in id order, with its category, zone and customer group. Reading needs
174
+ * `ReadTaxRate`, which every store role holds.
175
+ *
176
+ * A `Page`: walk it (`for await`, or `.next()` until null) for the COMPLETE list. Nothing is cut
177
+ * at a fixed size (the dashboard used to stop at 100); every following page keeps the same
178
+ * order and per-call options.
179
+ *
180
+ * @effect read
181
+ */
182
+ list(options?: ListOptions): Promise<Page<TaxRate>>;
183
+ }
118
184
  export interface TaxModule {
119
185
  classes: TaxClassesModule;
120
186
  mappings: TaxMappingsModule;
187
+ /** The platform-wide tax categories every store shares. */
188
+ categories: TaxCategoriesModule;
189
+ /** The platform-wide tax rates every store shares. */
190
+ rates: TaxRatesModule;
191
+ /** Who the store shows prices with or without tax, saved or previewed. */
192
+ displayPolicy: TaxDisplayPolicyModule;
121
193
  }
194
+ /** A {@link TaxCategory} as every read and write answers it (`platform.tax` reuses it). */
195
+ export declare const TAX_CATEGORY_FIELDS = "\n id\n name\n isDefault\n createdAt\n updatedAt\n";
196
+ /** A {@link TaxRate} as every read and write answers it (`platform.tax` reuses it). */
197
+ export declare const TAX_RATE_FIELDS = "\n id\n name\n value\n enabled\n category { id name }\n zone { id name }\n customerGroup { id name }\n createdAt\n updatedAt\n";
198
+ export declare const TAX_CATEGORIES_QUERY = "\n query TaxCategories($options: TaxCategoryListOptions) {\n taxCategories(options: $options) {\n items { \n id\n name\n isDefault\n createdAt\n updatedAt\n }\n totalItems\n }\n }\n";
199
+ export declare const TAX_RATES_QUERY = "\n query TaxRates($options: TaxRateListOptions) {\n taxRates(options: $options) {\n items { \n id\n name\n value\n enabled\n category { id name }\n zone { id name }\n customerGroup { id name }\n createdAt\n updatedAt\n }\n totalItems\n }\n }\n";
122
200
  export declare const TAX_CLASSES_QUERY = "\n query TaxClasses {\n taxClasses { \n id\n key\n label\n mappings {\n countryCode\n taxCategoryId\n taxCategory {\n id\n name\n isDefault\n }\n }\n }\n }\n";
123
201
  export declare const TAX_CLASS_QUERY = "\n query TaxClass($key: String!) {\n taxClass(key: $key) { \n id\n key\n label\n mappings {\n countryCode\n taxCategoryId\n taxCategory {\n id\n name\n isDefault\n }\n }\n }\n }\n";
124
202
  export declare const UPSERT_TAX_CLASS_MUTATION = "\n mutation UpsertTaxClass($input: UpsertTaxClassInput!) {\n upsertTaxClass(input: $input) { \n id\n key\n label\n mappings {\n countryCode\n taxCategoryId\n taxCategory {\n id\n name\n isDefault\n }\n }\n }\n }\n";
package/dist/tax/index.js CHANGED
@@ -1,4 +1,6 @@
1
1
  import { createPage } from '@sixtyninecommerce/core';
2
+ import { vendureListPage } from '../catalog/types.js';
3
+ import { createTaxDisplayPolicyModule } from './display-policy.js';
2
4
  /**
3
5
  * The mapping used when no mapping names the country the money is taxed in.
4
6
  *
@@ -8,6 +10,49 @@ import { createPage } from '@sixtyninecommerce/core';
8
10
  * the same one read two ways.
9
11
  */
10
12
  export const TAX_CLASS_FALLBACK_COUNTRY = '*';
13
+ /** A {@link TaxCategory} as every read and write answers it (`platform.tax` reuses it). */
14
+ export const TAX_CATEGORY_FIELDS = /* GraphQL */ `
15
+ id
16
+ name
17
+ isDefault
18
+ createdAt
19
+ updatedAt
20
+ `;
21
+ /** A {@link TaxRate} as every read and write answers it (`platform.tax` reuses it). */
22
+ export const TAX_RATE_FIELDS = /* GraphQL */ `
23
+ id
24
+ name
25
+ value
26
+ enabled
27
+ category { id name }
28
+ zone { id name }
29
+ customerGroup { id name }
30
+ createdAt
31
+ updatedAt
32
+ `;
33
+ export const TAX_CATEGORIES_QUERY = /* GraphQL */ `
34
+ query TaxCategories($options: TaxCategoryListOptions) {
35
+ taxCategories(options: $options) {
36
+ items { ${TAX_CATEGORY_FIELDS} }
37
+ totalItems
38
+ }
39
+ }
40
+ `;
41
+ export const TAX_RATES_QUERY = /* GraphQL */ `
42
+ query TaxRates($options: TaxRateListOptions) {
43
+ taxRates(options: $options) {
44
+ items { ${TAX_RATE_FIELDS} }
45
+ totalItems
46
+ }
47
+ }
48
+ `;
49
+ /**
50
+ * Vendure's list queries add no ORDER BY of their own, and `skip/take` over an unordered query
51
+ * can repeat or skip rows between two requests. Every list here is ordered by id, the one unique
52
+ * key a sort can name (a GraphQL sort input applies its fields in the SCHEMA's order, where `id`
53
+ * comes first, so `{ name, id }` is id order too), so a walk answers each row exactly once.
54
+ */
55
+ const BY_ID = { id: 'ASC' };
11
56
  const TAX_CLASS_FIELDS = /* GraphQL */ `
12
57
  id
13
58
  key
@@ -56,6 +101,7 @@ export const REMOVE_TAX_CLASS_MAPPING_MUTATION = /* GraphQL */ `
56
101
  `;
57
102
  export function createTaxModule(transport) {
58
103
  return {
104
+ displayPolicy: createTaxDisplayPolicyModule(transport),
59
105
  classes: {
60
106
  async list(options) {
61
107
  const data = await transport.graphql({ api: 'admin', query: TAX_CLASSES_QUERY }, options);
@@ -79,6 +125,12 @@ export function createTaxModule(transport) {
79
125
  return data.deleteTaxClass;
80
126
  },
81
127
  },
128
+ categories: {
129
+ list: (options) => vendureListPage(transport, TAX_CATEGORIES_QUERY, 'taxCategories', (skip, take) => ({ options: { skip, take, sort: BY_ID } }), options),
130
+ },
131
+ rates: {
132
+ list: (options) => vendureListPage(transport, TAX_RATES_QUERY, 'taxRates', (skip, take) => ({ options: { skip, take, sort: BY_ID } }), options),
133
+ },
82
134
  mappings: {
83
135
  async set(key, countryCode, taxCategoryId, options) {
84
136
  const data = await transport.graphql({
@@ -0,0 +1,102 @@
1
+ import type { Transport } from '@sixtyninecommerce/core';
2
+ import type { Call } from '../types.js';
3
+ /**
4
+ * The look of every email (and the PDF colours) the active store sends, as the engine applies it.
5
+ *
6
+ * The four choice fields name a member of a fixed set, which the engine checks on `set`:
7
+ * `fontFamily` `system` | `georgia` | `arial` | `verdana`; `logoPosition` `center` | `left`;
8
+ * `logoVariant` `light` | `dark` | `none` (which Business profile logo heads the email);
9
+ * `buttonStyle` `filled` | `outline`. They are typed `string` because a store can hold a value
10
+ * from before that check, which `get` answers as stored and `set` accepts back unchanged.
11
+ */
12
+ export interface EmailStyle {
13
+ /** The active store. The style read is always the active store's, also while it inherits. */
14
+ channelId: string;
15
+ /**
16
+ * Buttons and links. Each colour is a hex (`#1a2b3c`, 3 to 8 digits), `rgb(r, g, b)`, a colour
17
+ * name or `transparent`.
18
+ */
19
+ accentColor: string;
20
+ /** The outer background; `transparent` lets a mail client's dark mode show through. */
21
+ backgroundColor: string;
22
+ /** The content area's background. */
23
+ contentBgColor: string;
24
+ textColor: string;
25
+ mutedTextColor: string;
26
+ fontFamily: string;
27
+ /** Pixels. */
28
+ headingFontSize: number;
29
+ /** Pixels. */
30
+ bodyFontSize: number;
31
+ logoPosition: string;
32
+ /** Pixels. */
33
+ logoMaxWidth: number;
34
+ logoVariant: string;
35
+ /** A button's corner radius, in pixels. */
36
+ borderRadius: number;
37
+ /** The content column's width, in pixels. */
38
+ contentWidth: number;
39
+ buttonStyle: string;
40
+ }
41
+ /**
42
+ * The style fields a `set` changes; an omitted field keeps its value. The sizes are whole pixels
43
+ * (GraphQL `Int`). `channelId` is not an input: `set` leaves it out, so `set({ ...style, … })`
44
+ * with a style `get` answered works.
45
+ */
46
+ export type EmailStylePatch = Partial<Omit<EmailStyle, 'channelId'>>;
47
+ /**
48
+ * `admin.tenant.emailStyle` — the active store's email style (part of the `settings.email` group).
49
+ * Always the ACTIVE channel; no channel argument.
50
+ *
51
+ * **A store that takes `settings.email` from its organization** (`admin.tenant.settingsSources`:
52
+ * locked, or inheritable and not overridden) sends its organization's style, and `get` answers
53
+ * that one. `set` then refuses any change; sending back what `get` answered is accepted and
54
+ * changes nothing. `admin.tenant.settingsSources.override('settings.email')` first to keep a style
55
+ * of the store's own.
56
+ */
57
+ export interface EmailStyleModule {
58
+ /**
59
+ * The style the store's emails use: its own, its organization's while it inherits, or the
60
+ * platform's defaults while it has saved none. Needs `ReadSettings`.
61
+ *
62
+ * @effect read
63
+ * @permission ReadSettings
64
+ */
65
+ get(options?: Call): Promise<EmailStyle>;
66
+ /**
67
+ * Change the fields `patch` names, and answer the whole style as the engine now stores it. The
68
+ * next email the store sends uses it; emails already sent keep theirs.
69
+ *
70
+ * **Coded refusals:**
71
+ * - `EMAIL_STYLE_COLOR_INVALID` → `ValidationError` (400): a colour that is not a hex, `rgb(…)`,
72
+ * colour name or `transparent`. The message names the field.
73
+ * - `EMAIL_STYLE_FONT_FAMILY_INVALID`, `EMAIL_STYLE_LOGO_POSITION_INVALID`,
74
+ * `EMAIL_STYLE_BUTTON_STYLE_INVALID`, `EMAIL_LOGO_VARIANT_INVALID` → `ValidationError` (400):
75
+ * a choice outside its set (see {@link EmailStyle}). Sending back the value the store holds
76
+ * passes, even one from before the check.
77
+ * - `BAD_USER_INPUT` → `ValidationError` (400): a key that is not a style field, or a value of
78
+ * the wrong type (a size that is not a whole number). The message names it.
79
+ * - `MANAGED_BY_ORGANIZATION` → `BusinessRuleError` (422): a changed field while the
80
+ * organization locks `settings.email`.
81
+ * - `ORGANIZATION_SETTINGS_INHERITED` → `BusinessRuleError` (422): a changed field while the
82
+ * store inherits `settings.email`; `tenant.settingsSources.override` it first.
83
+ * - `FORBIDDEN` → `PermissionDeniedError` (403): the credential lacks `UpdateSettings`.
84
+ *
85
+ * The sizes have no engine bounds yet; a UI should keep its own.
86
+ *
87
+ * @effect write
88
+ * @permission UpdateSettings
89
+ */
90
+ set(patch: EmailStylePatch, options?: Call): Promise<EmailStyle>;
91
+ }
92
+ /** The style fields, in the order the engine's input lists them. */
93
+ export declare const EMAIL_STYLE_FIELDS = "\n channelId\n accentColor\n backgroundColor\n contentBgColor\n textColor\n mutedTextColor\n fontFamily\n headingFontSize\n bodyFontSize\n logoPosition\n logoMaxWidth\n logoVariant\n borderRadius\n contentWidth\n buttonStyle\n";
94
+ export declare const EMAIL_STYLE_QUERY = "\n query EmailStyle {\n emailStyleConfig { \n channelId\n accentColor\n backgroundColor\n contentBgColor\n textColor\n mutedTextColor\n fontFamily\n headingFontSize\n bodyFontSize\n logoPosition\n logoMaxWidth\n logoVariant\n borderRadius\n contentWidth\n buttonStyle\n }\n }\n";
95
+ export declare const SET_EMAIL_STYLE_MUTATION = "\n mutation SetEmailStyle($input: UpdateEmailStyleConfigInput!) {\n updateEmailStyleConfig(input: $input) { \n channelId\n accentColor\n backgroundColor\n contentBgColor\n textColor\n mutedTextColor\n fontFamily\n headingFontSize\n bodyFontSize\n logoPosition\n logoMaxWidth\n logoVariant\n borderRadius\n contentWidth\n buttonStyle\n }\n }\n";
96
+ /**
97
+ * The patch as the engine's `UpdateEmailStyleConfigInput` takes it. Every other key goes through
98
+ * as given, so the engine refuses a misspelt or unknown one (`BAD_USER_INPUT`) instead of the SDK
99
+ * dropping it and answering success; `channelId` alone is left out (see {@link EmailStylePatch}).
100
+ */
101
+ export declare function emailStyleInputOf(patch: EmailStylePatch): Record<string, unknown>;
102
+ export declare function createEmailStyleModule(transport: Transport): EmailStyleModule;
@@ -0,0 +1,72 @@
1
+ /** The style fields, in the order the engine's input lists them. */
2
+ export const EMAIL_STYLE_FIELDS = /* GraphQL */ `
3
+ channelId
4
+ accentColor
5
+ backgroundColor
6
+ contentBgColor
7
+ textColor
8
+ mutedTextColor
9
+ fontFamily
10
+ headingFontSize
11
+ bodyFontSize
12
+ logoPosition
13
+ logoMaxWidth
14
+ logoVariant
15
+ borderRadius
16
+ contentWidth
17
+ buttonStyle
18
+ `;
19
+ export const EMAIL_STYLE_QUERY = /* GraphQL */ `
20
+ query EmailStyle {
21
+ emailStyleConfig { ${EMAIL_STYLE_FIELDS} }
22
+ }
23
+ `;
24
+ export const SET_EMAIL_STYLE_MUTATION = /* GraphQL */ `
25
+ mutation SetEmailStyle($input: UpdateEmailStyleConfigInput!) {
26
+ updateEmailStyleConfig(input: $input) { ${EMAIL_STYLE_FIELDS} }
27
+ }
28
+ `;
29
+ function fromWire(wire) {
30
+ return {
31
+ channelId: String(wire.channelId),
32
+ accentColor: wire.accentColor,
33
+ backgroundColor: wire.backgroundColor,
34
+ contentBgColor: wire.contentBgColor,
35
+ textColor: wire.textColor,
36
+ mutedTextColor: wire.mutedTextColor,
37
+ fontFamily: wire.fontFamily,
38
+ headingFontSize: wire.headingFontSize,
39
+ bodyFontSize: wire.bodyFontSize,
40
+ logoPosition: wire.logoPosition,
41
+ logoMaxWidth: wire.logoMaxWidth,
42
+ logoVariant: wire.logoVariant,
43
+ borderRadius: wire.borderRadius,
44
+ contentWidth: wire.contentWidth,
45
+ buttonStyle: wire.buttonStyle,
46
+ };
47
+ }
48
+ /**
49
+ * The patch as the engine's `UpdateEmailStyleConfigInput` takes it. Every other key goes through
50
+ * as given, so the engine refuses a misspelt or unknown one (`BAD_USER_INPUT`) instead of the SDK
51
+ * dropping it and answering success; `channelId` alone is left out (see {@link EmailStylePatch}).
52
+ */
53
+ export function emailStyleInputOf(patch) {
54
+ const { channelId: _readOnly, ...input } = patch;
55
+ return input;
56
+ }
57
+ export function createEmailStyleModule(transport) {
58
+ return {
59
+ async get(options) {
60
+ const data = await transport.graphql({ api: 'admin', query: EMAIL_STYLE_QUERY }, options);
61
+ return fromWire(data.emailStyleConfig);
62
+ },
63
+ async set(patch, options) {
64
+ const data = await transport.graphql({
65
+ api: 'admin',
66
+ query: SET_EMAIL_STYLE_MUTATION,
67
+ variables: { input: emailStyleInputOf(patch) },
68
+ }, options);
69
+ return fromWire(data.updateEmailStyleConfig);
70
+ },
71
+ };
72
+ }