@jetshop/template-trend 5.17.0-alpha.f7018eb5 → 6.0.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 (176) hide show
  1. package/.eslintrc +9 -1
  2. package/cypress/plugins/index.js +4 -4
  3. package/package.json +10 -12
  4. package/schema.graphql +1649 -1716
  5. package/src/components/CategoryPage/Filters/BooleanFilters.js +1 -0
  6. package/src/components/Layout/Footer/FooterLinks.js +1 -1
  7. package/src/components/Layout/Header/CategoryMenu/CategoryMenuContainer.js +0 -1
  8. package/src/components/Layout/Header/Header.js +1 -2
  9. package/src/components/MyPages/CustomerNameHeader.js +1 -1
  10. package/src/components/MyPages/MyPagesStartPage.js +1 -1
  11. package/src/components/NavigationTree/NavTree.js +2 -1
  12. package/src/components/ProductList/AddToCart.js +1 -1
  13. package/src/components/ProductList/Favourites.js +1 -0
  14. package/src/components/ProductList/ProductLists.gql +8 -0
  15. package/src/components/ProductPage/AddToCart/AddToCartForm.js +6 -4
  16. package/src/components/ProductPage/PriceHistory.js +1 -1
  17. package/src/components/ProductPage/ProductPageFragment.gql +1 -0
  18. package/src/components/SearchPage/EmptySearchResults.js +1 -1
  19. package/src/components/StartPage/StartPage.js +1 -1
  20. package/src/components/Store/Store.js +1 -1
  21. package/src/components/StoreLocator/StoreLocator.js +2 -1
  22. package/src/components/ui/Button.js +1 -1
  23. package/src/theme-variables.js +2 -2
  24. package/translations/default.json +741 -6
  25. package/.linaria-cache/packages/template-trend/src/components/Auth/LogInPage.linaria.css +0 -4
  26. package/.linaria-cache/packages/template-trend/src/components/Auth/Signup/Address.linaria.css +0 -1
  27. package/.linaria-cache/packages/template-trend/src/components/Auth/Signup/CustomerType.linaria.css +0 -1
  28. package/.linaria-cache/packages/template-trend/src/components/Auth/Signup/LoginFields.linaria.css +0 -1
  29. package/.linaria-cache/packages/template-trend/src/components/Auth/Signup/SignUpPage.linaria.css +0 -2
  30. package/.linaria-cache/packages/template-trend/src/components/Auth/UI/Form.linaria.css +0 -2
  31. package/.linaria-cache/packages/template-trend/src/components/Cart/CartButton.linaria.css +0 -2
  32. package/.linaria-cache/packages/template-trend/src/components/Cart/CartFlyout.linaria.css +0 -7
  33. package/.linaria-cache/packages/template-trend/src/components/Cart/CartItem.linaria.css +0 -8
  34. package/.linaria-cache/packages/template-trend/src/components/Cart/FreeShipping.linaria.css +0 -2
  35. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/CategoryHeader.linaria.css +0 -8
  36. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/Filters/ActiveFilters.linaria.css +0 -6
  37. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/Filters/Filter.linaria.css +0 -4
  38. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/Filters/FilterDrawer.linaria.css +0 -4
  39. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/Filters/FilterDropdownMenu.linaria.css +0 -1
  40. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/Filters/Mobile/ActiveCarot.linaria.css +0 -1
  41. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/Filters/Mobile/FilterButton.linaria.css +0 -5
  42. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/Filters/Mobile/ListAccordion.linaria.css +0 -1
  43. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/Filters/Mobile/shared/styles.linaria.css +0 -1
  44. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/Filters/RangeFilters.linaria.css +0 -2
  45. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/ProductCard.linaria.css +0 -1
  46. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/ProductGrid.linaria.css +0 -2
  47. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/ProductGridWindow.linaria.css +0 -2
  48. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/StandardCategoryPage.linaria.css +0 -3
  49. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/WindowedCategoryPage.linaria.css +0 -4
  50. package/.linaria-cache/packages/template-trend/src/components/ContentPage/ContentPage.linaria.css +0 -5
  51. package/.linaria-cache/packages/template-trend/src/components/ContentPage/SubPageNavigation.linaria.css +0 -4
  52. package/.linaria-cache/packages/template-trend/src/components/CookieConsent.linaria.css +0 -1
  53. package/.linaria-cache/packages/template-trend/src/components/Forms/GlobalError.linaria.css +0 -1
  54. package/.linaria-cache/packages/template-trend/src/components/Forms/Input.linaria.css +0 -4
  55. package/.linaria-cache/packages/template-trend/src/components/Forms/InputStatus.linaria.css +0 -3
  56. package/.linaria-cache/packages/template-trend/src/components/Forms/Success.linaria.css +0 -1
  57. package/.linaria-cache/packages/template-trend/src/components/Layout/Container.linaria.css +0 -1
  58. package/.linaria-cache/packages/template-trend/src/components/Layout/Content/index.linaria.css +0 -1
  59. package/.linaria-cache/packages/template-trend/src/components/Layout/Footer/Footer.linaria.css +0 -4
  60. package/.linaria-cache/packages/template-trend/src/components/Layout/Footer/SocialLinks.linaria.css +0 -2
  61. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/Categories/MobileCategories.linaria.css +0 -6
  62. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/CategoryMenu/CategoryMenu.linaria.css +0 -1
  63. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/CategoryMenu/CategoryMenuContainer.linaria.css +0 -2
  64. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/CategoryMenu/SubMenuSection.linaria.css +0 -2
  65. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/CategoryMenu/SubMenuWrapper.linaria.css +0 -5
  66. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/ChannelSelector/ChannelSelector.linaria.css +0 -2
  67. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/ChannelSelector/ChannelSelectorModal.linaria.css +0 -2
  68. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/ChannelSelector/Selector.linaria.css +0 -5
  69. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/Header.linaria.css +0 -7
  70. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/Logo.linaria.css +0 -1
  71. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/LogoSearchBar.linaria.css +0 -1
  72. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/MobileMenu.linaria.css +0 -6
  73. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/RecommendedChannel/ChannelBanner.linaria.css +0 -5
  74. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/RecommendedChannel/RecommendedChannelSelector.linaria.css +0 -9
  75. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/SearchBar.linaria.css +0 -3
  76. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/SearchButton.linaria.css +0 -1
  77. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/TopNav.linaria.css +0 -1
  78. package/.linaria-cache/packages/template-trend/src/components/Layout/MaxWidth.linaria.css +0 -1
  79. package/.linaria-cache/packages/template-trend/src/components/Layout/Notifications.linaria.css +0 -1
  80. package/.linaria-cache/packages/template-trend/src/components/LoadingPage.linaria.css +0 -1
  81. package/.linaria-cache/packages/template-trend/src/components/MyPages/CustomerNameHeader.linaria.css +0 -1
  82. package/.linaria-cache/packages/template-trend/src/components/MyPages/DeleteAccount.linaria.css +0 -1
  83. package/.linaria-cache/packages/template-trend/src/components/MyPages/MyPages.linaria.css +0 -1
  84. package/.linaria-cache/packages/template-trend/src/components/MyPages/MyPagesSidebar.linaria.css +0 -1
  85. package/.linaria-cache/packages/template-trend/src/components/MyPages/MyPagesStartPage.linaria.css +0 -2
  86. package/.linaria-cache/packages/template-trend/src/components/MyPages/Orders/ListOrder.linaria.css +0 -1
  87. package/.linaria-cache/packages/template-trend/src/components/MyPages/Orders/OrderDetail/ListDetail.linaria.css +0 -4
  88. package/.linaria-cache/packages/template-trend/src/components/MyPages/Orders/OrderDetail/OrderTotals.linaria.css +0 -1
  89. package/.linaria-cache/packages/template-trend/src/components/MyPages/Orders/OrderDetail/ShippingPayment.linaria.css +0 -1
  90. package/.linaria-cache/packages/template-trend/src/components/MyPages/Orders/OrderListPage.linaria.css +0 -1
  91. package/.linaria-cache/packages/template-trend/src/components/MyPages/ProfileDeliveryAddresses.linaria.css +0 -1
  92. package/.linaria-cache/packages/template-trend/src/components/MyPages/ProfilePage.linaria.css +0 -4
  93. package/.linaria-cache/packages/template-trend/src/components/NavigationTree/NavTree.linaria.css +0 -2
  94. package/.linaria-cache/packages/template-trend/src/components/Newsletter/NewsletterField.linaria.css +0 -3
  95. package/.linaria-cache/packages/template-trend/src/components/NotFoundPage.linaria.css +0 -1
  96. package/.linaria-cache/packages/template-trend/src/components/Pagination/Pagination.linaria.css +0 -1
  97. package/.linaria-cache/packages/template-trend/src/components/ProductList/AddToCart.linaria.css +0 -1
  98. package/.linaria-cache/packages/template-trend/src/components/ProductList/Favourite.linaria.css +0 -1
  99. package/.linaria-cache/packages/template-trend/src/components/ProductList/Favourites.linaria.css +0 -2
  100. package/.linaria-cache/packages/template-trend/src/components/ProductList/Product.linaria.css +0 -2
  101. package/.linaria-cache/packages/template-trend/src/components/ProductPage/AddToCart/AddToCartForm.linaria.css +0 -3
  102. package/.linaria-cache/packages/template-trend/src/components/ProductPage/AddToCart/ProductToast.linaria.css +0 -9
  103. package/.linaria-cache/packages/template-trend/src/components/ProductPage/Campaigns.linaria.css +0 -2
  104. package/.linaria-cache/packages/template-trend/src/components/ProductPage/ConfigurationSelector.linaria.css +0 -1
  105. package/.linaria-cache/packages/template-trend/src/components/ProductPage/Images/ImageContainer.linaria.css +0 -1
  106. package/.linaria-cache/packages/template-trend/src/components/ProductPage/PackageProduct/IncludedInPackages.linaria.css +0 -1
  107. package/.linaria-cache/packages/template-trend/src/components/ProductPage/PackageProduct/PackageProduct.linaria.css +0 -2
  108. package/.linaria-cache/packages/template-trend/src/components/ProductPage/PackageProduct/PackageProductItem.linaria.css +0 -1
  109. package/.linaria-cache/packages/template-trend/src/components/ProductPage/PriceHistory.linaria.css +0 -1
  110. package/.linaria-cache/packages/template-trend/src/components/ProductPage/ProductInfo.linaria.css +0 -3
  111. package/.linaria-cache/packages/template-trend/src/components/ProductPage/ProductInfoAccordion.linaria.css +0 -3
  112. package/.linaria-cache/packages/template-trend/src/components/ProductPage/ProductPage.linaria.css +0 -1
  113. package/.linaria-cache/packages/template-trend/src/components/ProductPage/ProductPageLoadingState.linaria.css +0 -3
  114. package/.linaria-cache/packages/template-trend/src/components/ProductPage/RelatedProducts.linaria.css +0 -1
  115. package/.linaria-cache/packages/template-trend/src/components/ProductPage/StockStatus/NotifyWhenBack.linaria.css +0 -5
  116. package/.linaria-cache/packages/template-trend/src/components/ProductPage/StockStatus/StockOrb.linaria.css +0 -1
  117. package/.linaria-cache/packages/template-trend/src/components/ProductPage/StockStatus/StockStatusIndicator.linaria.css +0 -1
  118. package/.linaria-cache/packages/template-trend/src/components/ProductPage/StockStatus/WarehouseStock.linaria.css +0 -2
  119. package/.linaria-cache/packages/template-trend/src/components/ProductPage/VariantSelector.linaria.css +0 -3
  120. package/.linaria-cache/packages/template-trend/src/components/ProductPage/styledComponents.linaria.css +0 -1
  121. package/.linaria-cache/packages/template-trend/src/components/SearchPage/CategoryList.linaria.css +0 -7
  122. package/.linaria-cache/packages/template-trend/src/components/SearchPage/SearchMeta.linaria.css +0 -1
  123. package/.linaria-cache/packages/template-trend/src/components/SearchPage/SearchPage.linaria.css +0 -3
  124. package/.linaria-cache/packages/template-trend/src/components/SearchPage/SearchResults.linaria.css +0 -4
  125. package/.linaria-cache/packages/template-trend/src/components/SearchPage/SearchTerm.linaria.css +0 -1
  126. package/.linaria-cache/packages/template-trend/src/components/SearchPage/WindowedSearchResults.linaria.css +0 -5
  127. package/.linaria-cache/packages/template-trend/src/components/StartPage/Content/Row.linaria.css +0 -3
  128. package/.linaria-cache/packages/template-trend/src/components/StartPage/Content/StartPageCampaign.linaria.css +0 -7
  129. package/.linaria-cache/packages/template-trend/src/components/StartPage/Content/StartPageCategories.linaria.css +0 -3
  130. package/.linaria-cache/packages/template-trend/src/components/StartPage/Content/StartPageHTMLContent.linaria.css +0 -1
  131. package/.linaria-cache/packages/template-trend/src/components/StartPage/Content/StartPageHero.linaria.css +0 -6
  132. package/.linaria-cache/packages/template-trend/src/components/StartPage/Content/StartPageProductGrid.linaria.css +0 -2
  133. package/.linaria-cache/packages/template-trend/src/components/StartPage/StartPage.linaria.css +0 -1
  134. package/.linaria-cache/packages/template-trend/src/components/Store/Store.linaria.css +0 -1
  135. package/.linaria-cache/packages/template-trend/src/components/StoreLocator/StoreList.linaria.css +0 -5
  136. package/.linaria-cache/packages/template-trend/src/components/StoreLocator/StoreLocator.linaria.css +0 -5
  137. package/.linaria-cache/packages/template-trend/src/components/StoreLocator/StoreMap.linaria.css +0 -1
  138. package/.linaria-cache/packages/template-trend/src/components/StoreLocator/StoreMarker.linaria.css +0 -1
  139. package/.linaria-cache/packages/template-trend/src/components/StoreLocator/StoreSearch.linaria.css +0 -1
  140. package/.linaria-cache/packages/template-trend/src/components/StoreLocator/UserLocation.linaria.css +0 -1
  141. package/.linaria-cache/packages/template-trend/src/components/ui/Badge.linaria.css +0 -1
  142. package/.linaria-cache/packages/template-trend/src/components/ui/Button.linaria.css +0 -4
  143. package/.linaria-cache/packages/template-trend/src/components/ui/CloseButton.linaria.css +0 -1
  144. package/.linaria-cache/packages/template-trend/src/components/ui/Headings.linaria.css +0 -2
  145. package/.linaria-cache/packages/template-trend/src/components/ui/Spinner.linaria.css +0 -1
  146. package/.linaria-cache/packages/template-trend/src/fonts/loadFontCss.linaria.css +0 -1
  147. package/.linaria-cache/packages/template-trend/src/globalStyles.linaria.css +0 -1
  148. package/.linaria-cache/packages/ui/Breadcrumbs/Breadcrumbs.linaria.css +0 -2
  149. package/.linaria-cache/packages/ui/Button/Button.linaria.css +0 -2
  150. package/.linaria-cache/packages/ui/Button/SecondaryButton.linaria.css +0 -1
  151. package/.linaria-cache/packages/ui/Button/TrendButton.linaria.css +0 -1
  152. package/.linaria-cache/packages/ui/ChannelSelector/ChannelSelector.linaria.css +0 -3
  153. package/.linaria-cache/packages/ui/ChannelSelector/ChannelSelectorButtons.linaria.css +0 -2
  154. package/.linaria-cache/packages/ui/ChannelSelector/LargeSelector.linaria.css +0 -1
  155. package/.linaria-cache/packages/ui/ChannelSelector/MiniSelector.linaria.css +0 -1
  156. package/.linaria-cache/packages/ui/Checkbox/Checkbox.linaria.css +0 -4
  157. package/.linaria-cache/packages/ui/Checkbox/CheckboxGroup.linaria.css +0 -3
  158. package/.linaria-cache/packages/ui/DropdownMenu/DropdownMenu.linaria.css +0 -2
  159. package/.linaria-cache/packages/ui/ErrorBoundary/Generic.linaria.css +0 -1
  160. package/.linaria-cache/packages/ui/Gallery/Gallery.linaria.css +0 -2
  161. package/.linaria-cache/packages/ui/JetshopText.linaria.css +0 -1
  162. package/.linaria-cache/packages/ui/Loading/LoadingBar.linaria.css +0 -2
  163. package/.linaria-cache/packages/ui/Modal/Drawer/Drawer.linaria.css +0 -1
  164. package/.linaria-cache/packages/ui/Modal/ModalProvider.linaria.css +0 -1
  165. package/.linaria-cache/packages/ui/Modal/ModalRoot.linaria.css +0 -1
  166. package/.linaria-cache/packages/ui/Pagination/Pagination.linaria.css +0 -1
  167. package/.linaria-cache/packages/ui/Pagination/usePagination.linaria.css +0 -1
  168. package/.linaria-cache/packages/ui/PreOrderDateSelector/PreOrderDateSelector.linaria.css +0 -1
  169. package/.linaria-cache/packages/ui/Price/Price.linaria.css +0 -4
  170. package/.linaria-cache/packages/ui/ProductList/Badges.linaria.css +0 -7
  171. package/.linaria-cache/packages/ui/ProductSpecifications/ProductSpecifications.linaria.css +0 -1
  172. package/.linaria-cache/packages/ui/Search/SearchField.linaria.css +0 -5
  173. package/.linaria-cache/packages/ui/Search/SearchPage/SearchMeta.linaria.css +0 -1
  174. package/.linaria-cache/packages/ui/Select/Components.linaria.css +0 -10
  175. package/.linaria-cache/packages/ui/Theme/sanitizeCss.linaria.css +0 -1
  176. package/src/components/Forms/ValidationTooltip.js +0 -51
package/schema.graphql CHANGED
@@ -1,84 +1,108 @@
1
- input ActivateExternalCustomerByIdInput {
2
- externalCustomerId: String!
1
+ scalar Uri
2
+
3
+ type CustomStringField implements CustomField {
4
+ value: String!
5
+ type: ProductCustomFieldType
6
+ key: String
7
+ title: String
3
8
  }
4
9
 
5
- type ActivateExternalCustomerByIdResult {
6
- success: Boolean!
7
- token: Token
10
+ enum ProductCustomFieldType {
11
+ STRING
12
+ BOOL
13
+ LIST
14
+ HTML
15
+ MULTI_LEVEL_LIST
8
16
  }
9
17
 
10
- input ActivateExternalCustomerByTokenInput {
11
- externalCustomerToken: String!
18
+ interface CustomField {
19
+ type: ProductCustomFieldType
20
+ key: String
21
+ title: String
12
22
  }
13
23
 
14
- type ActivateExternalCustomerByTokenResult {
15
- success: Boolean!
16
- customer: ExternalCustomer
24
+ type CustomBoolField implements CustomField {
25
+ value: Boolean!
26
+ type: ProductCustomFieldType
27
+ key: String
28
+ title: String
17
29
  }
18
30
 
19
- enum ActivationStatusSource {
20
- PREEXISTING_CUSTOMER
21
- ACTIVATION_REQUIRED
22
- ADDITIONAL_USER_DATA_REQUIRED
23
- NON_EXISTING_CUSTOMER
24
- COUNTRY_NOT_VALID
31
+ type CustomHtmlField implements CustomField {
32
+ value: String!
33
+ type: ProductCustomFieldType
34
+ key: String
35
+ title: String
25
36
  }
26
37
 
27
- input AddMultipleToCartInput {
28
- articleNumber: String!
38
+ type CustomListField implements CustomField {
39
+ value: [String]
40
+ type: ProductCustomFieldType
41
+ key: String
42
+ title: String
43
+ }
29
44
 
30
- """Default value is 1."""
31
- quantity: Int
32
- comments: [InputComment]
33
- configurationIds: [ID]
34
- preOrderDate: DateTime
45
+ type CustomMultiLevelListField implements CustomField {
46
+ items: [CustomMultiLevelListFieldItem]
47
+ type: ProductCustomFieldType
48
+ key: String
49
+ title: String
35
50
  }
36
51
 
37
- input AddToCartInput {
38
- """Not specifying cart id will create new cart."""
39
- cartId: String
40
- articleNumber: String!
52
+ type CustomMultiLevelListFieldItem {
53
+ id: Int!
54
+ parentId: Int
55
+ title: String!
56
+ value: String!
57
+ }
41
58
 
42
- """Default value is 1."""
43
- quantity: Int
44
- comments: [InputComment]
45
- configurationIds: [ID]
46
- preOrderDate: DateTime
59
+ type ListFilter implements Filter {
60
+ items: [ListFilterItem]!
61
+ id: String!
62
+ name: String!
47
63
  }
48
64
 
49
- input AddToCustomerProductListInput {
50
- articleNumber: String!
51
- quantity: Int = 1
52
- description: String
65
+ type ListFilterItem {
66
+ text: String!
67
+ id: String!
68
+ value: String!
69
+ resultCount: Int
53
70
  }
54
71
 
55
- type AlternateRoute {
56
- channelId: Int
57
- culture: String
58
- route: String
59
- alias: String
72
+ interface Filter {
73
+ id: String!
74
+ name: String!
75
+ }
76
+
77
+ type NumericRangeFilter implements Filter {
78
+ min: Decimal!
79
+ max: Decimal!
80
+ id: String!
81
+ name: String!
60
82
  }
61
83
 
84
+ scalar Decimal
85
+
62
86
  type BooleanFilter implements Filter {
63
87
  default: Boolean
64
88
  id: String!
65
89
  name: String!
66
90
  }
67
91
 
68
- input BooleanFilterInput {
92
+ type MultiListFilter implements Filter {
93
+ lists: [MultiListFilterList]!
69
94
  id: String!
70
-
71
- """null is equivalent to excluding the filter."""
72
- value: Boolean
95
+ name: String!
73
96
  }
74
97
 
75
- type BoolValue {
76
- value: Boolean
98
+ type MultiListFilterList {
99
+ id: String!
100
+ name: String!
101
+ items: [ListFilterItem]!
77
102
  }
78
103
 
79
- type BusinessCustomer implements Customer {
80
- organizationId: String @deprecated(reason: "Use `organizationNumber` instead.")
81
- organizationNumber: String
104
+ type PrivateCustomer implements Customer {
105
+ pid: String
82
106
  id: ID!
83
107
  memberId: String
84
108
  email: String
@@ -113,233 +137,109 @@ type BusinessCustomer implements Customer {
113
137
  googleUserId: String
114
138
  }
115
139
 
116
- type Cart {
117
- id: String
118
- totalQuantity: Int
119
- productTotal: Price
120
- productPreviousTotal: Price
121
- discountTotal: Price
122
- aggregatedDiscounts: [Discount]
123
- externalCheckoutUrl: Uri
124
- items: [CartItem]
125
- }
126
-
127
- type CartItem {
140
+ type Language {
128
141
  id: String!
129
- quantity: Int!
130
- articleNumber: String!
131
- images: [ProductImage] @deprecated(reason: "Please use images on product instead.")
132
- subHeading: String
133
- variant: ProductVariant
134
- variantOptionNames: [String]
135
- customerComments: [CartItemComment]
136
- discounts: [Discount]
137
-
138
- """Total price, including discounts"""
139
- total: Price!
140
-
141
- """Total price, excluding discounts"""
142
- previousTotal: Price!
143
-
144
- """Unit price, including discounts"""
145
- unitPrice: Price!
146
-
147
- """Unit price, excluding discounts"""
148
- previousUnitPrice: Price!
142
+ name: String!
143
+ culture: String!
144
+ isDefault: Boolean
145
+ }
149
146
 
150
- """Discount total"""
151
- discount: Price
152
- product: Product
153
- configurations: [SelectedProductConfiguration]
154
- preOrderDate: DateTime
147
+ type CustomerAddress {
148
+ id: Int
149
+ addressName: String
150
+ firstName: String
151
+ lastName: String
152
+ companyAtt: String
153
+ company: String
154
+ department: String
155
+ streetName: String
156
+ co: String
157
+ postalCode: String
158
+ city: String
159
+ municipality: String
160
+ region: String
161
+ country: Country
162
+ phone: String
163
+ mobilePhone: String
155
164
  }
156
165
 
157
- type CartItemComment {
166
+ type Country {
167
+ id: ID!
168
+ code: String
158
169
  name: String
159
- value: String
170
+ isDefault: Boolean
160
171
  }
161
172
 
162
- type CartMutation {
163
- cart: Cart
173
+ type OrderHeaderResult {
174
+ result: [OrderHeader]
175
+ totalResults: Int
164
176
  }
165
177
 
166
- type Category implements Document {
167
- id: Int!
168
- parentId: Int @deprecated(reason: "Use parent.id instead")
169
- name: String!
170
- level: Int!
171
-
172
- """The time interval of the campaign/category"""
173
- activeDateSpan: CategoryActiveDateSpan
174
-
175
- """
176
- Whether or not this category and all its children are considered hidden
177
- """
178
- isHidden: Boolean! @deprecated(reason: "This field should no longer be used and will always be false.")
179
-
180
- """When empty will display the value of the name field"""
181
- mainHeader: String
182
- content: String
183
- externalId: String
184
- externalDiscountId: String
185
- images: [CategoryImage]
178
+ type OrderHeader {
179
+ id: ID!
180
+ orderNumber: String
181
+ status: OrderStatus
182
+ statusTimeline: [OrderStatus]
186
183
 
187
184
  """
188
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
185
+ If this is false, a call to `order` for this order will result in a failure.
189
186
  """
190
- products(first: Paging = 12, offset: Int = 0, orderBy: ProductOrderOptions, orderByDirection: SortDirection, filters: FilterInput): PagedResult
187
+ hasOrderDetails: Boolean
188
+ total: Price
189
+ orderDate: DateTime
190
+ trackingId: String
191
+ currency: Currency
192
+ }
191
193
 
192
- """
193
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
194
- """
195
- head: HtmlHead
194
+ type OrderStatus {
195
+ id: ID
196
+ description: String
197
+ timestamp: DateTime
198
+ }
196
199
 
197
- """
198
- The primary route of this Category. NB: Carries a performance cost, as asking
199
- for this will result in a separate API call in the backend.
200
- """
201
- primaryRoute: Route
202
- breadcrumbText: String
203
- hasSubcategories: Boolean
204
- subcategories: [Category]
205
- parentCategory: Category @deprecated(reason: "Use parent instead")
206
- parent: Category
200
+ """
201
+ The `DateTime` scalar type represents a date and time. `DateTime` expects timestamps to be formatted in accordance with the [ISO-8601](https://en.wikipedia.org/wiki/ISO_8601) standard.
202
+ """
203
+ scalar DateTime
207
204
 
208
- """
209
- A dynamic category has no fixed products; products are dynamically included
210
- based on filters defined on the category in Admin. N.B. Products found on a
211
- dynamic category has no route that includes said category, instead
212
- product.primaryRoute will have to be used.
213
- """
214
- isDynamic: Boolean!
205
+ type Price {
206
+ incVat: Decimal!
207
+ exVat: Decimal!
208
+ vat: Decimal!
209
+ }
215
210
 
216
- """
217
- The category's dynamic filtersNB: Carries a performance cost, as asking for
218
- this will result in a separate API call in the backend.
219
- """
220
- dynamicFiltering: [CategoryDynamicFilter]
221
-
222
- """
223
- Get content data set via the Content Editor. NB: Carries a performance cost,
224
- as asking for this will result in a separate API call in the backend.
225
- """
226
- data: Content
227
-
228
- """
229
- When set to false, the category will be excluded from sitemap. The frontend
230
- implementation should use this value to set meta tags to exclude the category
231
- from being indexed by crawlers. Defaults to true.
232
- """
233
- allowWebIndexing: Boolean
234
- }
235
-
236
- type CategoryActiveDateSpan {
237
- startDate: DateTime
238
- endDate: DateTime
239
- }
240
-
241
- type CategoryAutoCompleteResult {
242
- result: [Category]
243
- }
244
-
245
- type CategoryDynamicFilter {
246
- type: String
247
- value: CategoryDynamicFilterValue
248
- }
249
-
250
- union CategoryDynamicFilterValue = StringValue | ListStringValue | BoolValue
251
-
252
- type CategoryImage {
253
- width: Int
254
- height: Int
255
- url: Uri
256
- }
257
-
258
- type CategorySearchResult {
259
- result: [Category]
260
- totalResults: Int
261
- }
262
-
263
- input ChangeByOneItemQuantityInput {
264
- cartId: String!
265
- itemId: String!
266
- }
267
-
268
- """
269
- Every channel has its own URL and can have different design, selection of
270
- products, prices and own settings for example shipping and payment.
271
- """
272
- type Channel {
273
- id: Int!
211
+ type Currency {
212
+ id: String!
274
213
  name: String
275
- displayName: String
276
- groupName: String
277
214
  isDefault: Boolean
278
- url: Uri
279
- settings: ChannelSettings
280
- languages: [Language]
281
- defaultLanguage: Language
282
- currencies: [Currency]
283
- defaultCurrency: Currency
284
- countries: [Country]
285
-
286
- """
287
- The root url of images, this can be used to build image urls if needed.
288
- """
289
- imageUrl: String
290
-
291
- """This channel requires a user to be authorized."""
292
- requiresAuth: Boolean
293
- }
294
-
295
- type ChannelSettings {
296
- pricesIncVat: Boolean
297
- countrySettings: [CountrySettings]
298
- tracking: Tracking
299
- nostoAccountId: String
215
+ format: CurrencyFormat
300
216
  }
301
217
 
302
- type Consent {
303
- id: ID!
304
- name: String
305
- title: String
306
- text: String
307
- linkText: String
308
- page: Page
309
- isMandatory: Boolean
218
+ type CurrencyFormat {
219
+ culture: String! @deprecated(reason: "For currency formatting to a specific culture, instead use whichever culture makes sense contextually.")
220
+ code: String!
221
+ decimals: Int!
310
222
  }
311
223
 
312
- type Content {
313
- name: String
314
- id: ID!
315
- items: [ContentItem]
316
- tags: [String]
224
+ type CustomerCommunication {
225
+ acceptsEmail: Boolean
226
+ acceptsPostal: Boolean
227
+ acceptsSms: Boolean
317
228
  }
318
229
 
319
- type ContentItem {
230
+ type Store {
231
+ id: Int!
232
+ externalId: String
320
233
  name: String
321
- type: String!
322
- properties(
323
- """
324
- If true image content property will return `ImageValue` instead of a string
325
- """
326
- getImageAsImageValue: Boolean = false
327
- ): [ContentItemProperty]
328
- children: [ContentItem]
329
- }
330
-
331
- type ContentItemProperty {
332
- name: String!
333
- type: String!
334
- valueType: ContentPropertyValueType
335
- value: ContentItemPropertyValue
336
- }
337
-
338
- union ContentItemPropertyValue = StringValue | ImageValue | BoolValue | Product | Category
339
-
340
- enum ContentPropertyValueType {
341
- OBJECT
342
- SCALAR
234
+ city: String
235
+ region: String
236
+ address1: String
237
+ address2: String
238
+ description: String
239
+ other: String
240
+ openHours: String
241
+ contact: String
242
+ coordinates: Coordinates
343
243
  }
344
244
 
345
245
  type Coordinates {
@@ -347,73 +247,49 @@ type Coordinates {
347
247
  longitude: Decimal!
348
248
  }
349
249
 
350
- type Country {
351
- id: ID!
352
- code: String
353
- name: String
354
- isDefault: Boolean
250
+ type CustomerExternalAttribute {
251
+ name: String!
252
+ value: String!
355
253
  }
356
254
 
357
- type CountrySettings {
358
- countryCode: String!
359
- paymentTypes: [paymentType]
255
+ interface Customer {
256
+ id: ID!
257
+ memberId: String
258
+ email: String
360
259
 
361
- """
362
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
363
- """
364
- privateCustomerFields: [CustomerField]
260
+ """Customer id for external system"""
261
+ externalId: String
262
+ subscribedToNewsletter: Boolean @deprecated(reason: "Use communication.acceptsEmail")
263
+ language: Language
264
+ billingAddress: CustomerAddress
265
+ deliveryAddresses: [CustomerAddress]
365
266
 
366
267
  """
367
268
  NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
368
269
  """
369
- businessCustomerFields: [CustomerField]
370
- shipping: Shipping
270
+ orderHeaders(
271
+ """Will fetch all if this is set to 0"""
272
+ first: Int = 0
273
+ offset: Int = 0
274
+ ): OrderHeaderResult
275
+ communication: CustomerCommunication
371
276
 
372
277
  """
373
278
  NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
374
-
375
- This will use localization, and will work well when requesting one `channel`,
376
- but may give unpredictable results when getting multiple channels via `channels`
377
279
  """
378
- privateCustomerConsents: [Consent]
280
+ store: Store
281
+ dynamicContent: String
282
+ externalAttributes: [CustomerExternalAttribute]
379
283
 
380
284
  """
381
285
  NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
382
-
383
- This will use localization, and will work well when requesting one `channel`,
384
- but may give unpredictable results when getting multiple channels via `channels`
385
286
  """
386
- businessCustomerConsents: [Consent]
387
- }
388
-
389
- input CreateCustomerProductListInput {
390
- """The type of list created. Omit this and the default type will be used."""
391
- typeId: Int
392
- name: String!
393
- description: String
394
- }
395
-
396
- type Currency {
397
- id: String!
398
- name: String
399
- isDefault: Boolean
400
- format: CurrencyFormat
401
- }
402
-
403
- type CurrencyFormat {
404
- culture: String! @deprecated(reason: "For currency formatting to a specific culture, instead use whichever culture makes sense contextually.")
405
- code: String!
406
- decimals: Int!
407
- }
408
-
409
- type CustomBoolField implements CustomField {
410
- value: Boolean!
411
- type: ProductCustomFieldType
412
- key: String
413
- title: String
287
+ googleUserId: String
414
288
  }
415
289
 
416
- interface Customer {
290
+ type BusinessCustomer implements Customer {
291
+ organizationId: String @deprecated(reason: "Use `organizationNumber` instead.")
292
+ organizationNumber: String
417
293
  id: ID!
418
294
  memberId: String
419
295
  email: String
@@ -448,416 +324,428 @@ interface Customer {
448
324
  googleUserId: String
449
325
  }
450
326
 
451
- type CustomerAddress {
452
- id: Int
453
- addressName: String
454
- firstName: String
455
- lastName: String
456
- companyAtt: String
457
- company: String
458
- department: String
459
- streetName: String
460
- co: String
461
- postalCode: String
462
- city: String
463
- municipality: String
464
- region: String
465
- country: Country
466
- phone: String
467
- mobilePhone: String
468
- }
469
-
470
- type CustomerCommunication {
471
- acceptsEmail: Boolean
472
- acceptsPostal: Boolean
473
- acceptsSms: Boolean
474
- }
475
-
476
- type CustomerExternalAttribute {
477
- name: String!
478
- value: String!
479
- }
327
+ type Query {
328
+ store(id: Int!): Store
329
+ stores(includeInactive: Boolean! = false): [Store]!
330
+ startPage(id: Int): StartPage
331
+ searchAutoComplete(term: String!): SearchAutoCompleteResult
332
+ search(term: String!): SearchResult
480
333
 
481
- type CustomerField {
482
- id: ID!
483
- required: Boolean!
484
- pattern: String
485
- fields: [CustomerField]
486
- name: ID!
487
- }
334
+ """get product, category or page by path."""
335
+ route(path: String!): Route
336
+ product(articleNumber: String, id: Int, barcode: String): Product
337
+ products(articleNumbers: [String], ids: [Int], barcodes: [String]): [Product]!
488
338
 
489
- type CustomerLoyalty {
490
- bonusChecks: [CustomerLoyaltyBonusCheck]
491
- pointCards: [CustomerLoyaltyPointCard]
492
- discounts(includeRedeemed: Boolean! = false): [CustomerLoyaltyDiscount]
339
+ """Fetch a single page by ID."""
340
+ page(id: Int!): Page
493
341
 
494
342
  """
495
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
343
+ Fetch all non-hidden pages. If you are using nested pages, only root level pages will be returned.
496
344
  """
497
- bonusPoints: CustomerLoyaltyBonusPoints
498
- }
345
+ pages: [Page]!
499
346
 
500
- type CustomerLoyaltyBonusCheck {
501
- externalId: String
502
- name: String
503
- startDate: DateTime
504
- endDate: DateTime
505
- redeemed: Boolean
506
- redeemedOn: DateTime
347
+ """fetch order by id"""
348
+ order(
349
+ """Deprecated, please use the `orderId`-argument"""
350
+ id: Int
351
+ orderId: ID
352
+ ): Order
353
+
354
+ """Fetches my pages content"""
355
+ myPagesContent: MyPagesContent
356
+
357
+ """get customer product list by id, null gets default product list"""
358
+ customerProductList(id: ID, shareToken: String): CustomerProductList
359
+ customerProductLists: [CustomerProductList]!
360
+
361
+ """Fetches customer-unique offers"""
362
+ customerLoyalty: CustomerLoyalty
363
+
364
+ """Lookup a customer by a mobile phone number"""
365
+ customerLookup(phoneNumber: String): Customer
366
+ customer: Customer
507
367
 
508
368
  """
509
- For display purposes, not guaranteed to match up with a currency on the channel.
369
+ Used in the sign up process when the shop has a third party customer repository, e.g. Voyado.
370
+
371
+ Error codes: INVALID_VALUE (if `key` is null), ExternalCustomerLookupFailed
510
372
  """
511
- currency: String
512
- value: Decimal
513
- }
373
+ externalCustomerLookup(key: String): ExternalCustomerResult
514
374
 
515
- type CustomerLoyaltyBonusPoints {
516
- points: Int
375
+ """Get information on person by Key(personal id number or phone number)"""
376
+ personLookup(key: String!): PersonLookup
377
+
378
+ """
379
+ Returns content found, either by a list of content Ids, or filtered by tags. In the case of filtering by ids, not found content Ids are listed as well.
380
+ """
381
+ content(ids: [String], tags: [String]): MultipleContent
382
+
383
+ """get channel by id, null gets default channel"""
384
+ channel(id: String): Channel
385
+
386
+ """get all channels"""
387
+ channels: [Channel]!
388
+
389
+ """get categories by channel id, culture, root and culture"""
390
+ categories(
391
+ """category id of root parent, null or omit means all"""
392
+ root: Int
393
+
394
+ """
395
+ number of levels to traverse in the category tree, null or omit means all
396
+ """
397
+ levels: Int = 1
398
+
399
+ """Deprecated, this argument does not affect the result"""
400
+ includeHidden: Boolean = false
401
+ ): [Category]!
402
+
403
+ """get category by id"""
404
+ category(id: ID!): Category
405
+ cart(id: String): Cart
517
406
  }
518
407
 
519
- type CustomerLoyaltyDiscount {
520
- name: String
521
- description: String
522
- startDate: DateTime
523
- endDate: DateTime
524
- externalData: CustomerLoyaltyDiscountOfferExternalData
408
+ type StartPage implements Document {
409
+ id: Int!
410
+ name: String!
411
+ images: [Image]
412
+ isActive: Boolean
413
+ content: String
414
+ items: [StartPageItem]
525
415
 
526
416
  """
527
417
  NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
528
418
  """
529
- category: Category
530
- isActivatedByDiscountCode: Boolean!
531
- discountCode: String
419
+ head: HtmlHead
420
+
421
+ """The primary route of this StartPage"""
422
+ primaryRoute: Route
423
+ breadcrumbText: String
424
+
425
+ """
426
+ Get content data set via the Content Editor. NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
427
+ """
428
+ data: Content
532
429
  }
533
430
 
534
- type CustomerLoyaltyDiscountOfferExternalData {
535
- name: String
536
- description: String
537
- startDate: DateTime
538
- endDate: DateTime
539
- externalId: String
540
- externalReference: String
541
- heading: String
542
- redeemed: Boolean
543
- redeemedOn: DateTime
544
- imageUrl: String
545
- link: String
431
+ type Image {
432
+ title: String
433
+ url: Uri
434
+ width: Int
435
+ height: Int
546
436
  }
547
437
 
548
- type CustomerLoyaltyPointCard {
549
- externalId: String
550
- name: String
551
- lastStampTime: DateTime
552
- numberOfSlots: Int
553
- numberOfSlotsRemaining: Int
554
- isActive: Boolean
438
+ type StartPageItem {
439
+ id: Int!
440
+ row: Int
441
+ column: Int
442
+ item: StartPageItemObject!
555
443
  }
556
444
 
557
- type CustomerProductList {
558
- id: ID!
559
- shareToken: String
560
- name: String
561
- description: String
445
+ union StartPageItemObject = Product | CustomItem
446
+
447
+ type Product implements Document {
448
+ id: Int!
449
+ articleNumber: String!
450
+ name: String!
451
+ subName: String!
452
+ shortDescription: String!
453
+ description: String!
562
454
 
563
455
  """
564
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
456
+ Product header if it differs from the actual product name, usually displayed instead of the product name in the header tag at the product page.
565
457
  """
566
- type: CustomerProductListType
458
+ mainHeader: String!
459
+ publishedDate: DateTime
567
460
 
568
461
  """
569
462
  NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
570
463
  """
571
- items: [CustomerProductListItem]
572
- }
464
+ canonicalCategory: Category
573
465
 
574
- type CustomerProductListItem {
575
- description: String
576
- quantity: Int
577
- variant: ProductVariant
466
+ """
467
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
468
+ """
469
+ categories(
470
+ """Deprecated, this argument does not affect the result"""
471
+ includeHidden: Boolean = false
472
+ ): [Category]
578
473
 
579
474
  """
580
475
  NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
581
476
  """
582
- product: Product
583
- }
477
+ campaigns: [Category]
478
+ hasVariants: Boolean!
479
+ hasVariantsWithDifferingPrices: Boolean!
480
+ variants: ProductVariants
481
+ images(
482
+ """
483
+ Set this to false if you prefer to manually collate these images with the images found on the Variant.
484
+ """
485
+ includeVariantImages: Boolean = true
584
486
 
585
- type CustomerProductListResult {
586
- success: Boolean
487
+ """
488
+ Limit the number of images you get back. Defaults to null, which will return all images.
489
+ """
490
+ limit: Int
491
+ ): [ProductImage]
587
492
 
588
493
  """
589
494
  NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
590
495
  """
591
- customerProductList: CustomerProductList
592
- }
496
+ relatedProducts: [Product]
593
497
 
594
- type CustomerProductListType {
595
- id: ID!
596
- name: String
597
- }
498
+ """
499
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
500
+ """
501
+ badges: [ProductBadge]
598
502
 
599
- enum CustomerType {
600
- PRIVATE
601
- COMPANY
602
- }
503
+ """
504
+ The current price.
505
+ - Will be a Customer specific price if that Customer has a separate price list.
506
+ - Will be the member price if Customer is logged in and `Product.hasMemberPrice` is true.
507
+ - Will be the non-member price if Customer is not logged in and `Product.hasMemberPrice` is true.
508
+ """
509
+ price: Price
510
+ hidePrice: Boolean
603
511
 
604
- """
605
- Fields that are required to have a value is determined by CustomerFields found in CountrySettings
606
- """
607
- input CustomerUpdateBillingAddressInput {
608
- mobilePhone: String
609
- phone: String
610
- region: String
611
- countryCode: String
612
- city: String
613
- postalCode: String
614
- streetName: String
615
- co: String
616
- department: String
617
- municipality: String
618
- companyAtt: String
619
- company: String
620
- lastName: String
621
- firstName: String
622
- addressName: String
623
- }
512
+ """
513
+ The previous price (i.e. this will be higher than `price` if the product is discounted). Will be a Customer specific previous price, if that Customer has a separate price list.
514
+ """
515
+ previousPrice: Price
624
516
 
625
- input CustomerUpdateConsentInput {
626
- id: String
627
- value: Boolean
628
- }
517
+ """
518
+ Default price for the product in the channel, disregards Customer specific prices.
519
+ """
520
+ defaultPrice: Price
629
521
 
630
- input CustomerUpdateDeliveryAddressInput {
631
- """If this field is left empty, a new DeliveryAddress will be created."""
632
- id: Int
633
- mobilePhone: String
634
- phone: String
635
- region: String
636
- countryCode: String
637
- city: String
638
- postalCode: String
639
- streetName: String
640
- co: String
641
- department: String
642
- municipality: String
643
- companyAtt: String
644
- company: String
645
- lastName: String
646
- firstName: String
647
- addressName: String
648
- }
522
+ """
523
+ Default previous price for the product in the channel, disregards Customer specific prices.
524
+ """
525
+ defaultPreviousPrice: Price
649
526
 
650
- input CustomerUpdateExternalAttribute {
651
- name: String!
652
- value: String!
653
- }
527
+ """Not in use. Always null."""
528
+ recommendedPrice: Price
654
529
 
655
- input CustomerUpdateInput {
656
- pid: String
657
- organizationNumber: String
658
- billingAddress: CustomerUpdateBillingAddressInput!
659
- deliveryAddresses: [CustomerUpdateDeliveryAddressInput]
660
- preferences: CustomerUpdatePreferenceInput
661
- consents: [CustomerUpdateConsentInput]
662
- externalAttributes: [CustomerUpdateExternalAttribute]
663
- dynamicContent: String
664
- }
530
+ """
531
+ The time interval of the discounted price. If the product has variants, the time interval will be that of the variant which price is shown on the product.
532
+ """
533
+ priceDateSpan: ProductPriceDateSpan
665
534
 
666
- input CustomerUpdatePreferenceInput {
667
- type: CustomerUpdatePreferencesCommunicationInput
668
- storeLocationId: Int
669
- }
535
+ """Indicates if this product and its variants has member prices."""
536
+ hasMemberPrice: Boolean
670
537
 
671
- input CustomerUpdatePreferencesCommunicationInput {
672
- acceptsEmail: Boolean
673
- acceptsPostal: Boolean
674
- acceptsSms: Boolean
675
- culture: String
676
- }
538
+ """
539
+ The price a Customer would get if member prices are active and the Customer is logged in.
540
+ - Will be null if `Product.hasMemberPrice` is false.
541
+ - Will be set if `Product.hasMemberPrice` is true.
542
+ """
543
+ memberPrice: Price
677
544
 
678
- """
679
- Responds with a bool value whether the update has been successful or not
680
- """
681
- type CustomerUpdateResponse {
682
- success: Boolean!
683
- }
545
+ """
546
+ Specifies input field(s) for the Customer to populate on the Product that will then carry through to the Order.
547
+ If 'required' is true the Product should not be purchasable until the field is populated.
548
+ """
549
+ customerComments: [ProductComment]
684
550
 
685
- interface CustomField {
686
- type: ProductCustomFieldType
687
- key: String
688
- title: String
689
- }
551
+ """
552
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
553
+ """
554
+ stockStatus: StockStatus
555
+ customFields: [CustomField]
690
556
 
691
- type CustomHtmlField implements CustomField {
692
- value: String!
693
- type: ProductCustomFieldType
694
- key: String
695
- title: String
696
- }
557
+ """
558
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
559
+ """
560
+ warehouseStock(includeInactive: Boolean = false): [Warehouse]
561
+ head: HtmlHead
697
562
 
698
- type CustomItem {
699
- id: Int!
700
- name: String!
701
- content: String
702
- linkUrl: Uri
703
- image: Image
704
- }
563
+ """
564
+ The primary route of this Product. NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
565
+ """
566
+ primaryRoute: Route
567
+ breadcrumbText: String
568
+ recommendedProducts: RecommendedProducts
705
569
 
706
- type CustomListField implements CustomField {
707
- value: [String]
708
- type: ProductCustomFieldType
709
- key: String
710
- title: String
711
- }
570
+ """
571
+ The product is recommended to only be purchasable in multiples of the distributionPackageSize. (Different shops may have different levels of leniency on this rule).
572
+ """
573
+ distributionPackageSize: Int!
574
+ barcode: String
712
575
 
713
- type CustomMultiLevelListField implements CustomField {
714
- items: [CustomMultiLevelListFieldItem]
715
- type: ProductCustomFieldType
716
- key: String
717
- title: String
718
- }
576
+ """
577
+ Configurations on a product are used to assemble a complete product,
578
+
579
+ For example, if the product is a ring then the ring may have two configurations; measures of circumference and choice of engraving
580
+
581
+ In this field, all the configurations of the product will be presented, the configuration name and its various options.
582
+ """
583
+ configurations: [ProductConfiguration]
584
+ hasConfigurations: Boolean!
585
+ hasFamilyMembers: Boolean!
719
586
 
720
- type CustomMultiLevelListFieldItem {
721
- id: Int!
722
- parentId: Int
723
- title: String!
724
- value: String!
725
- }
587
+ """
588
+ Calculates the price of the product based on the configuration choices that's been made. NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
589
+ """
590
+ configurationPrice(options: [ProductConfigurationPriceInput!]): ProductConfigurationPrice
726
591
 
727
- type CustomStringField implements CustomField {
728
- value: String!
729
- type: ProductCustomFieldType
730
- key: String
731
- title: String
732
- }
592
+ """Quantity suffix e.g pcs, box, etc."""
593
+ quantitySuffix: String
594
+ isPreOrder: Boolean
595
+ preOrder: ProductPreOrder
596
+ isPackage: Boolean
733
597
 
734
- """
735
- The `DateTime` scalar type represents a date and time. `DateTime` expects
736
- timestamps to be formatted in accordance with the
737
- [ISO-8601](https://en.wikipedia.org/wiki/ISO_8601) standard.
738
- """
739
- scalar DateTime
598
+ """
599
+ ## Description
600
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
601
+ ## Error Codes
602
+ ### InvalidAmountOfArticleNumbers
603
+ Number of input products doesn't match package products
604
+ ### InvalidArticleNumber
605
+ Product or variant article number doesn't match any products
606
+ ### UnableToGetPackagePrice
607
+ Failed to calculate package price
608
+
609
+ """
610
+ package(articleNumbers: [PackagePriceInput]): Package
740
611
 
741
- scalar Decimal
612
+ """
613
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
614
+ """
615
+ upsell: Upsell
616
+ inPackages: [Product!]
617
+ hasUpsell: Boolean
742
618
 
743
- type DeleteCustomerProductListResult {
744
- success: Boolean
745
- }
619
+ """
620
+ All other products in the same family as the product. NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
621
+ """
622
+ familyMembers: [Product!]
746
623
 
747
- type Discount {
748
- externalId: ID
749
- name: String
750
- value: Price
751
- type: DiscountType
752
- description: String
753
- campaign: Category
624
+ """Get Product History within the set number of days"""
625
+ history(
626
+ """number of days, default is 30"""
627
+ days: Int = 30
628
+ ): ProductHistory
754
629
  }
755
630
 
756
- enum DiscountType {
757
- """No discount defined"""
758
- UNDEFINED
759
-
760
- """Discount drops price of the order total by defined amount"""
761
- FIXED_AMOUNT
631
+ type Category implements Document {
632
+ id: Int!
633
+ parentId: Int @deprecated(reason: "Use parent.id instead")
634
+ name: String!
635
+ level: Int!
762
636
 
763
- """Discount drops price of the product by X %"""
764
- PERCENT
637
+ """The time interval of the campaign/category"""
638
+ activeDateSpan: CategoryActiveDateSpan
765
639
 
766
640
  """
767
- Discount will get the amount of the cheapest product and use this as a discount
641
+ Whether or not this category and all its children are considered hidden
768
642
  """
769
- ITEMS
643
+ isHidden: Boolean! @deprecated(reason: "This field should no longer be used and will always be false.")
644
+
645
+ """When empty will display the value of the name field"""
646
+ mainHeader: String
647
+ content: String
648
+ externalId: String
649
+ externalDiscountId: String
650
+ images: [CategoryImage]
770
651
 
771
652
  """
772
- Discount drops total price of the product if there is at least X of them in cart
653
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
773
654
  """
774
- ITEMS_PERCENTAGE_LIMIT
775
-
776
- """Only a collection of products"""
777
- ONLY_USE_LANDING_PAGE
778
-
779
- """Discount drops price of the least expensive product in cart"""
780
- PERCENT_ON_LEAST_EXPENSIVE_ITEM
781
-
782
- """Discount drops price of the most expensive product in cart"""
783
- PERCENT_ON_MOST_EXPENSIVE_ITEM
655
+ products(first: Paging = 12, offset: Int = 0, orderBy: ProductOrderOptions, orderByDirection: SortDirection, filters: FilterInput): PagedResult
784
656
 
785
- """Discount allows to get a free gift when the product is added"""
786
- FREE_PRODUCT
657
+ """
658
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
659
+ """
660
+ head: HtmlHead
787
661
 
788
- """Discount allows to get free shipping option for the product"""
789
- FREE_SHIPPING
662
+ """
663
+ The primary route of this Category. NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
664
+ """
665
+ primaryRoute: Route
666
+ breadcrumbText: String
667
+ hasSubcategories: Boolean
668
+ subcategories: [Category]
669
+ parentCategory: Category @deprecated(reason: "Use parent instead")
670
+ parent: Category
790
671
 
791
672
  """
792
- Discount drops price for the package when all products in the package is added to cart
673
+ A dynamic category has no fixed products; products are dynamically included based on filters defined on the category in Admin. N.B. Products found on a dynamic category has no route that includes said category, instead product.primaryRoute will have to be used.
793
674
  """
794
- PACKAGE_DISCOUNT
675
+ isDynamic: Boolean!
795
676
 
796
- """Discount on the order total from a voucher"""
797
- BONUS_VOUCHER_DISCOUNT
677
+ """
678
+ The category's dynamic filtersNB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
679
+ """
680
+ dynamicFiltering: [CategoryDynamicFilter]
798
681
 
799
682
  """
800
- Discount allows to buy amount of X of the article, but pay only for amount of Y
683
+ Get content data set via the Content Editor. NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
801
684
  """
802
- BUY_X_ARTICLES_PAY_Y_AMOUNT
803
- }
685
+ data: Content
804
686
 
805
- interface Document {
806
- head: HtmlHead
807
- primaryRoute: Route
808
- breadcrumbText: String
687
+ """
688
+ When set to false, the category will be excluded from sitemap. The frontend implementation should use this value to set meta tags to exclude the category from being indexed by crawlers. Defaults to true.
689
+ """
690
+ allowWebIndexing: Boolean
809
691
  }
810
692
 
811
- type ExternalCustomer {
812
- externalId: String
813
- email: MaskedProperty
814
- firstName: MaskedProperty
815
- lastName: MaskedProperty
816
- co: MaskedProperty
817
- address: MaskedProperty
818
- city: MaskedProperty
819
- postalCode: MaskedProperty
820
- country: MaskedProperty
821
- countryCode: String
822
- phoneNumber: MaskedProperty
823
- mobilePhoneNumber: MaskedProperty
824
- pid: MaskedProperty
693
+ type CategoryActiveDateSpan {
694
+ startDate: DateTime
695
+ endDate: DateTime
825
696
  }
826
697
 
827
- """
828
- The activation status has 4 states;
829
- PREEXISTING_CUSTOMER: No customer info will be returned and the customer is advised to login to the preexisting account.
830
- ACTIVATION_REQUIRED: The customer account needs to be activated. Email (masked),
831
- FirstName (masked) and externalId will be the only fields set on `customer`.
832
- ADDITIONAL_USER_DATA_REQUIRED: Additional data needed to register the customer,
833
- the existing customer info will be available with masking on customer.
834
- NON_EXISTING_CUSTOMER: Customer does not exist in any system and will have to do a sign up.
835
- COUNTRY_NOT_VALID: The customer account may not be activated on this channel as
836
- it's missing the customer country. Email (masked), FirstName (masked),
837
- externalId and countryCode will be the only fields set on `customer`.
698
+ type CategoryImage {
699
+ width: Int
700
+ height: Int
701
+ url: Uri
702
+ }
838
703
 
704
+ type PagedResult {
705
+ totalResults: Int
839
706
 
840
- """
841
- type ExternalCustomerResult {
842
- status: ActivationStatusSource
843
- customer: ExternalCustomer
707
+ """
708
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
709
+ """
710
+ sortOrders: [ProductSortOrder]
711
+
712
+ """
713
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
714
+ """
715
+ filters(
716
+ """
717
+ Optional: ID's of filters to fetch. If not set all filters will be returned.
718
+ """
719
+ ids: [String]
720
+ ): [Filter]
721
+ result: [Product]!
844
722
  }
845
723
 
846
- type ExternalOrderData {
847
- name: String!
848
- value: String!
724
+ type ProductSortOrder {
725
+ text: String!
726
+ value: ProductOrderOptions!
727
+ isDefault: Boolean!
728
+ defaultDirection: SortDirection!
849
729
  }
850
730
 
851
- type FacebookConversionsApi {
852
- accessToken: String
853
- pixelId: String
731
+ enum ProductOrderOptions {
732
+ ARTICLE_NUMBER
733
+ NAME
734
+ PUBLISH_DATE
735
+ PRICE
736
+ SUB_HEADING
737
+ CUSTOM
738
+ BESTSELLER
854
739
  }
855
740
 
856
- interface Filter {
857
- id: String!
858
- name: String!
741
+ enum SortDirection {
742
+ ASCENDING
743
+ DESCENDING
859
744
  }
860
745
 
746
+ """The `Paging` scalar type represents a numeric values between <1; 100>"""
747
+ scalar Paging
748
+
861
749
  input FilterInput {
862
750
  listFilters: [ListFilterInput]
863
751
  rangeFilters: [RangeFilterInput]
@@ -865,24 +753,27 @@ input FilterInput {
865
753
  multiListFilters: [MultiListFilterInput]
866
754
  }
867
755
 
868
- type FreeShippingLimit {
869
- incVat: Decimal
870
- exVat: Decimal
756
+ input ListFilterInput {
757
+ id: String!
758
+ values: [String]
871
759
  }
872
760
 
873
- type GoogleAnalytics {
874
- trackingId: String
875
- useArticleNumberAsId: Boolean
761
+ input RangeFilterInput {
762
+ id: String!
763
+ min: Decimal
764
+ max: Decimal
876
765
  }
877
766
 
878
- type GoogleAnalytics4 {
879
- trackingId: String
880
- useArticleNumberAsId: Boolean
767
+ input BooleanFilterInput {
768
+ id: String!
769
+
770
+ """null is equivalent to excluding the filter."""
771
+ value: Boolean
881
772
  }
882
773
 
883
- type GoogleTagManager {
884
- containerId: String
885
- useGa4Events: Boolean
774
+ input MultiListFilterInput {
775
+ id: String!
776
+ values: [String]
886
777
  }
887
778
 
888
779
  type HtmlHead {
@@ -895,483 +786,331 @@ type HtmlMetaTag {
895
786
  content: String
896
787
  }
897
788
 
898
- type Image {
899
- title: String
900
- url: Uri
901
- width: Int
902
- height: Int
903
- }
789
+ """
790
+ Represents a route to either a Category, a Product, a Page or the StartPage.
791
+ """
792
+ type Route {
793
+ id: String!
794
+ path: String!
795
+ canonicalPath: String
796
+ slug: String!
904
797
 
905
- type ImageValue {
906
- value: String
907
- focalPointX: Int
908
- focalPointY: Int
909
- }
798
+ """
799
+ The Category, Product, Page or StartPage that the Route resolves to. NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
800
+ """
801
+ object: Document
910
802
 
911
- input InputComment {
912
- name: String!
913
- value: String
914
- }
803
+ """
804
+ Parents are resolved by traversing the path, starting from the end, and are guaranteed to be returned in that order. NB: Carries a performance cost, as asking for this will result in a different, slightly more expensive (the more categories a shop has, the more expensive this gets), route query in the backend.
805
+ """
806
+ parents: [Route]
915
807
 
916
- type Language {
917
- id: String!
918
- name: String!
919
- culture: String!
920
- isDefault: Boolean
921
- }
808
+ """
809
+ Alternative routes for this object, if it exists in another channel and/or in another language.NB: Carries no additional performance cost.
810
+ """
811
+ alternateRoutes: [AlternateRoute]
922
812
 
923
- type Link {
924
- target: String
925
- link: Uri
926
- }
813
+ """N.B. for troubleshooting routes only!"""
814
+ debug: String
927
815
 
928
- type ListFilter implements Filter {
929
- items: [ListFilterItem]!
930
- id: String!
931
- name: String!
816
+ """Breadcrumb texts; starting with the root parent, ending on this route."""
817
+ breadcrumbs: [String]
932
818
  }
933
819
 
934
- input ListFilterInput {
935
- id: String!
936
- values: [String]
820
+ interface Document {
821
+ head: HtmlHead
822
+ primaryRoute: Route
823
+ breadcrumbText: String
937
824
  }
938
825
 
939
- type ListFilterItem {
940
- text: String!
941
- id: String!
942
- value: String!
943
- resultCount: Int
826
+ type AlternateRoute {
827
+ channelId: Int
828
+ culture: String
829
+ route: String
830
+ alias: String
944
831
  }
945
832
 
946
- type ListStringValue {
947
- value: [String]
833
+ type CategoryDynamicFilter {
834
+ type: String
835
+ value: CategoryDynamicFilterValue
948
836
  }
949
837
 
950
- input LoginExternalCustomerInput {
951
- externalCustomerToken: String!
952
- }
838
+ union CategoryDynamicFilterValue = StringValue | ListStringValue | BoolValue
953
839
 
954
- type LoginExternalCustomerResult {
955
- token: Token
840
+ type StringValue {
841
+ value: String
956
842
  }
957
843
 
958
- """
959
- The response will contain a authorization token if the login was successful
960
- """
961
- type LoginResponse {
962
- token: Token!
844
+ type ListStringValue {
845
+ value: [String]
963
846
  }
964
847
 
965
- type MaskedProperty {
966
- masked: String
967
- encrypted: String
848
+ type BoolValue {
849
+ value: Boolean
968
850
  }
969
851
 
970
- type MultiListFilter implements Filter {
971
- lists: [MultiListFilterList]!
972
- id: String!
973
- name: String!
852
+ type Content {
853
+ name: String
854
+ id: ID!
855
+ items: [ContentItem]
856
+ tags: [String]
974
857
  }
975
858
 
976
- input MultiListFilterInput {
977
- id: String!
978
- values: [String]
859
+ type ContentItem {
860
+ name: String
861
+ type: String!
862
+ properties(
863
+ """
864
+ If true image content property will return `ImageValue` instead of a string
865
+ """
866
+ getImageAsImageValue: Boolean = false
867
+ ): [ContentItemProperty]
868
+ children: [ContentItem]
979
869
  }
980
870
 
981
- type MultiListFilterList {
982
- id: String!
871
+ type ContentItemProperty {
983
872
  name: String!
984
- items: [ListFilterItem]!
873
+ type: String!
874
+ valueType: ContentPropertyValueType
875
+ value: ContentItemPropertyValue
985
876
  }
986
877
 
987
- type MultipleContent {
988
- notFoundIds: [ID]!
989
- content: [Content]!
878
+ enum ContentPropertyValueType {
879
+ OBJECT
880
+ SCALAR
990
881
  }
991
882
 
992
- type Mutation {
993
- subscribeToStockNotifications(email: String!, articleNumber: String!): Boolean
994
-
995
- """
996
- This mutation's purpose is to subscribe a customer to a newsletter. In order
997
- to subscribe a customer a valid email address is required
998
-
999
- Responds with a boolean value whether the subscription has been successful or not
1000
- """
1001
- subscribeToNewsletter(email: String!): Boolean
1002
-
1003
- """
1004
- ## Description
1005
- Adds items to product list, null id adds items to the default product list.
1006
- ## Error Codes
1007
- ### Unauthorized
1008
- Unauthorized
1009
- ### AddToProductListFailed
1010
- Error in underlying API call, more info may be contained in the error message.
1011
- ### InvalidArticleNumber
1012
- Article number cannot be empty
1013
- ### ProductNotFound
1014
- No match on article number
1015
- ### MoreThanOneMatchOnArticleNumber
1016
- Article number matched more than one article
1017
-
1018
- """
1019
- addToCustomerProductList(id: ID, items: [AddToCustomerProductListInput!]!): CustomerProductListResult
1020
-
1021
- """
1022
- ## Description
1023
- Creates a product list for a logged in customer
1024
- ## Error Codes
1025
- ### Unauthorized
1026
-
1027
- ### UnableToCreateProductList
1028
- Error in underlying API call, more info may be contained in the error message.
1029
-
1030
- """
1031
- createCustomerProductList(input: CreateCustomerProductListInput!): CustomerProductListResult
1032
-
1033
- """
1034
- ## Description
1035
- Deletes a product list for a logged in customer
1036
- ## Error Codes
1037
- ### Unauthorized
1038
-
1039
- ### ProductListNotFound
1040
- Argument `id` did not match any list for this customer.
1041
- ### UnableToDeleteProductList
1042
- Error in underlying API call, more info may be contained in the error message.
1043
-
1044
- """
1045
- deleteCustomerProductList(id: ID!): DeleteCustomerProductListResult
1046
-
1047
- """
1048
- ## Description
1049
- Removes an item from a product list for a logged in customer, null id removes item in the default product list.
1050
- ## Error Codes
1051
- ### Unauthorized
1052
-
1053
- ### ProductListNotFound
1054
- Argument `id` did not match any list for this customer.
1055
- ### RemoveFromProductListFailed
1056
- Error in underlying API call, more info may be contained in the error message.
1057
- ### ProductNotFound
1058
- Argument `articleNumbers` did not match any products or variants.
1059
- ### MoreThanOneMatchOnArticleNumber
1060
- Argument `articleNumbers` matched more than one product/variant.
1061
- ### InvalidArticleNumber
1062
- Argument `articleNumbers` cannot be null or empty.
1063
-
1064
- """
1065
- removeFromCustomerProductList(id: ID, articleNumbers: [String!]): CustomerProductListResult
1066
-
1067
- """
1068
- ## Description
1069
- Updates an item in product list, null id updates item in the default product list.
1070
- ## Error Codes
1071
- ### Unauthorized
1072
-
1073
- ### ProductListNotFound
1074
- Argument `id` did not match any list for this customer.
1075
- ### UnableToUpdateProductListItem
1076
- Error in underlying API call, more info may be contained in the error message.
1077
- ### ProductNotFound
1078
- Argument `articleNumber` did not match any products or variants.
1079
- ### MoreThanOneMatchOnArticleNumber
1080
- Argument `articleNumber` matched more than one product/variant.
1081
- ### InvalidArticleNumber
1082
- Argument `articleNumber` cannot be null or empty.
1083
-
1084
- """
1085
- updateCustomerProductListItem(input: UpdateCustomerProductListItemInput!): CustomerProductListResult
1086
-
1087
- """
1088
- ## Description
1089
- Updates a product list for a logged in customer
1090
- ## Error Codes
1091
- ### Unauthorized
1092
-
1093
- ### ProductListNotFound
1094
- Argument `id` did not match any list for this customer.
1095
- ### UnableToUpdateProductList
1096
- Error in underlying API call, more info may be contained in the error message.
1097
-
1098
- """
1099
- updateCustomerProductList(input: UpdateCustomerProductListInput!): CustomerProductListResult
1100
-
1101
- """
1102
- Error codes: CustomerNotFound, CustomerAlreadyActivated,
1103
- UnableToActivateCustomer, UnableToLoginCustomer, InvalidCustomerActivateInput
1104
- """
1105
- activateExternalCustomerById(input: ActivateExternalCustomerByIdInput): ActivateExternalCustomerByIdResult
1106
-
1107
- """
1108
- Error codes: CustomerNotFound, CustomerAlreadyActivated,
1109
- UnableToActivateCustomer, UnableToLoginCustomer, InvalidCustomerActivateInput
1110
- """
1111
- activateExternalCustomerByToken(input: ActivateExternalCustomerByTokenInput): ActivateExternalCustomerByTokenResult
883
+ union ContentItemPropertyValue = StringValue | ImageValue | BoolValue | Product | Category
1112
884
 
1113
- """
1114
- This mutation deletes a customer. An authorization token is needed in the
1115
- request, in order to be able to delete the customer.
1116
- """
1117
- deleteCustomer: Boolean
1118
- loginExternalCustomer(input: LoginExternalCustomerInput): LoginExternalCustomerResult
885
+ type ImageValue {
886
+ value: String
887
+ focalPointX: Int
888
+ focalPointY: Int
889
+ }
1119
890
 
1120
- """
1121
- LoginMutation will log a user in.
1122
- One of email, pid, externalId, memberNumber or customerId is required, along with a password.
1123
- Returns an authorization token if the login was successful.
1124
- """
1125
- login(password: String, email: String, pid: String, externalId: String, memberNumber: String, externalHashId: String, timeStamp: String, customerId: Int): LoginResponse
891
+ type ProductVariants {
892
+ """Available product variant options."""
893
+ options: [ProductVariantOption]!
1126
894
 
1127
- """
1128
- Requires a valid email and returns boolean value if successful, otherwise an error will be thrown
1129
- """
1130
- requestPasswordReset(email: String!): RequestPasswordResetResult
895
+ """Product variants, contains all possible values of options."""
896
+ values: [ProductVariant]!
897
+ }
1131
898
 
1132
- """
1133
- Requires a valid resetPasswordToken and a new password and if successful will return a authentication token
1134
- """
1135
- resetPassword(
1136
- """A reset password token that is solely used during a password reset"""
1137
- resetPasswordToken: String!
1138
- newPassword: String!
1139
- ): ResetPassword
899
+ type ProductVariantOption {
900
+ name: String
901
+ values: [String]!
902
+ }
1140
903
 
1141
- """
1142
- The SignUp-mutation is used for creating a customer.
1143
-
1144
- If the sign up is successful the customer may be considered to be logged on and an authentication token will be returned
1145
- """
1146
- signUp(input: SignUpInput!): SignUpResponse
904
+ type ProductVariant {
905
+ id: String!
906
+ articleNumber: String!
1147
907
 
1148
- """
1149
- ## Description
1150
- This mutation's purpose is to update a existing customer's group using an
1151
- access code. An authorization token is needed in the request, in order to be
1152
- able to update the customer.
1153
- ## Error Codes
1154
- ### Unauthorized
1155
- Unauthorized
1156
- ### UnableToUpdateCustomer
1157
- Error in underlying API call, more info may be contained in the error message.
1158
- ### CustomerAlreadyUpdated
1159
- Customer already in the customer group
1160
- ### CustomerNotFound
1161
- No match on customer with access code
1162
-
1163
- """
1164
- updateCustomerGroup(customerGroupAccessCode: String!): UpdateCustomerGroupResult
908
+ """Variant values (combination of option values)"""
909
+ values: [String]!
1165
910
 
1166
911
  """
1167
- This mutation's purpose is to update a existing customer's information. An
1168
- authorization token is needed in the request, in order to be able to update the customer.
912
+ The current price.
913
+ - Will be a Customer specific price if that Customer has a separate price list.
914
+ - Will be the member price if Customer is logged in and `Product.hasMemberPrice` is true.
915
+ - Will be the non-member price if Customer is not logged in and `Product.hasMemberPrice` is true.
1169
916
  """
1170
- updateCustomer(input: CustomerUpdateInput!): CustomerUpdateResponse
917
+ price: Price
1171
918
 
1172
919
  """
1173
- This mutation's purpose is to update a existing customer's price list using an
1174
- access code. An authorization token is needed in the request, in order to be
1175
- able to update the customer.
920
+ The previous price (i.e. this will be higher than `price` if the product is discounted). Will be a Customer specific previous price, if that Customer has a separate price list.
1176
921
  """
1177
- updateCustomerPriceList(priceListAccessCode: String!): UpdateCustomerPriceListResult
922
+ previousPrice: Price
1178
923
 
1179
924
  """
1180
- The updatePassword mutation updates the customers password. Both the old password and a new password is a requirement.
925
+ Default price for the product in the channel, disregards Customer specific prices.
1181
926
  """
1182
- updatePassword(oldPassword: String!, newPassword: String!): UpdatePasswordResult
927
+ defaultPrice: Price
1183
928
 
1184
929
  """
1185
- Adds products to the cart where you can add comments to the products and
1186
- determine their quantities. Replies with the affected cart if a cartId has
1187
- been presented, otherwise a new cart will be created.
930
+ Default previous price for the product in the channel, disregards Customer specific prices.
1188
931
  """
1189
- addMultipleToCart(
1190
- """Not specifying cart id will create new cart."""
1191
- cartId: String
1192
- items: [AddMultipleToCartInput]!
1193
- ): CartMutation
932
+ defaultPreviousPrice: Price
1194
933
 
1195
- """
1196
- Adds a product to the cart where you can add a comment to the product and
1197
- determine the quantity. Replies with the affected cart if a cartId has been
1198
- presented, otherwise a new cart will be created.
1199
- """
1200
- addToCart(input: AddToCartInput!): CartMutation
934
+ """Not in use. Always null."""
935
+ recommendedPrice: Price
936
+
937
+ """The time interval of the discounted price."""
938
+ priceDateSpan: ProductPriceDateSpan
1201
939
 
1202
940
  """
1203
- This mutation is used to reduce the quantity of a product in the cart, replies
1204
- with the affected cart ruled by the cartId in the input.
941
+ The price a Customer would get if member prices are active and the Customer is logged in.
942
+ - Will be null if `Product.hasMemberPrice` is false.
943
+ - Will be set if `Product.hasMemberPrice` is true.
1205
944
  """
1206
- decrementItemQuantity(input: ChangeByOneItemQuantityInput!): CartMutation
945
+ memberPrice: Price
1207
946
 
1208
947
  """
1209
- Used to add a specific quantity to a product in the cart. Replies with the affected cart ruled by the cartId in the input
948
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1210
949
  """
1211
- setItemQuantity(input: SetItemQuantityInput!): CartMutation
950
+ stockStatus: StockStatus
1212
951
 
1213
952
  """
1214
- This mutation is used to increase the quantity of a product in the cart,
1215
- replies with the affected cart ruled by the cartId in the input
953
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1216
954
  """
1217
- incrementItemQuantity(input: ChangeByOneItemQuantityInput!): CartMutation
1218
-
1219
- """Removes a specific product in the cart, replies with the affected cart"""
1220
- removeFromCart(input: RemoveFromCartInput!): CartMutation
1221
-
1222
- """Removes specific items from the cart, replies with the affected cart"""
1223
- removeMultipleFromCart(input: RemoveMultipleFromCartInput!): CartMutation
955
+ warehouseStock(includeInactive: Boolean = false): [Warehouse]
956
+ images: [ProductImage]
957
+ barcode: String
1224
958
 
1225
- """Responds with the affected cart."""
1226
- updateCart(input: UpdateCartInput!): UpdateCartMutation
959
+ """Get Product History within the set number of days"""
960
+ history(
961
+ """number of days, default is 30"""
962
+ days: Int = 30
963
+ ): ProductVariantHistory
1227
964
  }
1228
965
 
1229
- type MyPagesContent {
1230
- """Text that will show on the landing page on MyPages"""
1231
- welcomeText: String
966
+ type ProductPriceDateSpan {
967
+ startDate: DateTime
968
+ endDate: DateTime
1232
969
  }
1233
970
 
1234
- type NumericRangeFilter implements Filter {
1235
- min: Decimal!
1236
- max: Decimal!
1237
- id: String!
1238
- name: String!
971
+ type StockStatus {
972
+ """Globally unique id."""
973
+ id: ID!
974
+
975
+ """The stock status id, not globally unique."""
976
+ stockStatusId: ID!
977
+ text: String
978
+ buyable: Boolean!
979
+ stockNotificationEnabled: Boolean
980
+ stockDate: DateTime
981
+ maxOrderQuantity: Int
1239
982
  }
1240
983
 
1241
- type Order {
1242
- id: ID!
1243
- orderNumber: String
1244
- status: OrderStatus
1245
- items(
1246
- """Will fetch all if this is set to 0"""
1247
- first: Int = 0
1248
- offset: Int = 0
1249
- ): [OrderItem]
1250
- billingInfo: OrderInfo
1251
- deliveryInfo: OrderInfo
1252
- paymentMethod: OrderPaymentMethod
1253
- deliveryMethod: OrderDeliveryMethod
1254
- giftVouchers: [OrderGiftVoucher]
1255
- total: Price
1256
- orderDate: DateTime
1257
- currency: Currency
1258
- attachments: [OrderAttachment]
1259
- orderPurchaseLocation: String
984
+ type Warehouse {
985
+ stockLevel: Int
986
+ location: Store
1260
987
  }
1261
988
 
1262
- type OrderAddress {
1263
- street: String
1264
- postcode: String
1265
- city: String
1266
- region: String
989
+ type ProductImage {
990
+ """
991
+ Alternate text for the image, commonly used for the alt attribute of img-tags.
992
+ """
993
+ alt: String
1267
994
 
1268
995
  """
1269
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
996
+ Extra information, commonly used for the title attribute of img-tag. Should be shown on hover.
1270
997
  """
1271
- country: Country
998
+ title: String
999
+ sizes: [ProductImageSize]! @deprecated(reason: "Images will no longer be offered in different sizes. Instead use 'url' in conjunction with our image resizing service.")
1000
+ url: Uri
1001
+ modifiedDate: String
1272
1002
  }
1273
1003
 
1274
- type OrderAttachment {
1275
- id: ID!
1276
- url: String
1004
+ type ProductImageSize {
1005
+ width: Int
1006
+ height: Int
1007
+ url: Uri
1277
1008
  }
1278
1009
 
1279
- type OrderDeliveryMethod {
1280
- name: String
1281
- fee: Price
1282
- tracking: OrderDeliveryMethodTracking
1010
+ type ProductVariantHistory {
1011
+ previousPrice: [PriceHistory]
1283
1012
  }
1284
1013
 
1285
- type OrderDeliveryMethodTracking {
1286
- trackingUrl: String
1287
- trackingUrlText: String
1014
+ type PriceHistory {
1015
+ timestamp: DateTime
1016
+ price: Price
1288
1017
  }
1289
1018
 
1290
- type OrderGiftVoucher {
1019
+ type ProductBadge {
1291
1020
  name: String
1292
- amount: Decimal
1293
- charged: Decimal
1294
- validUntil: DateTime
1021
+ url: Uri
1022
+ location: ProductBadgeLocation
1023
+ style: String
1024
+ text: String
1295
1025
  }
1296
1026
 
1297
- type OrderHeader {
1298
- id: ID!
1299
- orderNumber: String
1300
- status: OrderStatus
1301
- statusTimeline: [OrderStatus]
1027
+ enum ProductBadgeLocation {
1028
+ CUSTOM
1029
+ TOP_LEFT
1030
+ TOP_RIGHT
1031
+ BOTTOM_LEFT
1032
+ BOTTOM_RIGHT
1033
+ }
1302
1034
 
1303
- """
1304
- If this is false, a call to `order` for this order will result in a failure.
1305
- """
1306
- hasOrderDetails: Boolean
1307
- total: Price
1308
- orderDate: DateTime
1309
- trackingId: String
1310
- currency: Currency
1035
+ type ProductComment {
1036
+ name: String!
1037
+ required: Boolean!
1311
1038
  }
1312
1039
 
1313
- type OrderHeaderResult {
1314
- result: [OrderHeader]
1315
- totalResults: Int
1040
+ type RecommendedProducts {
1041
+ """Customers who bought this product also bought these products."""
1042
+ bought(
1043
+ """number of recommended products to fetch"""
1044
+ count: Int = 4
1045
+ ): [Product]
1046
+
1047
+ """Customers who viewed this product also viewed these products."""
1048
+ viewed(
1049
+ """number of recommended products to fetch"""
1050
+ count: Int = 4
1051
+ ): [Product]
1052
+
1053
+ """A shuffled top list of popular products."""
1054
+ shuffledToplist(
1055
+ """number of recommended products to fetch"""
1056
+ count: Int = 4
1057
+ ): [Product]
1316
1058
  }
1317
1059
 
1318
- type OrderInfo {
1319
- firstName: String
1320
- lastName: String
1321
- company: String
1322
- phone: String
1323
- address: OrderAddress
1060
+ type ProductConfiguration {
1061
+ name: String
1062
+ options: [ProductConfigurationOption]!
1324
1063
  }
1325
1064
 
1326
- type OrderItem {
1327
- articleNumber: String
1065
+ """
1066
+ Options by which you can configure a product.
1328
1067
 
1329
- """
1330
- Name of the Product at the time the order was placed (may since have changed).
1331
- Use this as a fallback if the 'product' field itself is null.
1332
- """
1333
- name: String
1334
- quantity: Int
1335
- unitPrice: Price
1336
- total: Price
1337
- discounts: [OrderItemDiscount]
1068
+ For instance, if you're selling rope the available options might be the dimensions; 10mm, 20mm, 30mm, etc.
1338
1069
 
1339
- """N.B. this may be null if the Product has since been removed."""
1340
- product: Product
1070
+ Price is either used as is, or if the configuration is using a price calculation (e.g. the rope is priced by length) it will be used in the calculation formula; e.g. (Length * Price).
1071
+ """
1072
+ type ProductConfigurationOption {
1073
+ id: ID!
1074
+ name: String
1075
+ price: Price
1341
1076
 
1342
1077
  """
1343
- N.B. this may be null if the Product itself or the Variant has since been removed.
1078
+ This will be set if the configuration requires price calculation, e.g. you might sell rope and price it by length.
1344
1079
  """
1345
- variant: ProductVariant
1080
+ priceCalculation: ProductConfigurationPriceCalculation
1081
+ }
1346
1082
 
1347
- """N.B. this may be null if the Product has since been removed."""
1348
- variantOptionNames: [String]
1083
+ """
1084
+ Describes how the price is calculated on a configuration option.
1349
1085
 
1350
- """
1351
- Value of the Variant at the time the order was placed (may since have
1352
- changed). Use this as a fallback if the 'variant' field itself is null. Will
1353
- be null when the OrderItem is not a Variant.
1354
- """
1355
- variantValue: String
1356
- preOrderDate: DateTime
1086
+ E.g. the configuration is for a carpet and it has a price calculation formula that reads: 'Width * Length * Price / 10000'.
1357
1087
 
1358
- """list of name, value fields from orders coming from external systems."""
1359
- externalOrderData: [ExternalOrderData]
1088
+ In this case, the variables would contain 'Width' and 'Length' whereas the 'Price' is taken from the selected option.
1089
+ """
1090
+ type ProductConfigurationPriceCalculation {
1091
+ id: ID!
1092
+ name: String
1093
+ formula: String
1094
+ variables: [ProductConfigurationPriceCalculationVariable]
1360
1095
  }
1361
1096
 
1362
- type OrderItemDiscount {
1363
- value: Price
1097
+ type ProductConfigurationPriceCalculationVariable {
1098
+ id: ID!
1099
+ name: String
1364
1100
  }
1365
1101
 
1366
- type OrderPaymentMethod {
1367
- name: String
1368
- fee: Price
1102
+ type ProductConfigurationPrice {
1103
+ price: Price
1104
+ previousPrice: Price
1369
1105
  }
1370
1106
 
1371
- type OrderStatus {
1372
- id: ID
1373
- description: String
1374
- timestamp: DateTime
1107
+ input ProductConfigurationPriceInput {
1108
+ optionId: ID!
1109
+ }
1110
+
1111
+ type ProductPreOrder {
1112
+ fromDate: DateTime
1113
+ toDate: DateTime
1375
1114
  }
1376
1115
 
1377
1116
  type Package {
@@ -1391,6 +1130,18 @@ type Package {
1391
1130
  discountPercentage: Decimal
1392
1131
  }
1393
1132
 
1133
+ type PackageItem {
1134
+ product: Product
1135
+ minQuantity: Int!
1136
+ discount: PackageDiscount
1137
+
1138
+ """The current package price with any potential discount"""
1139
+ price: Price
1140
+
1141
+ """The previous package price without any potential discount"""
1142
+ previousPrice: Price
1143
+ }
1144
+
1394
1145
  union PackageDiscount = PackageDiscountPercentage | PackageDiscountValue
1395
1146
 
1396
1147
  type PackageDiscountPercentage {
@@ -1403,21 +1154,89 @@ type PackageDiscountValue {
1403
1154
  valueVat: Decimal!
1404
1155
  }
1405
1156
 
1406
- type PackageItem {
1157
+ input PackagePriceInput {
1158
+ product: ID!
1159
+ variant: ID
1160
+ }
1161
+
1162
+ type Upsell {
1163
+ id: ID!
1164
+ items: [UpsellItem!]!
1165
+ }
1166
+
1167
+ type UpsellItem {
1407
1168
  product: Product
1408
1169
  minQuantity: Int!
1409
- discount: PackageDiscount
1170
+ discount: UpsellDiscount!
1171
+ }
1410
1172
 
1411
- """The current package price with any potential discount"""
1412
- price: Price
1173
+ union UpsellDiscount = UpsellDiscountPercentage | UpsellDiscountValue
1413
1174
 
1414
- """The previous package price without any potential discount"""
1415
- previousPrice: Price
1175
+ type UpsellDiscountPercentage {
1176
+ percentage: Decimal!
1416
1177
  }
1417
1178
 
1418
- input PackagePriceInput {
1419
- product: ID!
1420
- variant: ID
1179
+ type UpsellDiscountValue {
1180
+ valueIncVat: Decimal!
1181
+ valueExVat: Decimal!
1182
+ valueVat: Decimal!
1183
+ }
1184
+
1185
+ type ProductHistory {
1186
+ previousPrice: [PriceHistory]
1187
+ }
1188
+
1189
+ type CustomItem {
1190
+ id: Int!
1191
+ name: String!
1192
+ content: String
1193
+ linkUrl: Uri
1194
+ image: Image
1195
+ }
1196
+
1197
+ type SearchAutoCompleteResult {
1198
+ """
1199
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1200
+ """
1201
+ products: ProductAutoCompleteResult
1202
+
1203
+ """
1204
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1205
+ """
1206
+ categories(first: Paging = 12): CategoryAutoCompleteResult
1207
+ }
1208
+
1209
+ type ProductAutoCompleteResult {
1210
+ result: [Product]!
1211
+ }
1212
+
1213
+ type CategoryAutoCompleteResult {
1214
+ result: [Category]
1215
+ }
1216
+
1217
+ type SearchResult {
1218
+ products(paging: PagingInput = {first: 12, offset: 0}, filters: FilterInput = {listFilters: [], rangeFilters: [], booleanFilters: [], multiListFilters: []}): ProductSearchResult
1219
+
1220
+ """
1221
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1222
+ """
1223
+ categories(paging: PagingInput = {first: 12, offset: 0}): CategorySearchResult
1224
+ }
1225
+
1226
+ type ProductSearchResult {
1227
+ result: [Product]!
1228
+ filters: [Filter]
1229
+ totalResults: Int
1230
+ }
1231
+
1232
+ input PagingInput {
1233
+ first: Paging = 12
1234
+ offset: Int = 0
1235
+ }
1236
+
1237
+ type CategorySearchResult {
1238
+ result: [Category]
1239
+ totalResults: Int
1421
1240
  }
1422
1241
 
1423
1242
  type Page implements Document {
@@ -1437,15 +1256,13 @@ type Page implements Document {
1437
1256
  head: HtmlHead
1438
1257
 
1439
1258
  """
1440
- The primary route of this Page. NB: Carries a performance cost, as asking for
1441
- this will result in a separate API call in the backend.
1259
+ The primary route of this Page. NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1442
1260
  """
1443
1261
  primaryRoute: Route
1444
1262
  breadcrumbText: String
1445
1263
 
1446
1264
  """
1447
- Get content data set via the Content Editor. NB: Carries a performance cost,
1448
- as asking for this will result in a separate API call in the backend.
1265
+ Get content data set via the Content Editor. NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1449
1266
  """
1450
1267
  data: Content
1451
1268
 
@@ -1456,747 +1273,886 @@ type Page implements Document {
1456
1273
  parent: Page
1457
1274
 
1458
1275
  """
1459
- * If this page was fetched by ID using the `page(id)` query, `subPages` will
1460
- be returned even if they are hidden. This can be overridden with the
1461
- `includeHidden` flag.
1462
- * If this page was fetched using the `pages` query, `subPages` will not be
1463
- returned if they are hidden. The `includeHidden` flag has no effect on this.
1276
+ * If this page was fetched by ID using the `page(id)` query, `subPages` will be returned even if they are hidden. This can be overridden with the `includeHidden` flag.
1277
+ * If this page was fetched using the `pages` query, `subPages` will not be returned if they are hidden. The `includeHidden` flag has no effect on this.
1464
1278
  """
1465
1279
  subPages(includeHidden: Boolean = true): [Page!]
1466
1280
 
1467
1281
  """
1468
- When set to false, the page will be excluded from sitemap. The frontend
1469
- implementation should use this value to set meta tags to exclude the page from
1470
- being indexed by crawlers. Defaults to true.
1282
+ When set to false, the page will be excluded from sitemap. The frontend implementation should use this value to set meta tags to exclude the page from being indexed by crawlers. Defaults to true.
1471
1283
  """
1472
1284
  allowWebIndexing: Boolean
1473
1285
  }
1474
1286
 
1475
- type PagedResult {
1476
- totalResults: Int
1287
+ type Link {
1288
+ target: String
1289
+ link: Uri
1290
+ }
1291
+
1292
+ type Order {
1293
+ id: ID!
1294
+ orderNumber: String
1295
+ status: OrderStatus
1296
+ items(
1297
+ """Will fetch all if this is set to 0"""
1298
+ first: Int = 0
1299
+ offset: Int = 0
1300
+ ): [OrderItem]
1301
+ billingInfo: OrderInfo
1302
+ deliveryInfo: OrderInfo
1303
+ paymentMethod: OrderPaymentMethod
1304
+ deliveryMethod: OrderDeliveryMethod
1305
+ giftVouchers: [OrderGiftVoucher]
1306
+ total: Price
1307
+ orderDate: DateTime
1308
+ currency: Currency
1309
+ attachments: [OrderAttachment]
1310
+ orderPurchaseLocation: String
1311
+ }
1312
+
1313
+ type OrderItem {
1314
+ articleNumber: String
1477
1315
 
1478
1316
  """
1479
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1317
+ Name of the Product at the time the order was placed (may since have changed). Use this as a fallback if the 'product' field itself is null.
1480
1318
  """
1481
- sortOrders: [ProductSortOrder]
1319
+ name: String
1320
+ quantity: Int
1321
+ unitPrice: Price
1322
+ total: Price
1323
+ discounts: [OrderItemDiscount]
1324
+
1325
+ """N.B. this may be null if the Product has since been removed."""
1326
+ product: Product
1482
1327
 
1483
1328
  """
1484
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1329
+ N.B. this may be null if the Product itself or the Variant has since been removed.
1485
1330
  """
1486
- filters(
1487
- """
1488
- Optional: ID's of filters to fetch. If not set all filters will be returned.
1489
- """
1490
- ids: [String]
1491
- ): [Filter]
1492
- result: [Product]!
1493
- }
1331
+ variant: ProductVariant
1494
1332
 
1495
- """The `Paging` scalar type represents a numeric values between <1; 100>"""
1496
- scalar Paging
1333
+ """N.B. this may be null if the Product has since been removed."""
1334
+ variantOptionNames: [String]
1497
1335
 
1498
- input PagingInput {
1499
- first: Paging = 12
1500
- offset: Int = 0
1501
- }
1336
+ """
1337
+ Value of the Variant at the time the order was placed (may since have changed). Use this as a fallback if the 'variant' field itself is null. Will be null when the OrderItem is not a Variant.
1338
+ """
1339
+ variantValue: String
1340
+ preOrderDate: DateTime
1502
1341
 
1503
- type paymentType {
1504
- name: String!
1505
- apiClientId: String!
1506
- availableForBusiness: Boolean!
1507
- availableForPrivate: Boolean!
1342
+ """list of name, value fields from orders coming from external systems."""
1343
+ externalOrderData: [ExternalOrderData]
1508
1344
  }
1509
1345
 
1510
- type PersonLookup {
1511
- firstName: MaskedProperty
1512
- lastName: MaskedProperty
1513
- co: MaskedProperty
1514
- address: MaskedProperty
1515
- city: MaskedProperty
1516
- postalCode: MaskedProperty
1517
- country: MaskedProperty
1518
- phoneNumber: MaskedProperty
1519
- mobilePhoneNumber: MaskedProperty
1346
+ type OrderItemDiscount {
1347
+ value: Price
1520
1348
  }
1521
1349
 
1522
- type Price {
1523
- incVat: Decimal!
1524
- exVat: Decimal!
1525
- vat: Decimal!
1350
+ type ExternalOrderData {
1351
+ name: String!
1352
+ value: String!
1526
1353
  }
1527
1354
 
1528
- type PriceHistory {
1529
- timestamp: DateTime
1530
- price: Price
1355
+ type OrderInfo {
1356
+ firstName: String
1357
+ lastName: String
1358
+ company: String
1359
+ phone: String
1360
+ address: OrderAddress
1531
1361
  }
1532
1362
 
1533
- type PrivateCustomer implements Customer {
1534
- pid: String
1535
- id: ID!
1536
- memberId: String
1537
- email: String
1538
-
1539
- """Customer id for external system"""
1540
- externalId: String
1541
- subscribedToNewsletter: Boolean @deprecated(reason: "Use communication.acceptsEmail")
1542
- language: Language
1543
- billingAddress: CustomerAddress
1544
- deliveryAddresses: [CustomerAddress]
1363
+ type OrderAddress {
1364
+ street: String
1365
+ postcode: String
1366
+ city: String
1367
+ region: String
1545
1368
 
1546
1369
  """
1547
1370
  NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1548
1371
  """
1549
- orderHeaders(
1550
- """Will fetch all if this is set to 0"""
1551
- first: Int = 0
1552
- offset: Int = 0
1553
- ): OrderHeaderResult
1554
- communication: CustomerCommunication
1372
+ country: Country
1373
+ }
1374
+
1375
+ type OrderPaymentMethod {
1376
+ name: String
1377
+ fee: Price
1378
+ }
1379
+
1380
+ type OrderDeliveryMethod {
1381
+ name: String
1382
+ fee: Price
1383
+ tracking: OrderDeliveryMethodTracking
1384
+ }
1385
+
1386
+ type OrderDeliveryMethodTracking {
1387
+ trackingUrl: String
1388
+ trackingUrlText: String
1389
+ }
1390
+
1391
+ type OrderGiftVoucher {
1392
+ name: String
1393
+ amount: Decimal
1394
+ charged: Decimal
1395
+ validUntil: DateTime
1396
+ }
1397
+
1398
+ type OrderAttachment {
1399
+ id: ID!
1400
+ url: String
1401
+ }
1402
+
1403
+ type MyPagesContent {
1404
+ """Text that will show on the landing page on MyPages"""
1405
+ welcomeText: String
1406
+ }
1407
+
1408
+ type CustomerProductList {
1409
+ id: ID!
1410
+ shareToken: String
1411
+ name: String
1412
+ description: String
1555
1413
 
1556
1414
  """
1557
1415
  NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1558
1416
  """
1559
- store: Store
1560
- dynamicContent: String
1561
- externalAttributes: [CustomerExternalAttribute]
1417
+ type: CustomerProductListType
1562
1418
 
1563
1419
  """
1564
1420
  NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1565
1421
  """
1566
- googleUserId: String
1422
+ items: [CustomerProductListItem]
1567
1423
  }
1568
1424
 
1569
- type Product implements Document {
1570
- id: Int!
1571
- articleNumber: String!
1572
- name: String!
1573
- subName: String!
1574
- shortDescription: String!
1575
- description: String!
1425
+ type CustomerProductListType {
1426
+ id: ID!
1427
+ name: String
1428
+ }
1576
1429
 
1577
- """
1578
- Product header if it differs from the actual product name, usually displayed
1579
- instead of the product name in the header tag at the product page.
1580
- """
1581
- mainHeader: String!
1582
- publishedDate: DateTime
1430
+ type CustomerProductListItem {
1431
+ description: String
1432
+ quantity: Int
1433
+ variant: ProductVariant
1583
1434
 
1584
1435
  """
1585
1436
  NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1586
1437
  """
1587
- canonicalCategory: Category
1438
+ product: Product
1439
+ }
1588
1440
 
1589
- """
1590
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1591
- """
1592
- categories(
1593
- """Deprecated, this argument does not affect the result"""
1594
- includeHidden: Boolean = false
1595
- ): [Category]
1441
+ type CustomerLoyalty {
1442
+ bonusChecks: [CustomerLoyaltyBonusCheck]
1443
+ pointCards: [CustomerLoyaltyPointCard]
1444
+ discounts(includeRedeemed: Boolean! = false): [CustomerLoyaltyDiscount]
1596
1445
 
1597
1446
  """
1598
1447
  NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1599
1448
  """
1600
- campaigns: [Category]
1601
- hasVariants: Boolean!
1602
- hasVariantsWithDifferingPrices: Boolean!
1603
- variants: ProductVariants
1604
- images(
1605
- """
1606
- Set this to false if you prefer to manually collate these images with the images found on the Variant.
1607
- """
1608
- includeVariantImages: Boolean = true
1449
+ bonusPoints: CustomerLoyaltyBonusPoints
1450
+ }
1609
1451
 
1610
- """
1611
- Limit the number of images you get back. Defaults to null, which will return all images.
1612
- """
1613
- limit: Int
1614
- ): [ProductImage]
1452
+ type CustomerLoyaltyBonusCheck {
1453
+ externalId: String
1454
+ name: String
1455
+ startDate: DateTime
1456
+ endDate: DateTime
1457
+ redeemed: Boolean
1458
+ redeemedOn: DateTime
1615
1459
 
1616
1460
  """
1617
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1461
+ For display purposes, not guaranteed to match up with a currency on the channel.
1618
1462
  """
1619
- relatedProducts: [Product]
1463
+ currency: String
1464
+ value: Decimal
1465
+ }
1466
+
1467
+ type CustomerLoyaltyPointCard {
1468
+ externalId: String
1469
+ name: String
1470
+ lastStampTime: DateTime
1471
+ numberOfSlots: Int
1472
+ numberOfSlotsRemaining: Int
1473
+ isActive: Boolean
1474
+ }
1475
+
1476
+ type CustomerLoyaltyDiscount {
1477
+ name: String
1478
+ description: String
1479
+ startDate: DateTime
1480
+ endDate: DateTime
1481
+ externalData: CustomerLoyaltyDiscountOfferExternalData
1620
1482
 
1621
1483
  """
1622
1484
  NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1623
1485
  """
1624
- badges: [ProductBadge]
1486
+ category: Category
1487
+ isActivatedByDiscountCode: Boolean!
1488
+ discountCode: String
1489
+ }
1625
1490
 
1626
- """
1627
- The current price.
1628
- - Will be a Customer specific price if that Customer has a separate price list.
1629
- - Will be the member price if Customer is logged in and `Product.hasMemberPrice` is true.
1630
- - Will be the non-member price if Customer is not logged in and `Product.hasMemberPrice` is true.
1631
- """
1632
- price: Price
1633
- hidePrice: Boolean
1491
+ type CustomerLoyaltyDiscountOfferExternalData {
1492
+ name: String
1493
+ description: String
1494
+ startDate: DateTime
1495
+ endDate: DateTime
1496
+ externalId: String
1497
+ externalReference: String
1498
+ heading: String
1499
+ redeemed: Boolean
1500
+ redeemedOn: DateTime
1501
+ imageUrl: String
1502
+ link: String
1503
+ }
1634
1504
 
1635
- """
1636
- The previous price (i.e. this will be higher than `price` if the product is
1637
- discounted). Will be a Customer specific previous price, if that Customer has
1638
- a separate price list.
1639
- """
1640
- previousPrice: Price
1505
+ type CustomerLoyaltyBonusPoints {
1506
+ points: Int
1507
+ }
1641
1508
 
1642
- """
1643
- Default price for the product in the channel, disregards Customer specific prices.
1644
- """
1645
- defaultPrice: Price
1509
+ """
1510
+ The activation status has 4 states;
1511
+ PREEXISTING_CUSTOMER: No customer info will be returned and the customer is advised to login to the preexisting account.
1512
+ ACTIVATION_REQUIRED: The customer account needs to be activated. Email (masked), FirstName (masked) and externalId will be the only fields set on `customer`.
1513
+ ADDITIONAL_USER_DATA_REQUIRED: Additional data needed to register the customer, the existing customer info will be available with masking on customer.
1514
+ NON_EXISTING_CUSTOMER: Customer does not exist in any system and will have to do a sign up.
1515
+ COUNTRY_NOT_VALID: The customer account may not be activated on this channel as it's missing the customer country. Email (masked), FirstName (masked), externalId and countryCode will be the only fields set on `customer`.
1646
1516
 
1647
- """
1648
- Default previous price for the product in the channel, disregards Customer specific prices.
1649
- """
1650
- defaultPreviousPrice: Price
1651
1517
 
1652
- """Not in use. Always null."""
1653
- recommendedPrice: Price
1518
+ """
1519
+ type ExternalCustomerResult {
1520
+ status: ActivationStatusSource
1521
+ customer: ExternalCustomer
1522
+ }
1654
1523
 
1655
- """
1656
- The time interval of the discounted price. If the product has variants, the
1657
- time interval will be that of the variant which price is shown on the product.
1658
- """
1659
- priceDateSpan: ProductPriceDateSpan
1524
+ enum ActivationStatusSource {
1525
+ PREEXISTING_CUSTOMER
1526
+ ACTIVATION_REQUIRED
1527
+ ADDITIONAL_USER_DATA_REQUIRED
1528
+ NON_EXISTING_CUSTOMER
1529
+ COUNTRY_NOT_VALID
1530
+ }
1660
1531
 
1661
- """Indicates if this product and its variants has member prices."""
1662
- hasMemberPrice: Boolean
1532
+ type ExternalCustomer {
1533
+ externalId: String
1534
+ email: MaskedProperty
1535
+ firstName: MaskedProperty
1536
+ lastName: MaskedProperty
1537
+ co: MaskedProperty
1538
+ address: MaskedProperty
1539
+ city: MaskedProperty
1540
+ postalCode: MaskedProperty
1541
+ country: MaskedProperty
1542
+ countryCode: String
1543
+ phoneNumber: MaskedProperty
1544
+ mobilePhoneNumber: MaskedProperty
1545
+ pid: MaskedProperty
1546
+ }
1663
1547
 
1664
- """
1665
- The price a Customer would get if member prices are active and the Customer is logged in.
1666
- - Will be null if `Product.hasMemberPrice` is false.
1667
- - Will be set if `Product.hasMemberPrice` is true.
1668
- """
1669
- memberPrice: Price
1548
+ type MaskedProperty {
1549
+ masked: String
1550
+ encrypted: String
1551
+ }
1670
1552
 
1671
- """
1672
- Specifies input field(s) for the Customer to populate on the Product that will then carry through to the Order.
1673
- If 'required' is true the Product should not be purchasable until the field is populated.
1674
- """
1675
- customerComments: [ProductComment]
1553
+ type PersonLookup {
1554
+ firstName: MaskedProperty
1555
+ lastName: MaskedProperty
1556
+ co: MaskedProperty
1557
+ address: MaskedProperty
1558
+ city: MaskedProperty
1559
+ postalCode: MaskedProperty
1560
+ country: MaskedProperty
1561
+ phoneNumber: MaskedProperty
1562
+ mobilePhoneNumber: MaskedProperty
1563
+ }
1676
1564
 
1677
- """
1678
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1679
- """
1680
- stockStatus: StockStatus
1681
- customFields: [CustomField]
1565
+ type MultipleContent {
1566
+ notFoundIds: [ID]!
1567
+ content: [Content]!
1568
+ }
1682
1569
 
1683
- """
1684
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1685
- """
1686
- warehouseStock(includeInactive: Boolean = false): [Warehouse]
1687
- head: HtmlHead
1570
+ """
1571
+ Every channel has its own URL and can have different design, selection of products, prices and own settings for example shipping and payment.
1572
+ """
1573
+ type Channel {
1574
+ id: Int!
1575
+ name: String
1576
+ displayName: String
1577
+ groupName: String
1578
+ isDefault: Boolean
1579
+ url: Uri
1580
+ settings: ChannelSettings
1581
+ languages: [Language]
1582
+ defaultLanguage: Language
1583
+ currencies: [Currency]
1584
+ defaultCurrency: Currency
1585
+ countries: [Country]
1688
1586
 
1689
1587
  """
1690
- The primary route of this Product. NB: Carries a performance cost, as asking
1691
- for this will result in a separate API call in the backend.
1588
+ The root url of images, this can be used to build image urls if needed.
1692
1589
  """
1693
- primaryRoute: Route
1694
- breadcrumbText: String
1695
- recommendedProducts: RecommendedProducts
1590
+ imageUrl: String
1696
1591
 
1697
- """
1698
- The product is recommended to only be purchasable in multiples of the
1699
- distributionPackageSize. (Different shops may have different levels of
1700
- leniency on this rule).
1701
- """
1702
- distributionPackageSize: Int!
1703
- barcode: String
1592
+ """This channel requires a user to be authorized."""
1593
+ requiresAuth: Boolean
1594
+ }
1704
1595
 
1705
- """
1706
- Configurations on a product are used to assemble a complete product,
1707
-
1708
- For example, if the product is a ring then the ring may have two
1709
- configurations; measures of circumference and choice of engraving
1710
-
1711
- In this field, all the configurations of the product will be presented, the configuration name and its various options.
1712
- """
1713
- configurations: [ProductConfiguration]
1714
- hasConfigurations: Boolean!
1715
- hasFamilyMembers: Boolean!
1596
+ type ChannelSettings {
1597
+ pricesIncVat: Boolean
1598
+ countrySettings: [CountrySettings]
1599
+ tracking: Tracking
1600
+ nostoAccountId: String
1601
+ }
1602
+
1603
+ type CountrySettings {
1604
+ countryCode: String!
1605
+ paymentTypes: [paymentType]
1716
1606
 
1717
1607
  """
1718
- Calculates the price of the product based on the configuration choices that's
1719
- been made. NB: Carries a performance cost, as asking for this will result in a
1720
- separate API call in the backend.
1608
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1721
1609
  """
1722
- configurationPrice(options: [ProductConfigurationPriceInput!]): ProductConfigurationPrice
1610
+ privateCustomerFields: [CustomerField]
1723
1611
 
1724
- """Quantity suffix e.g pcs, box, etc."""
1725
- quantitySuffix: String
1726
- isPreOrder: Boolean
1727
- preOrder: ProductPreOrder
1728
- isPackage: Boolean
1612
+ """
1613
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1614
+ """
1615
+ businessCustomerFields: [CustomerField]
1616
+ shipping: Shipping
1729
1617
 
1730
1618
  """
1731
- ## Description
1732
1619
  NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1733
- ## Error Codes
1734
- ### InvalidAmountOfArticleNumbers
1735
- Number of input products doesn't match package products
1736
- ### InvalidArticleNumber
1737
- Product or variant article number doesn't match any products
1738
- ### UnableToGetPackagePrice
1739
- Failed to calculate package price
1740
1620
 
1621
+ This will use localization, and will work well when requesting one `channel`, but may give unpredictable results when getting multiple channels via `channels`
1741
1622
  """
1742
- package(articleNumbers: [PackagePriceInput]): Package
1623
+ privateCustomerConsents: [Consent]
1743
1624
 
1744
1625
  """
1745
1626
  NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1627
+
1628
+ This will use localization, and will work well when requesting one `channel`, but may give unpredictable results when getting multiple channels via `channels`
1746
1629
  """
1747
- upsell: Upsell
1748
- inPackages: [Product!]
1749
- hasUpsell: Boolean
1630
+ businessCustomerConsents: [Consent]
1631
+ }
1632
+
1633
+ type paymentType {
1634
+ name: String!
1635
+ apiClientId: String!
1636
+ availableForBusiness: Boolean!
1637
+ availableForPrivate: Boolean!
1638
+ }
1639
+
1640
+ type CustomerField {
1641
+ id: ID!
1642
+ required: Boolean!
1643
+ pattern: String
1644
+ fields: [CustomerField]
1645
+ name: ID!
1646
+ }
1750
1647
 
1648
+ type Shipping {
1751
1649
  """
1752
- All other products in the same family as the product. NB: Carries a
1753
- performance cost, as asking for this will result in a separate API call in the backend.
1650
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1754
1651
  """
1755
- familyMembers: [Product!]
1756
-
1757
- """Get Product History within the set number of days"""
1758
- history(
1759
- """number of days, default is 30"""
1760
- days: Int = 30
1761
- ): ProductHistory
1652
+ freeShippingLimit: FreeShippingLimit
1762
1653
  }
1763
1654
 
1764
- type ProductAutoCompleteResult {
1765
- result: [Product]!
1655
+ type FreeShippingLimit {
1656
+ incVat: Decimal
1657
+ exVat: Decimal
1766
1658
  }
1767
1659
 
1768
- type ProductBadge {
1660
+ type Consent {
1661
+ id: ID!
1769
1662
  name: String
1770
- url: Uri
1771
- location: ProductBadgeLocation
1772
- style: String
1663
+ title: String
1773
1664
  text: String
1665
+ linkText: String
1666
+ page: Page
1667
+ isMandatory: Boolean
1774
1668
  }
1775
1669
 
1776
- enum ProductBadgeLocation {
1777
- CUSTOM
1778
- TOP_LEFT
1779
- TOP_RIGHT
1780
- BOTTOM_LEFT
1781
- BOTTOM_RIGHT
1670
+ type Tracking {
1671
+ ga: GoogleAnalytics
1672
+ ga4: GoogleAnalytics4
1673
+ gtm: GoogleTagManager
1674
+ fca: FacebookConversionsApi
1782
1675
  }
1783
1676
 
1784
- type ProductComment {
1785
- name: String!
1786
- required: Boolean!
1677
+ type GoogleAnalytics {
1678
+ trackingId: String
1679
+ useArticleNumberAsId: Boolean
1787
1680
  }
1788
1681
 
1789
- type ProductConfiguration {
1790
- name: String
1791
- options: [ProductConfigurationOption]!
1682
+ type GoogleAnalytics4 {
1683
+ trackingId: String
1684
+ useArticleNumberAsId: Boolean
1792
1685
  }
1793
1686
 
1794
- """
1795
- Options by which you can configure a product.
1796
-
1797
- For instance, if you're selling rope the available options might be the dimensions; 10mm, 20mm, 30mm, etc.
1687
+ type GoogleTagManager {
1688
+ containerId: String
1689
+ useGa4Events: Boolean
1690
+ }
1798
1691
 
1799
- Price is either used as is, or if the configuration is using a price calculation
1800
- (e.g. the rope is priced by length) it will be used in the calculation formula;
1801
- e.g. (Length * Price).
1802
- """
1803
- type ProductConfigurationOption {
1804
- id: ID!
1805
- name: String
1806
- price: Price
1692
+ type FacebookConversionsApi {
1693
+ accessToken: String
1694
+ pixelId: String
1695
+ }
1807
1696
 
1808
- """
1809
- This will be set if the configuration requires price calculation, e.g. you might sell rope and price it by length.
1810
- """
1811
- priceCalculation: ProductConfigurationPriceCalculation
1697
+ type Cart {
1698
+ id: String
1699
+ totalQuantity: Int
1700
+ productTotal: Price
1701
+ productPreviousTotal: Price
1702
+ discountTotal: Price
1703
+ aggregatedDiscounts: [Discount]
1704
+ externalCheckoutUrl: Uri
1705
+ items: [CartItem]
1812
1706
  }
1813
1707
 
1814
- type ProductConfigurationPrice {
1815
- price: Price
1816
- previousPrice: Price
1708
+ type Discount {
1709
+ externalId: ID
1710
+ name: String
1711
+ value: Price
1712
+ type: DiscountType
1713
+ description: String
1714
+ campaign: Category
1817
1715
  }
1818
1716
 
1819
- """
1820
- Describes how the price is calculated on a configuration option.
1717
+ enum DiscountType {
1718
+ """No discount defined"""
1719
+ UNDEFINED
1821
1720
 
1822
- E.g. the configuration is for a carpet and it has a price calculation formula that reads: 'Width * Length * Price / 10000'.
1721
+ """Discount drops price of the order total by defined amount"""
1722
+ FIXED_AMOUNT
1823
1723
 
1824
- In this case, the variables would contain 'Width' and 'Length' whereas the 'Price' is taken from the selected option.
1825
- """
1826
- type ProductConfigurationPriceCalculation {
1827
- id: ID!
1828
- name: String
1829
- formula: String
1830
- variables: [ProductConfigurationPriceCalculationVariable]
1831
- }
1724
+ """Discount drops price of the product by X %"""
1725
+ PERCENT
1832
1726
 
1833
- type ProductConfigurationPriceCalculationVariable {
1834
- id: ID!
1835
- name: String
1836
- }
1727
+ """
1728
+ Discount will get the amount of the cheapest product and use this as a discount
1729
+ """
1730
+ ITEMS
1837
1731
 
1838
- input ProductConfigurationPriceInput {
1839
- optionId: ID!
1840
- }
1732
+ """
1733
+ Discount drops total price of the product if there is at least X of them in cart
1734
+ """
1735
+ ITEMS_PERCENTAGE_LIMIT
1841
1736
 
1842
- enum ProductCustomFieldType {
1843
- STRING
1844
- BOOL
1845
- LIST
1846
- HTML
1847
- MULTI_LEVEL_LIST
1848
- }
1737
+ """Only a collection of products"""
1738
+ ONLY_USE_LANDING_PAGE
1849
1739
 
1850
- type ProductHistory {
1851
- previousPrice: [PriceHistory]
1852
- }
1740
+ """Discount drops price of the least expensive product in cart"""
1741
+ PERCENT_ON_LEAST_EXPENSIVE_ITEM
1742
+
1743
+ """Discount drops price of the most expensive product in cart"""
1744
+ PERCENT_ON_MOST_EXPENSIVE_ITEM
1745
+
1746
+ """Discount allows to get a free gift when the product is added"""
1747
+ FREE_PRODUCT
1748
+
1749
+ """Discount allows to get free shipping option for the product"""
1750
+ FREE_SHIPPING
1853
1751
 
1854
- type ProductImage {
1855
1752
  """
1856
- Alternate text for the image, commonly used for the alt attribute of img-tags.
1753
+ Discount drops price for the package when all products in the package is added to cart
1857
1754
  """
1858
- alt: String
1755
+ PACKAGE_DISCOUNT
1756
+
1757
+ """Discount on the order total from a voucher"""
1758
+ BONUS_VOUCHER_DISCOUNT
1859
1759
 
1860
1760
  """
1861
- Extra information, commonly used for the title attribute of img-tag. Should be shown on hover.
1761
+ Discount allows to buy amount of X of the article, but pay only for amount of Y
1862
1762
  """
1863
- title: String
1864
- sizes: [ProductImageSize]! @deprecated(reason: "Images will no longer be offered in different sizes. Instead use 'url' in conjunction with our image resizing service.")
1865
- url: Uri
1866
- modifiedDate: String
1763
+ BUY_X_ARTICLES_PAY_Y_AMOUNT
1867
1764
  }
1868
1765
 
1869
- type ProductImageSize {
1870
- width: Int
1871
- height: Int
1872
- url: Uri
1873
- }
1766
+ type CartItem {
1767
+ id: String!
1768
+ quantity: Int!
1769
+ articleNumber: String!
1770
+ images: [ProductImage] @deprecated(reason: "Please use images on product instead.")
1771
+ subHeading: String
1772
+ variant: ProductVariant
1773
+ variantOptionNames: [String]
1774
+ customerComments: [CartItemComment]
1775
+ discounts: [Discount]
1874
1776
 
1875
- enum ProductOrderOptions {
1876
- ARTICLE_NUMBER
1877
- NAME
1878
- PUBLISH_DATE
1879
- PRICE
1880
- SUB_HEADING
1881
- CUSTOM
1882
- BESTSELLER
1883
- }
1777
+ """Total price, including discounts"""
1778
+ total: Price!
1884
1779
 
1885
- type ProductPreOrder {
1886
- fromDate: DateTime
1887
- toDate: DateTime
1888
- }
1780
+ """Total price, excluding discounts"""
1781
+ previousTotal: Price!
1889
1782
 
1890
- type ProductPriceDateSpan {
1891
- startDate: DateTime
1892
- endDate: DateTime
1783
+ """Unit price, including discounts"""
1784
+ unitPrice: Price!
1785
+
1786
+ """Unit price, excluding discounts"""
1787
+ previousUnitPrice: Price!
1788
+
1789
+ """Discount total"""
1790
+ discount: Price
1791
+ product: Product
1792
+ configurations: [SelectedProductConfiguration]
1793
+ preOrderDate: DateTime
1893
1794
  }
1894
1795
 
1895
- type ProductSearchResult {
1896
- result: [Product]!
1897
- filters: [Filter]
1898
- totalResults: Int
1796
+ type CartItemComment {
1797
+ name: String
1798
+ value: String
1899
1799
  }
1900
1800
 
1901
- type ProductSortOrder {
1902
- text: String!
1903
- value: ProductOrderOptions!
1904
- isDefault: Boolean!
1905
- defaultDirection: SortDirection!
1801
+ type SelectedProductConfiguration {
1802
+ name: String
1803
+ option: SelectedProductConfigurationOption!
1906
1804
  }
1907
1805
 
1908
- type ProductVariant {
1909
- id: String!
1910
- articleNumber: String!
1806
+ type SelectedProductConfigurationOption {
1807
+ id: ID!
1808
+ name: String
1809
+ }
1911
1810
 
1912
- """Variant values (combination of option values)"""
1913
- values: [String]!
1811
+ type Mutation {
1812
+ subscribeToStockNotifications(email: String!, articleNumber: String!): Boolean
1914
1813
 
1915
1814
  """
1916
- The current price.
1917
- - Will be a Customer specific price if that Customer has a separate price list.
1918
- - Will be the member price if Customer is logged in and `Product.hasMemberPrice` is true.
1919
- - Will be the non-member price if Customer is not logged in and `Product.hasMemberPrice` is true.
1815
+ This mutation's purpose is to subscribe a customer to a newsletter. In order to subscribe a customer a valid email address is required
1816
+
1817
+ Responds with a boolean value whether the subscription has been successful or not
1920
1818
  """
1921
- price: Price
1819
+ subscribeToNewsletter(email: String!): Boolean
1922
1820
 
1923
1821
  """
1924
- The previous price (i.e. this will be higher than `price` if the product is
1925
- discounted). Will be a Customer specific previous price, if that Customer has
1926
- a separate price list.
1822
+ ## Description
1823
+ Adds items to product list, null id adds items to the default product list.
1824
+ ## Error Codes
1825
+ ### Unauthorized
1826
+ Unauthorized
1827
+ ### AddToProductListFailed
1828
+ Error in underlying API call, more info may be contained in the error message.
1829
+ ### InvalidArticleNumber
1830
+ Article number cannot be empty
1831
+ ### ProductNotFound
1832
+ No match on article number
1833
+ ### MoreThanOneMatchOnArticleNumber
1834
+ Article number matched more than one article
1835
+
1927
1836
  """
1928
- previousPrice: Price
1837
+ addToCustomerProductList(id: ID, items: [AddToCustomerProductListInput!]!): CustomerProductListResult
1929
1838
 
1930
1839
  """
1931
- Default price for the product in the channel, disregards Customer specific prices.
1840
+ ## Description
1841
+ Creates a product list for a logged in customer
1842
+ ## Error Codes
1843
+ ### Unauthorized
1844
+
1845
+ ### UnableToCreateProductList
1846
+ Error in underlying API call, more info may be contained in the error message.
1847
+
1932
1848
  """
1933
- defaultPrice: Price
1849
+ createCustomerProductList(input: CreateCustomerProductListInput!): CustomerProductListResult
1934
1850
 
1935
1851
  """
1936
- Default previous price for the product in the channel, disregards Customer specific prices.
1852
+ ## Description
1853
+ Deletes a product list for a logged in customer
1854
+ ## Error Codes
1855
+ ### Unauthorized
1856
+
1857
+ ### ProductListNotFound
1858
+ Argument `id` did not match any list for this customer.
1859
+ ### UnableToDeleteProductList
1860
+ Error in underlying API call, more info may be contained in the error message.
1861
+
1937
1862
  """
1938
- defaultPreviousPrice: Price
1939
-
1940
- """Not in use. Always null."""
1941
- recommendedPrice: Price
1942
-
1943
- """The time interval of the discounted price."""
1944
- priceDateSpan: ProductPriceDateSpan
1863
+ deleteCustomerProductList(id: ID!): DeleteCustomerProductListResult
1945
1864
 
1946
1865
  """
1947
- The price a Customer would get if member prices are active and the Customer is logged in.
1948
- - Will be null if `Product.hasMemberPrice` is false.
1949
- - Will be set if `Product.hasMemberPrice` is true.
1866
+ ## Description
1867
+ Removes an item from a product list for a logged in customer, null id removes item in the default product list.
1868
+ ## Error Codes
1869
+ ### Unauthorized
1870
+
1871
+ ### ProductListNotFound
1872
+ Argument `id` did not match any list for this customer.
1873
+ ### RemoveFromProductListFailed
1874
+ Error in underlying API call, more info may be contained in the error message.
1875
+ ### ProductNotFound
1876
+ Argument `articleNumbers` did not match any products or variants.
1877
+ ### MoreThanOneMatchOnArticleNumber
1878
+ Argument `articleNumbers` matched more than one product/variant.
1879
+ ### InvalidArticleNumber
1880
+ Argument `articleNumbers` cannot be null or empty.
1881
+
1950
1882
  """
1951
- memberPrice: Price
1883
+ removeFromCustomerProductList(id: ID, articleNumbers: [String!]): CustomerProductListResult
1952
1884
 
1953
1885
  """
1954
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1886
+ ## Description
1887
+ Updates an item in product list, null id updates item in the default product list.
1888
+ ## Error Codes
1889
+ ### Unauthorized
1890
+
1891
+ ### ProductListNotFound
1892
+ Argument `id` did not match any list for this customer.
1893
+ ### UnableToUpdateProductListItem
1894
+ Error in underlying API call, more info may be contained in the error message.
1895
+ ### ProductNotFound
1896
+ Argument `articleNumber` did not match any products or variants.
1897
+ ### MoreThanOneMatchOnArticleNumber
1898
+ Argument `articleNumber` matched more than one product/variant.
1899
+ ### InvalidArticleNumber
1900
+ Argument `articleNumber` cannot be null or empty.
1901
+
1955
1902
  """
1956
- stockStatus: StockStatus
1903
+ updateCustomerProductListItem(input: UpdateCustomerProductListItemInput!): CustomerProductListResult
1957
1904
 
1958
1905
  """
1959
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
1906
+ ## Description
1907
+ Updates a product list for a logged in customer
1908
+ ## Error Codes
1909
+ ### Unauthorized
1910
+
1911
+ ### ProductListNotFound
1912
+ Argument `id` did not match any list for this customer.
1913
+ ### UnableToUpdateProductList
1914
+ Error in underlying API call, more info may be contained in the error message.
1915
+
1960
1916
  """
1961
- warehouseStock(includeInactive: Boolean = false): [Warehouse]
1962
- images: [ProductImage]
1963
- barcode: String
1964
-
1965
- """Get Product History within the set number of days"""
1966
- history(
1967
- """number of days, default is 30"""
1968
- days: Int = 30
1969
- ): ProductVariantHistory
1970
- }
1917
+ updateCustomerProductList(input: UpdateCustomerProductListInput!): CustomerProductListResult
1971
1918
 
1972
- type ProductVariantHistory {
1973
- previousPrice: [PriceHistory]
1974
- }
1919
+ """
1920
+ Error codes: CustomerNotFound, CustomerAlreadyActivated, UnableToActivateCustomer, UnableToLoginCustomer, InvalidCustomerActivateInput
1921
+ """
1922
+ activateExternalCustomerById(input: ActivateExternalCustomerByIdInput): ActivateExternalCustomerByIdResult
1975
1923
 
1976
- type ProductVariantOption {
1977
- name: String
1978
- values: [String]!
1979
- }
1924
+ """
1925
+ Error codes: CustomerNotFound, CustomerAlreadyActivated, UnableToActivateCustomer, UnableToLoginCustomer, InvalidCustomerActivateInput
1926
+ """
1927
+ activateExternalCustomerByToken(input: ActivateExternalCustomerByTokenInput): ActivateExternalCustomerByTokenResult
1980
1928
 
1981
- type ProductVariants {
1982
- """Available product variant options."""
1983
- options: [ProductVariantOption]!
1929
+ """
1930
+ This mutation deletes a customer. An authorization token is needed in the request, in order to be able to delete the customer.
1931
+ """
1932
+ deleteCustomer: Boolean
1933
+ loginExternalCustomer(input: LoginExternalCustomerInput): LoginExternalCustomerResult
1984
1934
 
1985
- """Product variants, contains all possible values of options."""
1986
- values: [ProductVariant]!
1987
- }
1935
+ """
1936
+ LoginMutation will log a user in.
1937
+ One of email, pid, externalId, memberNumber or customerId is required, along with a password.
1938
+ Returns an authorization token if the login was successful.
1939
+ """
1940
+ login(password: String, email: String, pid: String, externalId: String, memberNumber: String, externalHashId: String, timeStamp: String, customerId: Int): LoginResponse
1988
1941
 
1989
- type Query {
1990
- store(id: Int!): Store
1991
- stores(includeInactive: Boolean! = false): [Store]!
1992
- startPage(id: Int): StartPage
1993
- searchAutoComplete(term: String!): SearchAutoCompleteResult
1994
- search(term: String!): SearchResult
1942
+ """
1943
+ Requires a valid email and returns boolean value if successful, otherwise an error will be thrown
1944
+ """
1945
+ requestPasswordReset(email: String!): RequestPasswordResetResult
1995
1946
 
1996
- """get product, category or page by path."""
1997
- route(path: String!): Route
1998
- product(articleNumber: String, id: Int, barcode: String): Product
1999
- products(articleNumbers: [String], ids: [Int], barcodes: [String]): [Product]!
1947
+ """
1948
+ Requires a valid resetPasswordToken and a new password and if successful will return a authentication token
1949
+ """
1950
+ resetPassword(
1951
+ """A reset password token that is solely used during a password reset"""
1952
+ resetPasswordToken: String!
1953
+ newPassword: String!
1954
+ ): ResetPassword
2000
1955
 
2001
- """Fetch a single page by ID."""
2002
- page(id: Int!): Page
1956
+ """
1957
+ The SignUp-mutation is used for creating a customer.
1958
+
1959
+ If the sign up is successful the customer may be considered to be logged on and an authentication token will be returned
1960
+ """
1961
+ signUp(input: SignUpInput!): SignUpResponse
2003
1962
 
2004
1963
  """
2005
- Fetch all non-hidden pages. If you are using nested pages, only root level pages will be returned.
1964
+ ## Description
1965
+ This mutation's purpose is to update a existing customer's group using an access code. An authorization token is needed in the request, in order to be able to update the customer.
1966
+ ## Error Codes
1967
+ ### Unauthorized
1968
+ Unauthorized
1969
+ ### UnableToUpdateCustomer
1970
+ Error in underlying API call, more info may be contained in the error message.
1971
+ ### CustomerAlreadyUpdated
1972
+ Customer already in the customer group
1973
+ ### CustomerNotFound
1974
+ No match on customer with access code
1975
+
2006
1976
  """
2007
- pages: [Page]!
1977
+ updateCustomerGroup(customerGroupAccessCode: String!): UpdateCustomerGroupResult
2008
1978
 
2009
- """fetch order by id"""
2010
- order(
2011
- """Deprecated, please use the `orderId`-argument"""
2012
- id: Int
2013
- orderId: ID
2014
- ): Order
1979
+ """
1980
+ This mutation's purpose is to update an existing customer's information. An authorization token is needed in the request, in order to be able to update the customer.
1981
+ """
1982
+ updateCustomer(input: CustomerUpdateInput!): CustomerUpdateResponse
2015
1983
 
2016
- """Fetches my pages content"""
2017
- myPagesContent: MyPagesContent
1984
+ """
1985
+ This mutation's purpose is to update a existing customer's price list using an access code. An authorization token is needed in the request, in order to be able to update the customer.
1986
+ """
1987
+ updateCustomerPriceList(priceListAccessCode: String!): UpdateCustomerPriceListResult
2018
1988
 
2019
- """get customer product list by id, null gets default product list"""
2020
- customerProductList(id: ID, shareToken: String): CustomerProductList
2021
- customerProductLists: [CustomerProductList]!
1989
+ """
1990
+ The updatePassword mutation updates the customers password. Both the old password and a new password is a requirement.
1991
+ """
1992
+ updatePassword(oldPassword: String!, newPassword: String!): UpdatePasswordResult
2022
1993
 
2023
- """Fetches customer-unique offers"""
2024
- customerLoyalty: CustomerLoyalty
1994
+ """
1995
+ Adds products to the cart where you can add comments to the products and determine their quantities. Replies with the affected cart if a cartId has been presented, otherwise a new cart will be created.
1996
+ """
1997
+ addMultipleToCart(
1998
+ """Not specifying cart id will create new cart."""
1999
+ cartId: String
2000
+ items: [AddMultipleToCartInput]!
2001
+ ): CartMutation
2025
2002
 
2026
- """Lookup a customer by a mobile phone number"""
2027
- customerLookup(phoneNumber: String): Customer
2028
- customer: Customer
2003
+ """
2004
+ Adds a product to the cart where you can add a comment to the product and determine the quantity. Replies with the affected cart if a cartId has been presented, otherwise a new cart will be created.
2005
+ """
2006
+ addToCart(input: AddToCartInput!): CartMutation
2029
2007
 
2030
2008
  """
2031
- Used in the sign up process when the shop has a third party customer repository, e.g. Voyado.
2032
-
2033
- Error codes: INVALID_VALUE (if `key` is null), ExternalCustomerLookupFailed
2009
+ This mutation is used to reduce the quantity of a product in the cart, replies with the affected cart ruled by the cartId in the input.
2034
2010
  """
2035
- externalCustomerLookup(key: String): ExternalCustomerResult
2011
+ decrementItemQuantity(input: ChangeByOneItemQuantityInput!): CartMutation
2036
2012
 
2037
- """Get information on person by Key(personal id number or phone number)"""
2038
- personLookup(key: String!): PersonLookup
2013
+ """
2014
+ Used to add a specific quantity to a product in the cart. Replies with the affected cart ruled by the cartId in the input
2015
+ """
2016
+ setItemQuantity(input: SetItemQuantityInput!): CartMutation
2039
2017
 
2040
2018
  """
2041
- Returns content found, either by a list of content Ids, or filtered by tags.
2042
- In the case of filtering by ids, not found content Ids are listed as well.
2019
+ This mutation is used to increase the quantity of a product in the cart, replies with the affected cart ruled by the cartId in the input
2043
2020
  """
2044
- content(ids: [String], tags: [String]): MultipleContent
2045
-
2046
- """get channel by id, null gets default channel"""
2047
- channel(id: String): Channel
2021
+ incrementItemQuantity(input: ChangeByOneItemQuantityInput!): CartMutation
2048
2022
 
2049
- """get all channels"""
2050
- channels: [Channel]!
2023
+ """Removes a specific product in the cart, replies with the affected cart"""
2024
+ removeFromCart(input: RemoveFromCartInput!): CartMutation
2051
2025
 
2052
- """get categories by channel id, culture, root and culture"""
2053
- categories(
2054
- """category id of root parent, null or omit means all"""
2055
- root: Int
2026
+ """Removes specific items from the cart, replies with the affected cart"""
2027
+ removeMultipleFromCart(input: RemoveMultipleFromCartInput!): CartMutation
2056
2028
 
2057
- """
2058
- number of levels to traverse in the category tree, null or omit means all
2059
- """
2060
- levels: Int = 1
2029
+ """Responds with the affected cart."""
2030
+ updateCart(input: UpdateCartInput!): UpdateCartMutation
2031
+ }
2061
2032
 
2062
- """Deprecated, this argument does not affect the result"""
2063
- includeHidden: Boolean = false
2064
- ): [Category]!
2033
+ type CustomerProductListResult {
2034
+ success: Boolean
2065
2035
 
2066
- """get category by id"""
2067
- category(id: ID!): Category
2068
- cart(id: String): Cart
2036
+ """
2037
+ NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
2038
+ """
2039
+ customerProductList: CustomerProductList
2069
2040
  }
2070
2041
 
2071
- input RangeFilterInput {
2072
- id: String!
2073
- min: Decimal
2074
- max: Decimal
2042
+ input AddToCustomerProductListInput {
2043
+ articleNumber: String!
2044
+ quantity: Int = 1
2045
+ description: String
2075
2046
  }
2076
2047
 
2077
- type RecommendedProducts {
2078
- """Customers who bought this product also bought these products."""
2079
- bought(
2080
- """number of recommended products to fetch"""
2081
- count: Int = 4
2082
- ): [Product]
2083
-
2084
- """Customers who viewed this product also viewed these products."""
2085
- viewed(
2086
- """number of recommended products to fetch"""
2087
- count: Int = 4
2088
- ): [Product]
2089
-
2090
- """A shuffled top list of popular products."""
2091
- shuffledToplist(
2092
- """number of recommended products to fetch"""
2093
- count: Int = 4
2094
- ): [Product]
2048
+ input CreateCustomerProductListInput {
2049
+ """The type of list created. Omit this and the default type will be used."""
2050
+ typeId: Int
2051
+ name: String!
2052
+ description: String
2095
2053
  }
2096
2054
 
2097
- input RemoveFromCartInput {
2098
- cartId: String!
2099
- itemId: String!
2055
+ type DeleteCustomerProductListResult {
2056
+ success: Boolean
2100
2057
  }
2101
2058
 
2102
- input RemoveMultipleFromCartInput {
2103
- cartId: String!
2104
- itemIds: [String!]!
2059
+ input UpdateCustomerProductListItemInput {
2060
+ id: ID!
2061
+ articleNumber: String!
2062
+
2063
+ """Default value is 1."""
2064
+ quantity: Int
2065
+ description: String
2105
2066
  }
2106
2067
 
2107
- type RequestPasswordResetResult {
2108
- success: Boolean!
2068
+ input UpdateCustomerProductListInput {
2069
+ id: ID!
2070
+ typeId: ID!
2071
+ name: String!
2072
+ description: String
2109
2073
  }
2110
2074
 
2111
- type ResetPassword {
2112
- token: Token!
2075
+ type ActivateExternalCustomerByIdResult {
2076
+ success: Boolean!
2077
+ token: Token
2113
2078
  }
2114
2079
 
2115
2080
  """
2116
- Represents a route to either a Category, a Product, a Page or the StartPage.
2081
+ Authorization token that is used for customer actions such as login, delete or update
2082
+ The token contains three different roles:
2083
+ 0: Standard.
2084
+ 1: Lite
2085
+ 2: VoyadoSemiLogin
2117
2086
  """
2118
- type Route {
2119
- id: String!
2120
- path: String!
2121
- canonicalPath: String
2122
- slug: String!
2123
-
2124
- """
2125
- The Category, Product, Page or StartPage that the Route resolves to. NB:
2126
- Carries a performance cost, as asking for this will result in a separate API
2127
- call in the backend.
2128
- """
2129
- object: Document
2130
-
2131
- """
2132
- Parents are resolved by traversing the path, starting from the end, and are
2133
- guaranteed to be returned in that order. NB: Carries a performance cost, as
2134
- asking for this will result in a different, slightly more expensive (the more
2135
- categories a shop has, the more expensive this gets), route query in the backend.
2136
- """
2137
- parents: [Route]
2087
+ type Token {
2088
+ value: String!
2089
+ }
2138
2090
 
2139
- """
2140
- Alternative routes for this object, if it exists in another channel and/or in
2141
- another language.NB: Carries no additional performance cost.
2142
- """
2143
- alternateRoutes: [AlternateRoute]
2091
+ input ActivateExternalCustomerByIdInput {
2092
+ externalCustomerId: String!
2093
+ }
2144
2094
 
2145
- """N.B. for troubleshooting routes only!"""
2146
- debug: String
2095
+ type ActivateExternalCustomerByTokenResult {
2096
+ success: Boolean!
2097
+ customer: ExternalCustomer
2098
+ }
2147
2099
 
2148
- """Breadcrumb texts; starting with the root parent, ending on this route."""
2149
- breadcrumbs: [String]
2100
+ input ActivateExternalCustomerByTokenInput {
2101
+ externalCustomerToken: String!
2150
2102
  }
2151
2103
 
2152
- type SearchAutoCompleteResult {
2153
- """
2154
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
2155
- """
2156
- products: ProductAutoCompleteResult
2104
+ type LoginExternalCustomerResult {
2105
+ token: Token
2106
+ }
2157
2107
 
2158
- """
2159
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
2160
- """
2161
- categories(first: Paging = 12): CategoryAutoCompleteResult
2108
+ input LoginExternalCustomerInput {
2109
+ externalCustomerToken: String!
2162
2110
  }
2163
2111
 
2164
- type SearchResult {
2165
- products(paging: PagingInput = {first: 12, offset: 0}, filters: FilterInput = {listFilters: [], rangeFilters: [], booleanFilters: [], multiListFilters: []}): ProductSearchResult
2112
+ """
2113
+ The response will contain a authorization token if the login was successful
2114
+ """
2115
+ type LoginResponse {
2116
+ token: Token!
2117
+ }
2166
2118
 
2167
- """
2168
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
2169
- """
2170
- categories(paging: PagingInput = {first: 12, offset: 0}): CategorySearchResult
2119
+ type RequestPasswordResetResult {
2120
+ success: Boolean!
2171
2121
  }
2172
2122
 
2173
- type SelectedProductConfiguration {
2174
- name: String
2175
- option: SelectedProductConfigurationOption!
2123
+ type ResetPassword {
2124
+ token: Token!
2176
2125
  }
2177
2126
 
2178
- type SelectedProductConfigurationOption {
2179
- id: ID!
2180
- name: String
2127
+ type SignUpResponse {
2128
+ token: Token!
2181
2129
  }
2182
2130
 
2183
- input SetItemQuantityInput {
2184
- cartId: String!
2185
- itemId: String!
2186
- quantity: Int!
2131
+ input SignUpInput {
2132
+ type: CustomerType!
2133
+ pid: String
2134
+ organizationNumber: String
2135
+ emailAddress: String!
2136
+ password: String
2137
+
2138
+ """Customer id for external system"""
2139
+ externalId: String
2140
+ billingAddress: SignUpBillingAddressInput!
2141
+ deliveryAddresses: [SignUpDeliveryAddressInput]
2142
+ preferences: SignUpPreferencesInput
2143
+ consents: [SignUpConsentInput]
2144
+ externalAttributes: [SignUpExternalAttribute]
2145
+ dynamicContent: String
2146
+ priceListAccessCode: String
2187
2147
  }
2188
2148
 
2189
- type Shipping {
2190
- """
2191
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
2192
- """
2193
- freeShippingLimit: FreeShippingLimit
2149
+ enum CustomerType {
2150
+ PRIVATE
2151
+ COMPANY
2194
2152
  }
2195
2153
 
2196
2154
  """
2197
- BillingAddress itself is a required field. Whether fields belonging to
2198
- BillingAddress are required is determined by privateCustomerFields or
2199
- businessCustomerFields, found on channel.settings.countrySettings.
2155
+ BillingAddress itself is a required field. Whether fields belonging to BillingAddress are required is determined by privateCustomerFields or businessCustomerFields, found on channel.settings.countrySettings.
2200
2156
  """
2201
2157
  input SignUpBillingAddressInput {
2202
2158
  mobilePhone: SignUpPropertyInput
@@ -2215,12 +2171,86 @@ input SignUpBillingAddressInput {
2215
2171
  firstName: SignUpPropertyInput
2216
2172
  }
2217
2173
 
2218
- input SignUpConsentInput {
2219
- id: String
2220
- value: Boolean
2174
+ """
2175
+ This input is used for fields that can be auto filled with PersonLookup
2176
+ """
2177
+ input SignUpPropertyInput {
2178
+ """
2179
+ If the user has made no change this should contain the encrypted value from PersonLookup, otherwise populate with the user input.
2180
+ """
2181
+ value: String
2182
+
2183
+ """Specifies if the value field is encrypted or not."""
2184
+ hasChanged: Boolean
2185
+ }
2186
+
2187
+ input SignUpDeliveryAddressInput {
2188
+ mobilePhone: String
2189
+ phone: String
2190
+ region: String
2191
+ countryCode: String
2192
+ city: String
2193
+ postalCode: String
2194
+ streetName: String
2195
+ co: String
2196
+ department: String
2197
+ municipality: String
2198
+ companyAtt: String
2199
+ company: String
2200
+ lastName: String
2201
+ firstName: String
2202
+ addressName: String
2203
+ }
2204
+
2205
+ input SignUpPreferencesInput {
2206
+ type: SignUpPreferencesCommunicationInput
2207
+ storeLocationId: Int
2208
+ }
2209
+
2210
+ input SignUpPreferencesCommunicationInput {
2211
+ acceptsEmail: Boolean
2212
+ acceptsPostal: Boolean
2213
+ acceptsSms: Boolean
2214
+ culture: String
2215
+ }
2216
+
2217
+ input SignUpConsentInput {
2218
+ id: String
2219
+ value: Boolean
2220
+ }
2221
+
2222
+ input SignUpExternalAttribute {
2223
+ name: String!
2224
+ value: String!
2225
+ }
2226
+
2227
+ type UpdateCustomerGroupResult {
2228
+ success: Boolean!
2229
+ }
2230
+
2231
+ """
2232
+ Responds with a bool value whether the update has been successful or not
2233
+ """
2234
+ type CustomerUpdateResponse {
2235
+ success: Boolean!
2236
+ }
2237
+
2238
+ input CustomerUpdateInput {
2239
+ pid: String
2240
+ emailAddress: String
2241
+ organizationNumber: String
2242
+ billingAddress: CustomerUpdateBillingAddressInput!
2243
+ deliveryAddresses: [CustomerUpdateDeliveryAddressInput]
2244
+ preferences: CustomerUpdatePreferenceInput
2245
+ consents: [CustomerUpdateConsentInput]
2246
+ externalAttributes: [CustomerUpdateExternalAttribute]
2247
+ dynamicContent: String
2221
2248
  }
2222
2249
 
2223
- input SignUpDeliveryAddressInput {
2250
+ """
2251
+ Fields that are required to have a value is determined by CustomerFields found in CountrySettings
2252
+ """
2253
+ input CustomerUpdateBillingAddressInput {
2224
2254
  mobilePhone: String
2225
2255
  phone: String
2226
2256
  region: String
@@ -2238,220 +2268,123 @@ input SignUpDeliveryAddressInput {
2238
2268
  addressName: String
2239
2269
  }
2240
2270
 
2241
- input SignUpExternalAttribute {
2242
- name: String!
2243
- value: String!
2271
+ input CustomerUpdateDeliveryAddressInput {
2272
+ """If this field is left empty, a new DeliveryAddress will be created."""
2273
+ id: Int
2274
+ mobilePhone: String
2275
+ phone: String
2276
+ region: String
2277
+ countryCode: String
2278
+ city: String
2279
+ postalCode: String
2280
+ streetName: String
2281
+ co: String
2282
+ department: String
2283
+ municipality: String
2284
+ companyAtt: String
2285
+ company: String
2286
+ lastName: String
2287
+ firstName: String
2288
+ addressName: String
2244
2289
  }
2245
2290
 
2246
- input SignUpInput {
2247
- type: CustomerType!
2248
- pid: String
2249
- organizationNumber: String
2250
- emailAddress: String!
2251
- password: String
2252
-
2253
- """Customer id for external system"""
2254
- externalId: String
2255
- billingAddress: SignUpBillingAddressInput!
2256
- deliveryAddresses: [SignUpDeliveryAddressInput]
2257
- preferences: SignUpPreferencesInput
2258
- consents: [SignUpConsentInput]
2259
- externalAttributes: [SignUpExternalAttribute]
2260
- dynamicContent: String
2261
- priceListAccessCode: String
2291
+ input CustomerUpdatePreferenceInput {
2292
+ type: CustomerUpdatePreferencesCommunicationInput
2293
+ storeLocationId: Int
2262
2294
  }
2263
2295
 
2264
- input SignUpPreferencesCommunicationInput {
2296
+ input CustomerUpdatePreferencesCommunicationInput {
2265
2297
  acceptsEmail: Boolean
2266
2298
  acceptsPostal: Boolean
2267
2299
  acceptsSms: Boolean
2268
2300
  culture: String
2269
2301
  }
2270
2302
 
2271
- input SignUpPreferencesInput {
2272
- type: SignUpPreferencesCommunicationInput
2273
- storeLocationId: Int
2274
- }
2275
-
2276
- """
2277
- This input is used for fields that can be auto filled with PersonLookup
2278
- """
2279
- input SignUpPropertyInput {
2280
- """
2281
- If the user has made no change this should contain the encrypted value from
2282
- PersonLookup, otherwise populate with the user input.
2283
- """
2284
- value: String
2285
-
2286
- """Specifies if the value field is encrypted or not."""
2287
- hasChanged: Boolean
2288
- }
2289
-
2290
- type SignUpResponse {
2291
- token: Token!
2292
- }
2293
-
2294
- enum SortDirection {
2295
- ASCENDING
2296
- DESCENDING
2303
+ input CustomerUpdateConsentInput {
2304
+ id: String
2305
+ value: Boolean
2297
2306
  }
2298
2307
 
2299
- type StartPage implements Document {
2300
- id: Int!
2308
+ input CustomerUpdateExternalAttribute {
2301
2309
  name: String!
2302
- images: [Image]
2303
- isActive: Boolean
2304
- content: String
2305
- items: [StartPageItem]
2306
-
2307
- """
2308
- NB: Carries a performance cost, as asking for this will result in a separate API call in the backend.
2309
- """
2310
- head: HtmlHead
2311
-
2312
- """The primary route of this StartPage"""
2313
- primaryRoute: Route
2314
- breadcrumbText: String
2315
-
2316
- """
2317
- Get content data set via the Content Editor. NB: Carries a performance cost,
2318
- as asking for this will result in a separate API call in the backend.
2319
- """
2320
- data: Content
2321
- }
2322
-
2323
- type StartPageItem {
2324
- id: Int!
2325
- row: Int
2326
- column: Int
2327
- item: StartPageItemObject!
2328
- }
2329
-
2330
- union StartPageItemObject = Product | CustomItem
2331
-
2332
- type StockStatus {
2333
- """Globally unique id."""
2334
- id: ID!
2335
-
2336
- """The stock status id, not globally unique."""
2337
- stockStatusId: ID!
2338
- text: String
2339
- buyable: Boolean!
2340
- stockNotificationEnabled: Boolean
2341
- stockDate: DateTime
2342
- maxOrderQuantity: Int
2343
- }
2344
-
2345
- type Store {
2346
- id: Int!
2347
- externalId: String
2348
- name: String
2349
- city: String
2350
- region: String
2351
- address1: String
2352
- address2: String
2353
- description: String
2354
- other: String
2355
- openHours: String
2356
- contact: String
2357
- coordinates: Coordinates
2310
+ value: String!
2358
2311
  }
2359
2312
 
2360
- type StringValue {
2361
- value: String
2313
+ type UpdateCustomerPriceListResult {
2314
+ success: Boolean!
2362
2315
  }
2363
2316
 
2364
2317
  """
2365
- Authorization token that is used for customer actions such as login, delete or update
2366
- The token contains three different roles:
2367
- 0: Standard.
2368
- 1: Lite
2369
- 2: VoyadoSemiLogin
2318
+ Responds with a boolean value whether the update has been successful or not
2370
2319
  """
2371
- type Token {
2372
- value: String!
2320
+ type UpdatePasswordResult {
2321
+ success: Boolean!
2373
2322
  }
2374
2323
 
2375
- type Tracking {
2376
- ga: GoogleAnalytics
2377
- ga4: GoogleAnalytics4
2378
- gtm: GoogleTagManager
2379
- fca: FacebookConversionsApi
2324
+ type CartMutation {
2325
+ cart: Cart
2380
2326
  }
2381
2327
 
2382
- input UpdateCartInput {
2383
- cartId: String
2384
- items: [UpdateCartItemInput!]
2385
- }
2328
+ input AddMultipleToCartInput {
2329
+ articleNumber: String!
2386
2330
 
2387
- input UpdateCartItemInput {
2388
- id: String!
2389
- quantity: Int! = 1
2331
+ """Default value is 1."""
2332
+ quantity: Int
2390
2333
  comments: [InputComment]
2334
+ configurationIds: [ID]
2391
2335
  preOrderDate: DateTime
2392
2336
  }
2393
2337
 
2394
- type UpdateCartMutation {
2395
- cart: Cart
2396
- }
2397
-
2398
- type UpdateCustomerGroupResult {
2399
- success: Boolean!
2400
- }
2401
-
2402
- type UpdateCustomerPriceListResult {
2403
- success: Boolean!
2404
- }
2405
-
2406
- input UpdateCustomerProductListInput {
2407
- id: ID!
2408
- typeId: ID!
2338
+ input InputComment {
2409
2339
  name: String!
2410
- description: String
2340
+ value: String
2411
2341
  }
2412
2342
 
2413
- input UpdateCustomerProductListItemInput {
2414
- id: ID!
2343
+ input AddToCartInput {
2344
+ """Not specifying cart id will create new cart."""
2345
+ cartId: String
2415
2346
  articleNumber: String!
2416
2347
 
2417
2348
  """Default value is 1."""
2418
2349
  quantity: Int
2419
- description: String
2350
+ comments: [InputComment]
2351
+ configurationIds: [ID]
2352
+ preOrderDate: DateTime
2420
2353
  }
2421
2354
 
2422
- """
2423
- Responds with a boolean value whether the update has been successful or not
2424
- """
2425
- type UpdatePasswordResult {
2426
- success: Boolean!
2355
+ input ChangeByOneItemQuantityInput {
2356
+ cartId: String!
2357
+ itemId: String!
2427
2358
  }
2428
2359
 
2429
- type Upsell {
2430
- id: ID!
2431
- items: [UpsellItem!]!
2360
+ input SetItemQuantityInput {
2361
+ cartId: String!
2362
+ itemId: String!
2363
+ quantity: Int!
2432
2364
  }
2433
2365
 
2434
- union UpsellDiscount = UpsellDiscountPercentage | UpsellDiscountValue
2435
-
2436
- type UpsellDiscountPercentage {
2437
- percentage: Decimal!
2366
+ input RemoveFromCartInput {
2367
+ cartId: String!
2368
+ itemId: String!
2438
2369
  }
2439
2370
 
2440
- type UpsellDiscountValue {
2441
- valueIncVat: Decimal!
2442
- valueExVat: Decimal!
2443
- valueVat: Decimal!
2371
+ input RemoveMultipleFromCartInput {
2372
+ cartId: String!
2373
+ itemIds: [String!]!
2444
2374
  }
2445
2375
 
2446
- type UpsellItem {
2447
- product: Product
2448
- minQuantity: Int!
2449
- discount: UpsellDiscount!
2376
+ type UpdateCartMutation {
2377
+ cart: Cart
2450
2378
  }
2451
2379
 
2452
- scalar Uri
2380
+ input UpdateCartInput {
2381
+ cartId: String
2382
+ items: [UpdateCartItemInput!]
2383
+ }
2453
2384
 
2454
- type Warehouse {
2455
- stockLevel: Int
2456
- location: Store
2385
+ input UpdateCartItemInput {
2386
+ id: String!
2387
+ quantity: Int! = 1
2388
+ comments: [InputComment]
2389
+ preOrderDate: DateTime
2457
2390
  }