diff --git a/src/_data/mde.yml b/src/_data/mde.yml index 281fa21e4d9..73028681443 100644 --- a/src/_data/mde.yml +++ b/src/_data/mde.yml @@ -5,7 +5,9 @@ versions: - 2.3.3 - 2.3.4 - 2.3.5-p1 + - 2.3.6 - 2.4.0 + - 2.4.1 extensions: - name: Amazon Sales Channel @@ -19,7 +21,9 @@ extensions: 2.3.3: compatible 2.3.4: compatible 2.3.5-p1: compatible + 2.3.6: compatible 2.4.0: compatible + 2.4.1: supported - name: 4.2.0 support: @@ -29,8 +33,9 @@ extensions: 2.3.3: compatible 2.3.4: compatible 2.3.5-p1: compatible - 2.4.0: supported - + 2.3.6: compatible + 2.4.0: compatible + 2.4.1: supported - name: 4.1.0 support: @@ -40,7 +45,9 @@ extensions: 2.3.3: supported 2.3.4: supported 2.3.5-p1: supported + 2.3.6: compatible 2.4.0: not supported + 2.4.1: not supported - name: 4.0.0 support: @@ -50,7 +57,9 @@ extensions: 2.3.3: compatible 2.3.4: compatible 2.3.5-p1: not supported + 2.3.6: not supported 2.4.0: not supported + 2.4.1: not supported - name: 3.0.1 support: @@ -60,7 +69,9 @@ extensions: 2.3.3: compatible 2.3.4: compatible 2.3.5-p1: compatible + 2.3.6: not supported 2.4.0: not supported + 2.4.1: not supported - name: 3.0.0 support: @@ -70,7 +81,9 @@ extensions: 2.3.3: compatible 2.3.4: compatible 2.3.5-p1: compatible + 2.3.6: not supported 2.4.0: not supported + 2.4.1: not supported - name: 2.0.0 support: @@ -80,10 +93,24 @@ extensions: 2.3.3: compatible 2.3.4: compatible 2.3.5-p1: compatible + 2.3.6: not supported 2.4.0: not supported + 2.4.1: not supported - name: Magento Inventory versions: + - + name: 1.2.1 + support: + 2.3.0: compatible + 2.3.1: compatible + 2.3.2: compatible + 2.3.3: compatible + 2.3.4: compatible + 2.3.5-p1: compatible + 2.3.6: compatible + 2.4.0: compatible + 2.4.1: supported - name: 1.2.0 support: @@ -93,7 +120,21 @@ extensions: 2.3.3: compatible 2.3.4: compatible 2.3.5-p1: compatible + 2.3.6: compatible 2.4.0: supported + 2.4.1: compatible + - + name: 1.1.6 + support: + 2.3.0: compatible + 2.3.1: compatible + 2.3.2: compatible + 2.3.3: compatible + 2.3.4: compatible + 2.3.5-p1: compatible + 2.3.6: supported + 2.4.0: compatible + 2.4.1: compatible - name: 1.1.5 support: @@ -103,7 +144,9 @@ extensions: 2.3.3: compatible 2.3.4: compatible 2.3.5-p1: supported + 2.3.6: compatible 2.4.0: compatible + 2.4.1: compatible - name: 1.1.4 support: @@ -113,7 +156,9 @@ extensions: 2.3.3: compatible 2.3.4: supported 2.3.5-p1: compatible + 2.3.6: compatible 2.4.0: compatible + 2.4.1: compatible - name: 1.1.3 support: @@ -123,7 +168,9 @@ extensions: 2.3.3: supported 2.3.4: compatible 2.3.5-p1: compatible + 2.3.6: compatible 2.4.0: compatible + 2.4.1: compatible - name: 1.1.2 support: @@ -133,7 +180,9 @@ extensions: 2.3.3: compatible 2.3.4: compatible 2.3.5-p1: compatible + 2.3.6: compatible 2.4.0: compatible + 2.4.1: compatible - name: 1.1.1 support: @@ -143,7 +192,9 @@ extensions: 2.3.3: compatible 2.3.4: compatible 2.3.5-p1: compatible + 2.3.6: compatible 2.4.0: compatible + 2.4.1: compatible - name: 1.1.0 support: @@ -153,10 +204,24 @@ extensions: 2.3.3: compatible 2.3.4: compatible 2.3.5-p1: compatible + 2.3.6: compatible 2.4.0: compatible + 2.4.1: compatible - name: Page Builder versions: + - + name: 1.5.0 + support: + 2.3.0: not supported + 2.3.1: not supported + 2.3.2: not supported + 2.3.3: not supported + 2.3.4: not supported + 2.3.5-p1: not supported + 2.3.6: not supported + 2.4.0: not supported + 2.4.1: supported - name: 1.4.0 support: @@ -166,7 +231,21 @@ extensions: 2.3.3: not supported 2.3.4: not supported 2.3.5-p1: not supported + 2.3.6: not supported 2.4.0: supported + 2.4.1: not supported + - + name: 1.3.6 + support: + 2.3.0: not supported + 2.3.1: not supported + 2.3.2: not supported + 2.3.3: not supported + 2.3.4: not supported + 2.3.5-p1: not supported + 2.3.6: supported + 2.4.0: not supported + 2.4.1: not supported - name: 1.3.1 support: @@ -176,7 +255,9 @@ extensions: 2.3.3: not supported 2.3.4: not supported 2.3.5-p1: supported + 2.3.6: not supported 2.4.0: not supported + 2.4.1: not supported - name: 1.2.0 support: @@ -186,7 +267,9 @@ extensions: 2.3.3: not supported 2.3.4: supported 2.3.5-p1: not supported + 2.3.6: not supported 2.4.0: not supported + 2.4.1: not supported - name: 1.1.0 support: @@ -196,7 +279,9 @@ extensions: 2.3.3: supported 2.3.4: not supported 2.3.5-p1: not supported + 2.3.6: not supported 2.4.0: not supported + 2.4.1: not supported - name: 1.0.1 support: @@ -206,7 +291,9 @@ extensions: 2.3.3: not supported 2.3.4: not supported 2.3.5-p1: not supported + 2.3.6: not supported 2.4.0: not supported + 2.4.1: not supported - name: 1.0.0 support: @@ -216,7 +303,9 @@ extensions: 2.3.3: not supported 2.3.4: not supported 2.3.5-p1: not supported + 2.3.6: not supported 2.4.0: not supported + 2.4.1: not supported - name: Product Recommendations versions: @@ -229,7 +318,9 @@ extensions: 2.3.3: supported 2.3.4: supported 2.3.5-p1: supported + 2.3.6: supported 2.4.0: supported + 2.4.1: supported - name: 3.0.5 support: @@ -239,7 +330,9 @@ extensions: 2.3.3: compatible 2.3.4: compatible 2.3.5-p1: compatible + 2.3.6: compatible 2.4.0: compatible + 2.4.1: compatible - name: 3.0.4 support: @@ -249,7 +342,9 @@ extensions: 2.3.3: compatible 2.3.4: compatible 2.3.5-p1: compatible + 2.3.6: compatible 2.4.0: compatible + 2.4.1: compatible - name: 3.0.3 support: @@ -259,8 +354,9 @@ extensions: 2.3.3: compatible 2.3.4: compatible 2.3.5-p1: compatible + 2.3.6: compatible 2.4.0: not supported - + 2.4.1: compatible - name: 3.0.2 support: @@ -270,7 +366,9 @@ extensions: 2.3.3: compatible 2.3.4: compatible 2.3.5-p1: compatible + 2.3.6: compatible 2.4.0: not supported + 2.4.1: compatible - name: 3.0.1 support: @@ -280,7 +378,9 @@ extensions: 2.3.3: compatible 2.3.4: compatible 2.3.5-p1: compatible + 2.3.6: compatible 2.4.0: not supported + 2.4.1: compatible - name: 3.0.0 support: @@ -290,7 +390,9 @@ extensions: 2.3.3: compatible 2.3.4: compatible 2.3.5-p1: compatible + 2.3.6: compatible 2.4.0: not supported + 2.4.1: not supported - name: 2.0.0 support: @@ -300,7 +402,9 @@ extensions: 2.3.3: compatible 2.3.4: compatible 2.3.5-p1: compatible + 2.3.6: compatible 2.4.0: not supported + 2.4.1: not supported - name: 1.x.x support: @@ -310,4 +414,117 @@ extensions: 2.3.3: not supported 2.3.4: not supported 2.3.5-p1: not supported + 2.3.6: not supported 2.4.0: not supported + 2.4.1: not supported + - + name: B2B + versions: + - + name: 1.3.0 + support: + 2.3.0: compatible + 2.3.1: compatible + 2.3.2: compatible + 2.3.3: compatible + 2.3.4: compatible + 2.3.5-p1: compatible + 2.3.6: compatible + 2.4.0: compatible + 2.4.1: supported + - + name: 1.2.0 + support: + 2.3.0: compatible + 2.3.1: compatible + 2.3.2: compatible + 2.3.3: compatible + 2.3.4: compatible + 2.3.5-p1: compatible + 2.3.6: compatible + 2.4.0: supported + 2.4.1: compatible + - + name: 1.1.6 + support: + 2.3.0: compatible + 2.3.1: compatible + 2.3.2: compatible + 2.3.3: compatible + 2.3.4: compatible + 2.3.5-p1: compatible + 2.3.6: supported + 2.4.0: compatible + 2.4.1: compatible + - + name: 1.1.5 + support: + 2.3.0: compatible + 2.3.1: compatible + 2.3.2: compatible + 2.3.3: compatible + 2.3.4: compatible + 2.3.5-p1: supported + 2.3.6: compatible + 2.4.0: compatible + 2.4.1: compatible + - + name: 1.1.4 + support: + 2.3.0: compatible + 2.3.1: compatible + 2.3.2: compatible + 2.3.3: compatible + 2.3.4: supported + 2.3.5-p1: compatible + 2.3.6: compatible + 2.4.0: compatible + 2.4.1: compatible + - + name: 1.1.3 + support: + 2.3.0: compatible + 2.3.1: compatible + 2.3.2: compatible + 2.3.3: supported + 2.3.4: compatible + 2.3.5-p1: compatible + 2.3.6: compatible + 2.4.0: compatible + 2.4.1: compatible + - + name: 1.1.2 + support: + 2.3.0: compatible + 2.3.1: compatible + 2.3.2: supported + 2.3.3: compatible + 2.3.4: compatible + 2.3.5-p1: compatible + 2.3.6: compatible + 2.4.0: compatible + 2.4.1: compatible + - + name: 1.1.1 + support: + 2.3.0: compatible + 2.3.1: supported + 2.3.2: compatible + 2.3.3: compatible + 2.3.4: compatible + 2.3.5-p1: compatible + 2.3.6: compatible + 2.4.0: compatible + 2.4.1: compatible + - + name: 1.1.0 + support: + 2.3.0: supported + 2.3.1: compatible + 2.3.2: compatible + 2.3.3: compatible + 2.3.4: compatible + 2.3.5-p1: compatible + 2.3.6: compatible + 2.4.0: compatible + 2.4.1: compatible diff --git a/src/_data/toc/graphql.yml b/src/_data/toc/graphql.yml index 38e2c661ffd..61aabe1b2dd 100644 --- a/src/_data/toc/graphql.yml +++ b/src/_data/toc/graphql.yml @@ -12,6 +12,9 @@ pages: - label: Authorization tokens url: /graphql/authorization-tokens.html + - label: Protected mutations + url: /graphql/protected-mutations.html + - label: GraphQL caching url: /graphql/caching.html @@ -49,6 +52,10 @@ pages: - label: Using queries url: /graphql/queries/index.html + - label: availableStores query + url: /graphql/queries/available-stores.html + exclude_versions: ["2.3"] + - label: cart query url: /graphql/queries/cart.html @@ -106,10 +113,15 @@ pages: - label: giftCardAccount query url: /graphql/queries/giftcard-account.html + edition: ee-only - label: isEmailAvailable query url: /graphql/queries/is-email-available.html + - label: productReviewRatingsMetadata query + url: /graphql/queries/product-review-ratings-metadata.html + exclude_versions: ["2.3"] + - label: products query url: /graphql/queries/products.html @@ -131,6 +143,10 @@ pages: - label: Using mutations url: /graphql/mutations/index.html + - label: addProductsToCart mutation + url: /graphql/mutations/add-products-to-cart.html + exclude_versions: ["2.3"] + - label: addBundleProductsToCart mutation url: /graphql/mutations/add-bundle-products.html @@ -140,20 +156,31 @@ pages: - label: addDownloadableProductsToCart mutation url: /graphql/mutations/add-downloadable-products.html + - label: addProductsToWishlist mutation + url: /graphql/mutations/add-products-to-wishlist.html + exclude_versions: ["2.3"] + - label: addSimpleProductsToCart mutation url: /graphql/mutations/add-simple-products.html - label: addVirtualProductsToCart mutation url: /graphql/mutations/add-virtual-products.html + - label: applyCouponToCart mutation + url: /graphql/mutations/apply-coupon.html + - label: applyGiftCardToCart mutation url: /graphql/mutations/apply-giftcard.html + edition: ee-only - - label: applyCouponToCart mutation - url: /graphql/mutations/apply-coupon.html + - label: applyRewardPointsToCart mutation + url: /graphql/mutations/apply-reward-points.html + edition: ee-only + exclude_versions: ["2.3"] - label: applyStoreCreditToCart mutation url: /graphql/mutations/apply-store-credit.html + edition: ee-only - label: changeCustomerPassword mutation url: /graphql/mutations/change-customer-password.html @@ -164,18 +191,30 @@ pages: - label: createCustomer mutation url: /graphql/mutations/create-customer.html + - label: createCustomerV2 mutation + url: /graphql/mutations/create-customer-v2.html + exclude_versions: ["2.3"] + - label: createCustomerAddress mutation url: /graphql/mutations/create-customer-address.html - label: createEmptyCart mutation url: /graphql/mutations/create-empty-cart.html + - label: createKlarnaPaymentsSession mutation + url: /graphql/mutations/create-klarna-payments-session.html + exclude_versions: ["2.3"] + - label: createPayflowProToken mutation url: /graphql/mutations/create-payflow-pro-token.html - label: createPayPalExpressToken mutation url: /graphql/mutations/create-paypal-express-token.html + - label: createProductReview mutation + url: /graphql/mutations/create-product-review.html + exclude_versions: ["2.3"] + - label: deleteCustomerAddress mutation url: /graphql/mutations/delete-customer-address.html @@ -196,32 +235,56 @@ pages: - label: redeemGiftCardBalanceAsStoreCredit mutation url: /graphql/mutations/redeem-giftcard-balance.html + edition: ee-only - label: removeCouponFromCart mutation url: /graphql/mutations/remove-coupon.html - label: removeGiftCardFromCart mutation url: /graphql/mutations/remove-giftcard.html + edition: ee-only - label: removeItemFromCart mutation url: /graphql/mutations/remove-item.html + - label: removeProductsFromWishlist mutation + url: /graphql/mutations/remove-products-from-wishlist.html + exclude_versions: ["2.3"] + + - label: removeRewardPointsFromCart mutation + url: /graphql/mutations/remove-reward-points.html + edition: ee-only + exclude_versions: ["2.3"] + - label: removeStoreCreditFromCart mutation url: /graphql/mutations/remove-store-credit.html + edition: ee-only - label: reorderItems mutation url: /graphql/mutations/reorder-items.html exclude_versions: ["2.3"] + - label: requestPasswordResetEmail mutation + url: /graphql/mutations/request-password-reset-email.html + exclude_versions: ["2.3"] + - label: revokeCustomerToken mutation url: /graphql/mutations/revoke-customer-token.html + - label: resetPassword mutation + url: /graphql/mutations/reset-password.html + exclude_versions: ["2.3"] + - label: sendEmailToFriend mutation url: /graphql/mutations/send-email-to-friend.html - label: setBillingAddressesOnCart mutation url: /graphql/mutations/set-billing-address.html + - label: setGiftOptionsOnCart mutation + url: /graphql/mutations/set-gift-options.html + exclude_versions: ["2.3"] + - label: setGuestEmailOnCart mutation url: /graphql/mutations/set-guest-email.html @@ -237,15 +300,31 @@ pages: - label: setShippingMethodsOnCart mutation url: /graphql/mutations/set-shipping-method.html + - label: subscribeEmailToNewsletter mutation + url: /graphql/mutations/subscribe-email-to-newsletter.html + exclude_versions: ["2.3"] + - label: updateCartItems mutation url: /graphql/mutations/update-cart-items.html - label: updateCustomer mutation url: /graphql/mutations/update-customer.html + - label: updateCustomerEmail mutation + url: /graphql/mutations/update-customer-email.html + exclude_versions: ["2.3"] + + - label: updateCustomerV2 mutation + url: /graphql/mutations/update-customer-v2.html + exclude_versions: ["2.3"] + - label: updateCustomerAddress mutation url: /graphql/mutations/update-customer-address.html + - label: updateProductsInWishlist mutation + url: /graphql/mutations/update-products-in-wishlist.html + exclude_versions: ["2.3"] + - label: Interfaces children: - label: Product interface implementations @@ -281,6 +360,22 @@ pages: - label: Virtual product data types url: /graphql/interfaces/virtual-product.html + - label: CreditMemoItemInterface attributes and implementations + url: /graphql/interfaces/credit-memo-item-interface.html + exclude_versions: ["2.3"] + + - label: InvoiceItemInterface attributes and implementations + url: /graphql/interfaces/invoice-item-interface.html + exclude_versions: ["2.3"] + + - label: OrderItemInterface attributes and implementations + url: /graphql/interfaces/order-item-interface.html + exclude_versions: ["2.3"] + + - label: ShipmentItemInterface attributes and implementations + url: /graphql/interfaces/shipment-item-interface.html + exclude_versions: ["2.3"] + - label: Payment methods children: @@ -294,6 +389,10 @@ pages: - label: Braintree Vault url: /graphql/payment-methods/braintree-vault.html + - label: Klarna + url: /graphql/payment-methods/klarna.html + exclude_versions: ["2.3"] + - label: PayPal Express Checkout url: /graphql/payment-methods/paypal-express-checkout.html @@ -306,6 +405,10 @@ pages: - label: PayPal Payflow Pro url: /graphql/payment-methods/payflow-pro.html + - label: PayPal Payflow Pro Vault + url: /graphql/payment-methods/payflow-pro-vault.html + exclude_versions: ["2.3"] + - label: PayPal Payments Advanced url: /graphql/payment-methods/payments-advanced.html diff --git a/src/_data/toc/release-notes.yml b/src/_data/toc/release-notes.yml index b54b1a76682..705bcd3f866 100644 --- a/src/_data/toc/release-notes.yml +++ b/src/_data/toc/release-notes.yml @@ -7,6 +7,12 @@ pages: include_versions: ["2.4"] children: + - label: Magento Open Source 2.4.1 Release Notes + url: /release-notes/open-source-2-4-1.html + + - label: Magento Commerce 2.4.1 Release Notes + url: /release-notes/commerce-2-4-1.html + - label: Magento Open Source 2.4.0 Release Notes url: /release-notes/release-notes-2-4-0-open-source.html @@ -24,6 +30,12 @@ pages: - label: Component Status url: /release-notes/component-status.html + - label: Magento Open Source 2.3.6 Release Notes + url: /release-notes/open-source-2-3-6.html + + - label: Magento Commerce 2.3.6 Release Notes + url: /release-notes/commerce-2-3-6.html + - label: Magento Open Source 2.3.5 Release Notes url: /release-notes/release-notes-2-3-5-open-source.html diff --git a/src/_data/toc/rest-api.yml b/src/_data/toc/rest-api.yml index f566b987093..17dde608e8e 100644 --- a/src/_data/toc/rest-api.yml +++ b/src/_data/toc/rest-api.yml @@ -65,6 +65,9 @@ pages: - label: Retrieve filtered search responses url: /rest/retrieve-filtered-responses.html + - label: Protected endpoints + url: /rest/protected-endpoints.html + - label: Restricting access to anonymous web APIs url: /rest/anonymous-api-security.html diff --git a/src/_data/whats-new.yml b/src/_data/whats-new.yml index 9934416c404..663e92ec85e 100644 --- a/src/_data/whats-new.yml +++ b/src/_data/whats-new.yml @@ -4,8 +4,164 @@ description: This page contains recent changes that we think you'd like to know We exclude from this list proofreading, spelling checks, and all minor updates. link: "/whats-new.html" thread: "/whatsnew-feed.xml" -updated: Thu Oct 8 18:38:18 2020 +updated: Wed Oct 14 19:58:40 2020 entries: +- description: Added release notes to describe the Magento 2.3.6 and Magento 2.4.1 + release notes. See [2.4 Release Information](https://devdocs.magento.com/guides/v2.4/release-notes/bk-release-notes.html) + and [2.3 Release Information](https://devdocs.magento.com/guides/v2.3/release-notes/bk-release-notes.html). + versions: 2.3.6, 2.4.1 + type: Major Update + date: October 15, 2020 + link: https://github.com/magento/devdocs/pull/8036 + contributor: jfrontain + profile: https://github.com/jfrontain +- description: Fixed invalid `env.php` code sample for [message queue configuration](https://devdocs.magento.com/guides/v2.3/extension-dev-guide/message-queues/message-queues.html). + versions: 2.3.6 + type: Technical + date: October 15, 2020 + link: https://github.com/magento/devdocs/pull/7896 + contributor: jeff-matthews + profile: https://github.com/jeff-matthews +- description: Added a new overview page for [Klarna's payment method](https://devdocs.magento.com/guides/v2.4/graphql/payment-methods/klarna.html) + and a new reference page for Klarna's [`createKlarnaPaymentsSession`](https://devdocs.magento.com/guides/v2.4/graphql/mutations/create-klarna-payments-session.html) + GraphQL mutation. + versions: 2.4.1 + type: New Topic + date: October 15, 2020 + link: https://github.com/magento/devdocs/pull/7891 + contributor: jeff-matthews + profile: https://github.com/jeff-matthews +- description: Added release notes for [Inventory Management](https://devdocs.magento.com/guides/v2.3/inventory/release-notes.html). + versions: 2.4.1 + type: Major Update + date: October 15, 2020 + link: https://github.com/magento/devdocs/pull/7925 + contributor: sidolov + profile: https://github.com/sidolov +- description: Added a list of [REST endpoints](https://devdocs.magento.com/guides/v2.4/rest/protected-endpoints.html) + and a list of [GraphQL mutations](https://devdocs.magento.com/guides/v2.4/graphql/protected-mutations.html) + that require an `X-Captcha` header when CAPTCHA is enabled for various storefront + forms. + versions: 2.3.6, 2.4.1 + type: New Topic + date: October 15, 2020 + link: https://github.com/magento/devdocs/pull/7906 + contributor: keharper + profile: https://github.com/keharper +- description: Added the [`availableStores` query](https://devdocs.magento.com/guides/v2.4/graphql/queries/available-stores.html), + which returns system configuration information from multiple store views. The + query provides the context needed for a store switcher. + versions: 2.4.1 + type: New Topic + date: October 15, 2020 + link: https://github.com/magento/devdocs/pull/7853 + contributor: keharper + profile: https://github.com/keharper +- description: Added 2.4.1 beta [release notes](https://devdocs.magento.com/guides/v2.4/release-notes/bk-release-notes.html). + versions: 2.4.1 + type: Major Update + date: October 15, 2020 + link: https://github.com/magento/devdocs/pull/7846 + contributor: jfrontain + profile: https://github.com/jfrontain +- description: The [`addProductsToCart` mutation](https://devdocs.magento.com/guides/v2.4/graphql/mutations/add-products-to-cart.html) + allows you to add any type of product to the active cart. We recommend using this + mutation instead of single-purpose mutations such as `addSimpleProductsToCart`. + versions: 2.4.1 + type: New Topic + date: October 15, 2020 + link: https://github.com/magento/devdocs/pull/7774 + contributor: andrewbess + profile: https://github.com/andrewbess +- description: Added support for product reviews in GraphQL. Use the [createProductReview + mutation](https://devdocs.magento.com/guides/v2.4/graphql/mutations/create-product-review.html) + to add a review and the [productReviewRatingsMetadata query](https://devdocs.magento.com/guides/v2.4/graphql/queries/product-review-ratings-metadata.html) + to retrieve information about the reviews infrastructure. + versions: 2.4.1 + type: New Topic + date: October 15, 2020 + link: https://github.com/magento/devdocs/pull/7775 + contributor: keharper + profile: https://github.com/keharper +- description: Added the ability to [add items](https://devdocs.magento.com/guides/v2.4/graphql/mutations/add-products-to-wishlist.html) + to, [update items](https://devdocs.magento.com/guides/v2.4/graphql/mutations/update-products-in-wishlist.html) + in, and [remove items](https://devdocs.magento.com/guides/v2.4/graphql/mutations/remove-products-from-wishlist.html) + from a wish list in GraphQL. + versions: 2.4.1 + type: New Topic + date: October 15, 2020 + link: https://github.com/magento/devdocs/pull/7770 + contributor: keharper + profile: https://github.com/keharper +- description: Added the [`setGiftOptionsOnCart` mutation](https://devdocs.magento.com/guides/v2.4/graphql/mutations/set-gift-options.html) + to set gift messages, gift wrapping, gift receipts, and printed cards to an entire + order. The [`updateCartItems` mutation](https://devdocs.magento.com/guides/v2.4/graphql/mutations/update-cart-items.html) + has been updated to allow adding a gift message or gift wrapping to individual + products. + versions: 2.4.1 + type: New Topic + date: October 15, 2020 + link: https://github.com/magento/devdocs/pull/7745 + contributor: keharper + profile: https://github.com/keharper +- description: We have added the [`createCustomerV2`](https://devdocs.magento.com/guides/v2.4/graphql/mutations/create-customer-v2.html) + and [`updateCustomerV2`](https://devdocs.magento.com/guides/v2.4/graphql/mutations/update-customer-v2.html) + mutations to manage customer accounts. These new mutations require different input + objects than the `createCustomer` and `updateCustomer` mutations. To change a + customer's email address, use the new [`updateCustomerEmail`](https://devdocs.magento.com/guides/v2.4/graphql/mutations/update-customer-email.html) + mutation. + versions: 2.4.1 + type: New Topic + date: October 15, 2020 + link: https://github.com/magento/devdocs/pull/7673 + contributor: keharper + profile: https://github.com/keharper +- description: Added GraphQL support for rewards points. Use the [`applyRewardPointsToCart`](https://devdocs.magento.com/guides/v2.4/graphql/mutations/apply-reward-points.html) + and [`removeRewardPointsFromCart`](https://devdocs.magento.com/guides/v2.4/graphql/mutations/remove-reward-points.html) + mutation to manage reward points within a cart. The [cart](https://devdocs.magento.com/guides/v2.4/graphql/queries/cart.html), + [customer](https://devdocs.magento.com/guides/v2.4/graphql/queries/customer.html), + and [storeConfig](https://devdocs.magento.com/guides/v2.4/graphql/queries/store-config.html) + queries also return information related to reward points. + versions: 2.4.1 + type: New Topic + date: October 15, 2020 + link: https://github.com/magento/devdocs/pull/7662 + contributor: keharper + profile: https://github.com/keharper +- description: Added GraphQL Vault support with the [Payflow Pro Vault](https://devdocs.magento.com/guides/v2.4/graphql/payment-methods/payflow-pro-vault.html) + payment method. + versions: 2.4.1 + type: New Topic + date: October 15, 2020 + link: https://github.com/magento/devdocs/pull/7714 + contributor: keharper + profile: https://github.com/keharper +- description: Added a [deprecation notice](https://devdocs.magento.com/guides/v2.3/install-gde/system-requirements-tech.html#technologies-magento-can-use) + for Elasticsearch 6.x. + versions: 2.3.6 + type: Technical + date: October 15, 2020 + link: https://github.com/magento/devdocs/pull/7512 + contributor: jeff-matthews + profile: https://github.com/jeff-matthews +- description: Added the [`subscribeEmailToNewsletter` mutation](https://devdocs.magento.com/guides/v2.4/graphql/mutations/subscribe-email-to-newsletter.html) + to the _GraphQL Developer Guide_. + versions: 2.4.1 + type: New Topic + date: October 15, 2020 + link: https://github.com/magento/devdocs/pull/7422 + contributor: atwixfirster + profile: https://github.com/atwixfirster +- description: The GraphQL [`customer` query](https://devdocs.magento.com/guides/v2.4/graphql/queries/customer.html) + now returns detailed information about any order in the logged-in customer's order + history. The query can now replicate what is displayed in the My Orders page + in the storefront. + versions: 2.4.1 + type: Major Update + date: October 15, 2020 + link: https://github.com/magento/devdocs/pull/7436 + contributor: keharper + profile: https://github.com/keharper - description: Added a [deprecation notice](https://devdocs.magento.com/cloud/configure/import-url-rewrites.html) for `magento/url-rewrite-import-export` module, which is no longer supported on Magento 2.4.x or later. diff --git a/src/_includes/backward-incompatible-changes/commerce/2.4.0-2.4.1-develop.html b/src/_includes/backward-incompatible-changes/commerce/2.4.0-2.4.1-develop.html new file mode 100644 index 00000000000..6d424299dcb --- /dev/null +++ b/src/_includes/backward-incompatible-changes/commerce/2.4.0-2.4.1-develop.html @@ -0,0 +1,28 @@ + +

Class changes

+ + + + + + + + + +
What changedHow it changed
Magento\CustomerSegment\Model\ResourceModel\Segment::createSelect[public] Method return typing changed.
+ +

Class API membership changes

+ + + + + + + + + + + + + +
What changedHow it changed
Magento\TargetRule\Block\Product\AbstractProductClass was added.
Magento\AdvancedCheckout\Block\Adminhtml\Sku\AbstractSkuClass was added.
diff --git a/src/_includes/backward-incompatible-changes/open-source/2.4.0-2.4.1-develop.html b/src/_includes/backward-incompatible-changes/open-source/2.4.0-2.4.1-develop.html new file mode 100644 index 00000000000..960d70a9dfd --- /dev/null +++ b/src/_includes/backward-incompatible-changes/open-source/2.4.0-2.4.1-develop.html @@ -0,0 +1,160 @@ + +

Class changes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
What changedHow it changed
Magento\Framework\Stdlib\Cookie\CookieMetadata::setSameSite[public] Method has been added.
Magento\Framework\Stdlib\Cookie\CookieMetadata::getSameSite[public] Method has been added.
Magento\Framework\Stdlib\Cookie\CookieMetadata::KEY_SAME_SITEConstant has been added.
Magento\User\Model\User::$_cacheTag[protected] Property has been added.
Magento\Catalog\Model\Category::getCacheTags[public] Method has been added.
Magento\Catalog\Model\Product::getCacheTags[public] Method has been added.
Magento\Authorization\Model\Role::$_cacheTag[protected] Property has been added.
+ +

Interface changes

+ + + + + + + + + + + + + +
What changedHow it changed
Magento\Eav\Api\AttributeOptionUpdateInterfaceInterface was added.
Magento\Catalog\Api\ProductAttributeOptionUpdateInterfaceInterface was added.
+ +

Database changes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
What changedHow it changed
media_gallery_asset/MEDIA_GALLERY_ID_PATH_TITLE_CONTENT_TYPE_WIDTH_HEIGHTUnique key was removed
media_gallery_asset/MEDIA_GALLERY_ID_PATH_TITLE_CONTENT_TYPE_WIDTH_HEIGHTUnique key was removed
media_gallery_asset/MEDIA_GALLERY_ID_PATH_TITLE_CONTENT_TYPE_WIDTH_HEIGHTUnique key was removed
media_gallery_asset/constraintModule db schema whitelist reduced (media_gallery_asset/constraint).
login_as_customer_assistance_allowedTable was added
login_as_customer_assistance_allowedTable was added
login_as_customer_assistance_allowedTable was added
login_as_customer_assistance_allowedTable was added
login_as_customer_assistance_allowedTable was added
login_as_customer_assistance_allowedTable was added
login_as_customer_assistance_allowedTable was added
+ +

System changes

+ + + + + + + + + + + + + + + + + +
What changedHow it changed
system.xmlSystem configuration file was added
system.xmlSystem configuration file was added
checkout/cart/enable_clear_shopping_cartA field-node was added
+ +

Xsd changes

+ + + + + + + + + + + + + + + + + +
What changedHow it changed
maxIdleTimeAn optional attribute was added
sleepAn optional attribute was added
onlySpawnWhenMessageAvailableAn optional attribute was added
+ +

Class API membership changes

+ + + + + + + + + + + + + +
What changedHow it changed
Magento\Framework\View\Page\BuilderClass was added.
Magento\SalesRule\Model\ValidatorClass was added.
diff --git a/src/_includes/config/es-elasticsearch-magento.md b/src/_includes/config/es-elasticsearch-magento.md index d88122dd1fc..7aaf39ff5a6 100644 --- a/src/_includes/config/es-elasticsearch-magento.md +++ b/src/_includes/config/es-elasticsearch-magento.md @@ -1,10 +1,7 @@ This section discusses the minimum settings you must choose to test Elasticsearch with Magento 2. For additional details about configuring Elasticsearch, see the [{{site.data.var.ee}} User Guide](http://docs.magento.com/m2/ee/user_guide/catalog/search-elasticsearch.html). -{:.bs-callout-warning} -Magento 2.3.5 adds support for Elasticsearch 7.x.x and 6.8.x. -Versions 2.x and 5.x are [End of Life](https://www.elastic.co/support/eol) and are not supported. -Follow the instructions in [Change the Elasticsearch Client]({{page.baseurl}}/config-guide/elasticsearch/es-downgrade.html). +{% include config/es-version-23.md %} ## Configure Elasticsearch within Magento diff --git a/src/_includes/config/es-version-23.md b/src/_includes/config/es-version-23.md new file mode 100644 index 00000000000..bd780798348 --- /dev/null +++ b/src/_includes/config/es-version-23.md @@ -0,0 +1,6 @@ +{:.bs-callout-warning} +As of version 2.3.6, {{site.data.var.ee}} supports Elasticsearch 7.x, with a preference for 7.6.x. Support for Elasticsearch 6.x has been deprecated, but it can still be used. Both Elasticsearch 2.x and 5.x have reached [end-of-life][] and are no longer supported. + + + +[end-of-life]: https://www.elastic.co/support/eol diff --git a/src/_includes/graphql/cart-object-24.md b/src/_includes/graphql/cart-object-24.md new file mode 100644 index 00000000000..87911498ab1 --- /dev/null +++ b/src/_includes/graphql/cart-object-24.md @@ -0,0 +1,34 @@ +Attribute | Data Type | Description +--- | --- | --- +`applied_coupon` | [`AppliedCoupon`][AppliedCoupon] | Deprecated. Use `applied_coupons` instead +`applied_coupons` | [[`AppliedCoupon`]][AppliedCoupon] | An array of `AppliedCoupon` objects. Each object contains the `code` text attribute, which specifies the coupon code +`applied_gift_cards` | [[`AppliedGiftCard`]][AppliedGiftCard] | An array of `AppliedGiftCard` objects. An `AppliedGiftCard` object contains the `code` text attribute, which specifies the gift card code. `applied_gift_cards` is a Commerce-only attribute, defined in the GiftCardAccountGraphQl module +`applied_reward_points`| [`RewardPointsAmount`][RewardPointsAmount] | The amount of reward points applied to the cart +`applied_store_credit` | [`AppliedStoreCredit`][AppliedStoreCredit] | Contains store credit information applied to the cart. `applied_store_credit` is a Commerce-only attribute, defined in the CustomerBalanceGraphQl module +`available_gift_wrappings` | [GiftWrapping]! | The list of available gift wrapping options for the cart +`available_payment_methods` | [[AvailablePaymentMethod]][AvailablePaymentMethod] | Available payment methods +`billing_address` | [BillingCartAddress][BillingCartAddress] | Contains the billing address specified in the customer's cart +`email` | String | The customer's email address +`gift_message` | [GiftMessage][GiftMessage] | A gift message added to the cart +`gift_receipt_included` | Boolean! | Indicates if the customer requested a gift receipt for the cart +`gift_wrapping` | GiftWrapping | The selected gift wrapping for the cart +`id` | ID! | The ID of the cart +`is_virtual` | Boolean! | Indicates whether the cart contains only virtual products +`items` | [[CartItemInterface]][CartItemInterface] | Contains the items in the customer's cart +`prices` | [CartPrices][CartPrices] | Contains subtotals and totals +`printed_card_included` | Boolean! | Indicates if the customer requested a printed card for the cart +`selected_payment_method` | [SelectedPaymentMethod][SelectedPaymentMethod] | Selected payment method +`shipping_addresses` | [[ShippingCartAddress]][ShippingCartAddress]! | Contains one or more shipping addresses +`total_quantity` | Float! | Total Quantity of products in the cart + +[AppliedCoupon]: {{page.baseurl}}/graphql/queries/cart.html#AppliedCoupon +[AppliedGiftCard]: {{page.baseurl}}/graphql/queries/cart.html#AppliedGiftCard +[AppliedStoreCredit]: {{page.baseurl}}/graphql/queries/cart.html#AppliedStoreCredit +[AvailablePaymentMethod]: {{page.baseurl}}/graphql/queries/cart.html#AvailablePaymentMethod +[BillingCartAddress]: {{page.baseurl}}/graphql/queries/cart.html#BillingCartAddress +[CartItemInterface]: {{page.baseurl}}/graphql/queries/cart.html#CartItemInterface +[CartPrices]: {{page.baseurl}}/graphql/queries/cart.html#CartPrices +[GiftMessage]: {{page.baseurl}}/graphql/queries/cart.html#GiftMessage +[RewardPointsAmount]: {{page.baseurl}}/graphql/queries/cart.html#RewardPointsAmount +[SelectedPaymentMethod]: {{page.baseurl}}/graphql/queries/cart.html#SelectedPaymentMethod +[ShippingCartAddress]: {{page.baseurl}}/graphql/queries/cart.html#ShippingCartAddress diff --git a/src/_includes/graphql/credit-memo-item-interface.md b/src/_includes/graphql/credit-memo-item-interface.md new file mode 100644 index 00000000000..626321a71b7 --- /dev/null +++ b/src/_includes/graphql/credit-memo-item-interface.md @@ -0,0 +1,9 @@ +Attribute | Data type | Description +--- | --- | --- +`discounts` | [Discount] | Contains information about the final discount amount for the base product, including discounts on options +`id` | ID! | The unique ID of the credit memo item +`order_item` | [OrderItemInterface]({{page.baseurl}}/graphql/interfaces/order-item-interface.html) | The order item the credit memo is applied to +`product_name` | String | The name of the base product +`product_sale_price` | Money! | The sale price for the base product, including selected options +`product_sku` | String! | The SKU of the base product +`quantity_refunded` | Float | The number of refunded items diff --git a/src/_includes/graphql/customer-address-output.md b/src/_includes/graphql/customer-address-output.md index c819ee29ce7..f333ee5a1f5 100644 --- a/src/_includes/graphql/customer-address-output.md +++ b/src/_includes/graphql/customer-address-output.md @@ -1,4 +1,4 @@ -### CustomerAddress attributes {#customerAddressOutput} +### Address attributes (CustomerAddress) {#customerAddressOutput} The values assigned to attributes such as `firstname` and `lastname` in this object may be different from those defined in the `Customer` object. @@ -29,7 +29,7 @@ Attribute | Data Type | Description `telephone` | String | The telephone number `vat_id` | String | The customer's Tax/VAT number (for corporate customers) -### CustomerAddressAttribute attributes {#customerAddressAttributeOutput} +#### CustomerAddressAttribute attributes {#customerAddressAttributeOutput} The `CustomerAddressAttribute` output data type has been deprecated because the contents are not applicable for GraphQL. It can contain the following attributes: @@ -38,7 +38,7 @@ Attribute | Data Type | Description `attribute_code` | String | Attribute code `value` | String | Attribute value -### CustomerAddressRegion attributes {#customerAddressRegionOutput} +#### CustomerAddressRegion attributes {#customerAddressRegionOutput} The `customerAddressRegion` output returns the following attributes: diff --git a/src/_includes/graphql/customer-orders-output.md b/src/_includes/graphql/customer-orders-output.md new file mode 100644 index 00000000000..5d84468f304 --- /dev/null +++ b/src/_includes/graphql/customer-orders-output.md @@ -0,0 +1,391 @@ + +The `orders` attribute defines a filter that returns details about one or more of the logged-in customer's previous orders. It takes the following attributes as input: + +Attribute | Data type | Description +--- | --- | --- +`filter` | CustomerOrdersFilterInput | Defines the criteria to search for. If no filter is specified, the query returns and paginates all of the customer's orders +`currentPage` | Int | Specifies which page of results to return. The default value is 1 +`pageSize` | Int | Specifies the maximum number of results to return at once. The default value is 20 + +The `customers` query returns a [`CustomerOrders`](#customerOrders) object. + +#### CustomerOrdersFilterInput attributes + +Attribute | Data type | Description +--- | --- | --- +`number` | FilterStringTypeInput | Filter orders by order number + +#### FilterStringTypeInput attributes {#FilterStringTypeInput} + +The `FilterStringTypeInput` object defines a filter for an input string. + +Attribute | Data type | Description +--- | --- | --- +`eq` | String | Filters items that are exactly the same as the specified string. For example, to filter on a specific order number, specify a value like `5` +`in` | [String] | Filters items that are exactly the same as entries specified in an array of strings. For example, to filter on order number 4, 5, and 6, specify a value of `["4", "5", "6"]` +`match` | String | Defines a filter that performs a fuzzy search on the specified string. For example, if you specify a value of `20`, the query returns all order IDs that contain the string `20` + +### orders output attributes (CustomerOrders) {#customerOrders} + +The `CustomerOrders` object contains the results of the filter defined in the `orders` attribute. + +Attribute | Data type | Description +--- | --- | --- +`items` | [[CustomerOrder]!](#customerOrder) | An array of items in an order +`page_info` | [SearchResultPageInfo](#SearchResultPageInfo) | An object that includes the `current_page`, `page_info`, and `page_size` values specified in the query +`total_count` | Int | The total count of customer orders + +### CustomerOrder attributes {#customerOrder} + +The `CustomerOrder` object contains details about each order returned by the `orders` attribute. + +Attribute | Data type | Description +--- | --- | --- +`billing_address` | [OrderAddress](#OrderAddress) | The billing address for the order +`carrier` | String | The shipping carrier for the order delivery +`comments` | [[SalesCommentItem](#SalesCommentItem)] | Comments on the order +`created_at` | String | Deprecated. Use the `order_date` attribute instead +`credit_memos` | [[CreditMemo](#CreditMemo)] | Contains a list of credit memos for the order +`grand_total` | Float | Deprecated. Use the `totals.grand_total` attribute instead +`gift_message` | [GiftMessage](#GiftMessage) | The entered gift message for the order +`gift_receipt_included` | Boolean! | Indicates if the customer requested a gift receipt for the order +`gift_wrapping` | [GiftWrapping](#GiftWrapping) | The selected gift wrapping for the order +`id` | ID! | Unique identifier for the order +`increment_id` | String | Deprecated. Use the `id` attribute instead +`invoices` | [[Invoice](#Invoice)]! | Contains a list of invoices for the order +`items` | [[OrderItemInterface](#OrderItemInterface)] | An array containing the items purchased in this order +`number` | String! | The order number +`order_date` | String! | The date the order was placed +`order_number` | String! | Deprecated. Use the `number` attribute instead +`payment_methods` | [[PaymentMethod](#PaymentMethod)] | Payment details for the order +`printed_card_included` | Boolean! | Indicates if the customer requested a printed card for the order +`shipments` | [[OrderShipment](#OrderShipment)] | Shipment list for the order +`shipping_address` | [OrderAddress](#OrderAddress) | Shipping address for the order +`shipping_method` | String | Shipping method for the order +`status` | String! | The current status of the order +`total` | [OrderTotal](#OrderTotal) | Contains details about the calculated totals for this order + +The deprecated attributes were previously defined in the `CustomerOrder` object in the `customerOrders` query, but have been deprecated for the `customer` query. + +#### CreditMemo attributes {#CreditMemo} + +The `CreditMemo` object contains details about credit memos applied to an order. + +Attribute | Data type | Description +--- | --- | --- +`comments` | [[SalesCommentItem](#SalesCommentItem)] | Comments on the credit memo +`id` | ID! | The unique ID of the credit memo +`items` | [[CreditMemoItemInterface](#CreditMemoItemInterface)] | An array containing details about refunded items +`number` | String! | The sequential credit memo number +`total` | [CreditMemoTotal](#CreditMemoTotal) | Contains details about the total refunded amount + +#### CreditMemoItemInterface attributes {#CreditMemoItemInterface} + +`CreditMemoItemInterface` defines the following attributes. + +{% include graphql/credit-memo-item-interface.md %} + +[CreditMemoItemInterface attributes and implementations]({{page.baseurl}}/graphql/interfaces/credit-memo-item-interface.html) provides additional information about the implementations of this interface. + +#### CreditMemoTotal attributes {#CreditMemoTotal} + +The `CreditMemoTotal` object contains details about the totals of a credit memo. + +Attribute | Data type | Description +--- | --- | --- +`adjustment` | Money! | An adjustment manually applied to the order +`base_grand_total` | Money! | The final base grand total amount in the base currency +`discounts` | [Discount] | The applied discounts to the order +`grand_total` | Money! | The final total amount, including shipping, discounts, and taxes +`shipping_handling` | [ShippingHandling](#ShippingHandling) | Contains details about the shipping and handling costs for the credit memo +`subtotal` | Money! | The subtotal of the order, excluding shipping, discounts, and taxes +`taxes` | [[TaxItem](#TaxItem)]! | An array containing information about taxes on individual orders +`total_shipping` | Money! | The shipping amount for the credit memo +`total_tax` | Money! | The amount of tax applied to all orders + +#### Discount attributes {#Discount} + +The `Discount` object contains a description of a discount and the amount. + +Attribute | Data type | Description +--- | --- | --- +`amount` | Money! | The amount of the discount +`label` | String! | A description of the discount + +### GiftMessage attributes {#GiftMessage} + +{% include graphql/gift-message.md %} + +### GiftWrapping attributes {#GiftWrapping} + +{% include graphql/gift-wrapping.md %} + +#### Invoice attributes {#Invoice} + +The `Invoice` object provides details about a customer invoice. + +Attribute | Data type | Description +--- | --- | --- +`comments` | [[SalesCommentItem](#SalesCommentItem)] | Comments on the invoice +`id` | ID! | The internal ID of the invoice +`items` | [[InvoiceItemInterface](#InvoiceItemInterface)]! | Contains details about invoiced products +`number` | String! | The sequential number of the invoice +`total` | [InvoiceTotal](#InvoiceTotal)! | Invoice total amount details + +#### InvoiceItemInterface {#InvoiceItemInterface} + +`InvoiceItemInterface` defines the following attributes. + +{% include graphql/invoice-item-interface.md %} + +[InvoiceItemInterface attributes and implementations]({{page.baseurl}}/graphql/interfaces/invoice-item-interface.html) provides additional information about the implementations of this interface. + +`InvoiceItemInterface` is implemented by the `InvoiceItem` and `BundleInvoiceItem` data types. + +#### InvoiceTotal attributes {#InvoiceTotal} + +The InvoiceTotal object contains details about the totals of an invoice. + +Attribute | Data type | Description +--- | --- | --- +`base_grand_total` | Money! | The final base grand total amount in the base currency +`discounts` | [Discount] | The applied discounts to the invoice +`grand_total` | Money! | The final total amount, including shipping, discounts, and taxes +`shipping_handling` | [ShippingHandling](#ShippingHandling) | Contains details about the shipping and handling costs for the invoice +`subtotal` | Money! | The subtotal of the invoice, excluding shipping, discounts, and taxes +`taxes` | [[TaxItem](#TaxItem)] | An array containing information about taxes on individual invoices +`total_shipping` | Money! | The shipping amount for the invoice +`total_tax` | Money! | The amount of tax applied to all invoices + +#### ItemSelectedBundleOption attributes {#ItemSelectedBundleOption} + +The ItemSelectedBundleOption object contains a list of bundle options that are assigned to the bundle product. + +Attribute | Data type | Description +--- | --- | --- +`id` | ID! | The unique identifier of the option +`label` | String! | The label of the option +`values` | [[ItemSelectedBundleOptionValue!](#ItemSelectedBundleOptionValue)]! | A list of products that represent the values of the parent option + +#### ItemSelectedBundleOptionValue attributes {#ItemSelectedBundleOptionValue} + +Attribute | Data type | Description +--- | --- | --- +`id` | ID! | The unique identifier of the option +`price` | Money! | The price of the child bundle product +`product_name` | String! | The name of the child bundle product +`product_sku` | String! | The SKU of the child bundle product +`quantity` | Float! | Indicates how many of this bundle product were ordered + +#### KeyValue attributes {#KeyValue} + +The `KeyValue` object defines key/attribute pairs that are passed to or from the payment processor. + +Attribute | Data type | Description +--- | --- | --- +`name` | String | The name part of the name/value pair +`value` | String | The value part of the name/value pair + +#### OrderAddress attributes {#OrderAddress} + +The `OrderAddress` object can contain the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`city` | String! | The city or town +`company` | String | The customer's company +`country_code` | CountryCodeEnum | The customer's country +`fax` | String | The fax number +`firstname` | String! | The first name of the person associated with the shipping/billing address +`lastname` | String! | The family name of the person associated with the shipping/billing address +`middlename` | String | The middle name of the person associated with the shipping/billing address +`postcode` | String | The customer's ZIP or postal code +`prefix` | String | An honorific, such as Dr., Mr., or Mrs. +`region` | String | The state or province name +`region_id` | ID | The unique ID for a pre-defined region +`street` | [String!]! | An array of strings that define the street number and name +`suffix` | String | A value such as Sr., Jr., or III +`telephone` | String! | The telephone number +`vat_id` | String | The customer's Tax/VAT number (for corporate customers) + +#### OrderItemInterface {#OrderItemInterface} + +`OrderItemInterface` defines the following attributes. + +{% include graphql/order-item-interface.md %} + +[OrderItemInterface attributes and implementations]({{page.baseurl}}/graphql/interfaces/order-item-interface.html) provides additional information about the implementations of this interface. + +#### OrderItemOption attributes {#OrderItemOption} + +Attribute | Data type | Description +--- | --- | --- +`label` | String! | The name of the option +`value` | String! | The value of the option + +#### OrderShipment attributes {#OrderShipment} + +Attribute | Data type | Description +--- | --- | --- +`comments` | [[SalesCommentItem](#SalesCommentItem)] | Comments added to the shipment +`id` | ID! | The unique ID of the shipment +`items` | [[ShipmentItemInterface](#ShipmentItemInterface)] | Contains items included in the shipment +`number` | String! | The sequential credit shipment number +`tracking` | [[ShipmentTracking](#ShipmentTracking)] | Contains shipment tracking detail + +#### OrderTotal attributes {#OrderTotal} + +The `OrderTotal` object contains details about the sales total amounts used to calculate the final price. + +Attribute | Data type | Description +--- | --- | --- +`base_grand_total` | Money! | The final base grand total amount in the base currency +`discounts` | [Discount] | The applied discounts to the order +`grand_total` | Money! | The final total amount, including shipping, discounts, and taxes +`shipping_handling` | [ShippingHandling](#ShippingHandling) | The shipping and handling costs for the order +`subtotal` | Money! | The subtotal of the order, excluding shipping, discounts, and taxes +`taxes` | [[TaxItem](#TaxItem)]! | An array containing information about taxes on individual orders +`total_shipping` | Money! | The shipping costs for the order +`total_tax` | Money! | The amount of tax applied to the order + +#### PaymentMethod attributes {#PaymentMethod} + +The PaymentMethod data type contains details about the payment method used to pay for the order. + +Attribute | Data type | Description +--- | --- | --- +`additional_data` | [[KeyValue](#KeyValue)] | Additional data per payment method type +`name` | String! | The label that describes the payment method +`type` | String! | The payment method code that indicates how the order was paid for + +#### RewardPoints attributes {#RewardPoints} + +The `RewardPoints` object provides details about the customer's reward points balance, history, and related information. + +Attribute | Data type | Description +--- | --- | --- +`balance`| [RewardPointsAmount](#RewardPointsAmount) | The current balance of reward points +`balance_history` | [[RewardPointsBalanceHistoryItem]](#RewardPointsBalanceHistoryItem) | The balance history of reward points. If the ability for customers to view the balance history has been disabled in the Admin, this field will be set to null +`exchange_rates`| [RewardPointsExchangeRates](#RewardPointsExchangeRates) | The current exchange rates for reward points +`subscription_status` | [RewardPointsSubscriptionStatus](#RewardPointsSubscriptionStatus) | The subscription status of emails related to reward points + +#### RewardPointsAmount attributes {#RewardPointsAmount} + +The `RewardPointsAmount` object lists the customer's current reward points balance. + +Attribute | Data type | Description +--- | --- | --- +`money` | Money! | The amount of reward points, expressed in the currency of the store +`points` | Float! | The amount of reward points, expressed in points + +#### RewardPointsBalanceHistoryItem {#RewardPointsBalanceHistoryItem} + +The `RewardPointsBalanceHistoryItem` object contains details about individual events in which the customer earned or redeemed reward points. + +Attribute | Data type | Description +--- | --- | --- +`balance` | [RewardPointsAmount](#RewardPointsAmount) | Reward points balance after the completion of the transaction +`change_reason` | String! | The reason the balance changed +`date` | String! | Transaction date +`points_change` | Float! | The number of points added or deducted in the transaction + +#### RewardPointsExchangeRates attributes {#RewardPointsExchangeRates} + +The `RewardPointsExchangeRates` object contains information needed to exchange reward points into the store's currency. Exchange rates depend on the customer group. + +Attribute | Data type | Description +--- | --- | --- +`earning` | [RewardPointsRate](#RewardPointsRate) | The number of points earned for the amount spent +`redemption` | [RewardPointsRate](#RewardPointsRate) | The number points must be redeemed to get a currency discount at checkout + +#### RewardPointsRate attributes {#RewardPointsRate} + +The `RewardPointsRate` object contains details about reward points exchange rates. + +Attribute | Data type | Description +--- | --- | --- +`currency_amount` | Float! | The monetary value of the exchange rate. For earnings, this is amount spent to earn the specified points. For redemptions, this is the amount of money the number of points represents +`points` | Float! | The number of points for the exchange rate. For earnings, this is the number of points earned. For redemptions, this is the number of points needed for to redeem points + +#### RewardPointsSubscriptionStatus attributes {#RewardPointsSubscriptionStatus} + +The `RewardPointsSubscriptionStatus` object indicates whether the customer is subscribed to newsletters that provide reward points balances and expiration notifications. The possible values of these attribtutes are `NOT SUBSCRIBED` and `SUBSCRIBED`. + +Attribute | Data type | Description +--- | --- | --- +`balance_updates` | RewardPointsSubscriptionStatusesEnum! | Customer subscription status to 'Reward points balance updates' emails +`points_expiration_notifications` | RewardPointsSubscriptionStatusesEnum! | Customer subscription status to 'Reward points expiration notifications' emails + +#### SalesCommentItem attributes {#SalesCommentItem} + +The `SalesCommentItem` object contains details about a comment applied to an order. + +Attribute | Data type | Description +--- | --- | --- +`message` | String!| The text of the message +`timestamp` | String! | The timestamp of the comment + +#### SalesItemOption attributes {#SalesItemOption} + +The `SalesItemOption` data type contains the ID and value for the selected or entered options. + +Attribute | Data type | Description +--- | --- | --- +`id` | String! | The name of the option +`value` | String! | The value of the option + +#### SearchResultPageInfo attributes {#SearchResultPageInfo} + +The `SearchResultPageInfo` data type provides pagination for the items returned by the `orders` filter. + +Attribute | Data type | Description +--- | --- | --- +`current_page` | Int | Specifies which page of results to return +`page_size` | Int | Specifies the maximum number of items to return +`total_pages` | Int | Total pages + +#### ShipmentItemInterface attributes {#ShipmentItemInterface} + +`ShipmentItemInterface` defines the following attributes. + +{% include graphql/shipment-item-interface.md %} + +[ShipmentItemInterface attributes and implementations]({{page.baseurl}}/graphql/interfaces/order-item-interface.html) provides additional information about the implementations of this interface. + +#### ShipmentTracking attributes {#ShipmentTracking} + +The ShipmentTracking object contains the shipping carrier name and other tracking details. + +Attribute | Data type | Description +--- | --- | --- +`carrier` | String! | The shipping carrier for the order delivery +`number` | String | The tracking number of the order shipment +`title` | String! | The shipment tracking title + +#### ShippingDiscount attributes {#ShippingDiscount} + +The ShippingDiscount object defines an individual discount that can be applied to shipping. + +Attribute | Data type | Description +--- | --- | --- +`amount` | Money! | The amount of the discount + +#### ShippingHandling attributes {#ShippingHandling} + +The `ShippingHandling` object provides details about shipping and handling charges. + +Attribute | Data type | Description +--- | --- | --- +`amount_excluding_tax` | Money | The shipping amount, excluding tax +`amount_including_tax` | Money | The shipping amount, including tax +`discounts` | [ShippingDiscount] | The applied discounts to the shipping +`taxes` | [[TaxItem](#TaxItem)] | Contains details about taxes applied for shipping +`total_amount`| Money! | The total amount for shipping + +#### TaxItem attributes {#TaxItem} + +Attribute | Data type | Description +--- | --- | --- +`amount` | Money! | The amount of tax applied to an order +`rate` | Float | The tax rate applied to an order +`title` | String! | A label that describes the tax diff --git a/src/_includes/graphql/customer-output-24.md b/src/_includes/graphql/customer-output-24.md index d403b4ce21e..65377603b01 100644 --- a/src/_includes/graphql/customer-output-24.md +++ b/src/_includes/graphql/customer-output-24.md @@ -1,6 +1,16 @@ +{% if page.url contains 'graphql/queries/customer.html' %} +{% assign customeraddress_text = '[CustomerAddress](#customerAddressOutput)' %} +{% assign customeroutput_text = '[CustomerOrders](#customerOrders)' %} +{% assign crossref_text = '. See [`orders` input attributes](#orders) for details' %} +{% else %} +{% assign customeraddress_text = 'CustomerAddress' %} +{% assign customeroutput_text = '[CustomerOrders]' %} +{% assign crossref_text = '' %} +{% endif %} + Attribute | Data Type | Description --- | --- | --- -`addresses` | [CustomerAddress](#customerAddressOutput) | An array containing the customer's shipping and billing addresses +`addresses` | {{ customeraddress_text }} | An array containing the customer's shipping and billing addresses `created_at` | String | Timestamp indicating when the account was created `date_of_birth` | String | The customer's date of birth `default_billing` | String | The ID assigned to the billing address @@ -14,9 +24,10 @@ Attribute | Data Type | Description `is_subscribed` | Boolean | Indicates whether the customer is subscribed to the company's newsletter `lastname` | String | The customer's family name `middlename` |String | The customer's middle name +`orders()` | {{ customeroutput_text }} | A list of the customer's placed orders{{ crossref_text }} `prefix` | String | An honorific, such as Dr., Mr., or Mrs. +`reviews(pageSize: Int = 20 currentPage: Int = 1)` | ProductReviews! | The list of reviews of the product +`reward_points` | RewardPoints | Details about the customer's reward points `suffix` | String | A value such as Sr., Jr., or III `taxvat` | String | The customer's Tax/VAT number (for corporate customers) `wishlist` | Wishlist! | Contains the contents of the customer's wish lists - -{% include graphql/customer-address-output-24.md %} diff --git a/src/_includes/graphql/downloadable-items-links.md b/src/_includes/graphql/downloadable-items-links.md new file mode 100644 index 00000000000..0ee816ac7c0 --- /dev/null +++ b/src/_includes/graphql/downloadable-items-links.md @@ -0,0 +1,9 @@ +#### DownloadableItemsLinks attributes {#DownloadableItemsLinks} + +The `DownloadableItemsLinks` object defines characteristics of a downloadable product. + +Attribute | Data type | Description +--- | --- | --- +`sort_order` | Int | A number indicating the sort order +`title`| String | The display name of the link +`uid` | ID! | A string that encodes option details \ No newline at end of file diff --git a/src/_includes/graphql/entered-option-input.md b/src/_includes/graphql/entered-option-input.md new file mode 100644 index 00000000000..b3a84b11175 --- /dev/null +++ b/src/_includes/graphql/entered-option-input.md @@ -0,0 +1,6 @@ +The `EnteredOptionInput` object must contain the following attributes. + +Attribute | Data Type | Description +--- | --- | --- +`uid` | ID! | An encoded ID +`value` | String! | Text the customer entered diff --git a/src/_includes/graphql/gift-card-item.md b/src/_includes/graphql/gift-card-item.md new file mode 100644 index 00000000000..d5c18109fe8 --- /dev/null +++ b/src/_includes/graphql/gift-card-item.md @@ -0,0 +1,11 @@ +#### GiftCardItem attributes {#GiftCardItem} + +The `GiftCardItem` object contains selected buyer-entered gift card properties for an order item. + +Attribute | Data type | Description +--- | --- | --- +`message`| String | A message provided by the sender to the recipient +`recipient_email` | String | The email provided for the recipient of a virtual gift card +`recipient_name` | String | The name provided for the recipient of a physical or virtual gift card +`sender_email` | String | The sender email provided for a virtual gift card +`sender_name` | String | The sender name provided for a physical or virtual gift card diff --git a/src/_includes/graphql/gift-message.md b/src/_includes/graphql/gift-message.md new file mode 100644 index 00000000000..4bbc63b9aae --- /dev/null +++ b/src/_includes/graphql/gift-message.md @@ -0,0 +1,7 @@ +The `GiftMessage` object can contain the following attributes. + +Attribute | Data Type | Description +--- | --- | --- +`from` | String! | The name of the gift sender +`message` | String! | The text of the gift message +`to` | String! | The name of the gift recipient diff --git a/src/_includes/graphql/gift-wrapping.md b/src/_includes/graphql/gift-wrapping.md new file mode 100644 index 00000000000..878fd99db5b --- /dev/null +++ b/src/_includes/graphql/gift-wrapping.md @@ -0,0 +1,17 @@ +The `GiftWrapping` object can contain the following attributes. + +Attribute | Data Type | Description +--- | --- | --- +`design` | String! | The name of the gift wrapping design +`id` | ID! | The unique identifier for the gift wrapping option +`image` | [GiftWrappingImage](#GiftWrappingImage) | The preview image for the gift wrapping option +`price` | Money! | The price of the gift wrapping option + +### GiftWrappingImage object {#GiftWrappingImage} + +The `GiftWrappingImage` object must contain the following attributes. + +Attribute | Data Type | Description +--- | --- | --- +`label` | String! | The label of the gift wrapping preview image +`url` | String! | The URL of the gift wrapping preview image diff --git a/src/_includes/graphql/invoice-item-interface.md b/src/_includes/graphql/invoice-item-interface.md new file mode 100644 index 00000000000..48799c6a6b5 --- /dev/null +++ b/src/_includes/graphql/invoice-item-interface.md @@ -0,0 +1,9 @@ +Attribute | Data type | Description +--- | --- | --- +`discounts` | [Discount] | Contains information about the final discount amount for the base product, including discounts on options +`id` | ID! | The unique ID of the invoice item +`order_item` | OrderItemInterface | Contains details about an individual order item +`product_name` | String | The name of the base product +`product_sale_price` | Money! | The sale price for the base product including selected options +`product_sku` | String! | The SKU of the base product +`quantity_invoiced` | Float |The number of invoiced items \ No newline at end of file diff --git a/src/_includes/graphql/item-selected-bundle-option.md b/src/_includes/graphql/item-selected-bundle-option.md new file mode 100644 index 00000000000..dc8814a8711 --- /dev/null +++ b/src/_includes/graphql/item-selected-bundle-option.md @@ -0,0 +1,19 @@ +#### ItemSelectedBundleOption attributes {#ItemSelectedBundleOption} + +The ItemSelectedBundleOption object contains a list of bundle options that are assigned to the bundle product. + +Attribute | Data type | Description +--- | --- | --- +`id` | ID! | The unique identifier of the option +`label` | String! | The label of the option +`values` | [[ItemSelectedBundleOptionValue](#ItemSelectedBundleOptionValue)] | A list of products that represent the values of the parent option + +#### ItemSelectedBundleOptionValue attributes {#ItemSelectedBundleOptionValue} + +Attribute | Data type | Description +--- | --- | --- +`id` | ID! | The unique identifier of the option +`price` | Money! | The price of the child bundle product +`product_name` | String! | The name of the child bundle product +`product_sku` | String! | The SKU of the child bundle product +`quantity` | Float! | Indicates how many of this bundle product were ordered diff --git a/src/_includes/graphql/order-item-interface.md b/src/_includes/graphql/order-item-interface.md new file mode 100644 index 00000000000..2df31613a76 --- /dev/null +++ b/src/_includes/graphql/order-item-interface.md @@ -0,0 +1,18 @@ +Attribute | Data Type | Description +--- | --- | --- +`discounts` | [Discount] | Final discount information for the product +`entered_options` | [OrderItemOption] | The entered option for the base product, such as a logo or image +`id` | ID! | The unique identifier for the order item +`product_name` | String | The name of the base product +`product_sale_price` | Money! | The sale price of the base product, including selected options +`product_sku` | String! | SKU of the base product +`product_type` | String | The type of product, such as simple or configurable +`product_url_key` | String | URL key of the base product +`quantity_canceled` | Float | The number of canceled items +`quantity_invoiced` | Float | The number of invoiced items +`quantity_ordered` | Float | The number of units ordered for this item +`quantity_refunded` | Float | The number of refunded items +`quantity_returned` | Float | The number of returned items +`quantity_shipped` | Float | The number of shipped items +`selected_options` | [OrderItemOption] | The selected options for the base product, such as color or size +`status` | String | The status of the order item \ No newline at end of file diff --git a/src/_includes/graphql/product-review.md b/src/_includes/graphql/product-review.md new file mode 100644 index 00000000000..5123474cd05 --- /dev/null +++ b/src/_includes/graphql/product-review.md @@ -0,0 +1,20 @@ +The `ProductReview` object contains details about a product review. It contains the following attributes. + +Attribute | Data Type | Description +--- | --- | --- +`average_rating` | Float! | The average rating for product review +`created_at` | String! | Date indicating when the review was created +`nickname` | String! | The customer's nickname. Defaults to the customer name, if logged in +`product` | ProductInterface! | Contains details about the reviewed product +`ratings_breakdown` | [ProductReviewRating!]! | An array of ratings by rating category, such as quality, price, and value +`summary` | String! | The summary (title) of the review +`text` | String! | The review text + +### ProductReviewRating attributes {#ProductReviewRating} + +The `ProductReviewRating` object contains the following attributes. + +Attribute | Data Type | Description +--- | --- | --- +`name` | String! | The label assigned to an aspect of a product that is being rated, such as quality or price +`value` | String! | The rating value given by customer. By default, possible values range from 1 to 5 diff --git a/src/_includes/graphql/shipment-item-interface.md b/src/_includes/graphql/shipment-item-interface.md new file mode 100644 index 00000000000..3f4d4c6e7f0 --- /dev/null +++ b/src/_includes/graphql/shipment-item-interface.md @@ -0,0 +1,8 @@ +Attribute | Data type | Description +--- | --- | --- +`id` | ID! | The unique ID of the shipment item +`order_item`| [OrderItemInterface]({{page.baseurl}}/graphql/interfaces/order-item-interface.html) | The shipped order item +`product_name` | String | The name of the base product +`product_sale_price` | Money! | The sale price for the base product +`product_sku` | String! | The SKU of the base product +`quantity_shipped` | Float! | The number of shipped items diff --git a/src/_includes/graphql/store-config.md b/src/_includes/graphql/store-config.md new file mode 100644 index 00000000000..341ef19c896 --- /dev/null +++ b/src/_includes/graphql/store-config.md @@ -0,0 +1,108 @@ +The `StoreConfig` object can contain the following attributes. + +Attribute | Data Type | Description | Default or example value +--- | --- | --- | --- +`absolute_footer` | String | Contains scripts that must be included in the HTML before the closing `` tag | null +`allow_gift_wrapping_on_order` | String | Indicates whether gift wrapping can be added for the entire order. Possible values: 1 (Yes) and 0 (No) | 1 +`allow_gift_wrapping_on_order_items` | String | Indicates whether gift wrapping can be added for individual order items. Possible values: 1 (Yes) and 0 (No) | 1 +`allow_gift_receipt` | String | Indicates if the gift sender has the option to send a gift receipt. Possible values: 1 (Yes) and 0 (No) | 1 +`allow_guests_to_write_product_reviews` | String | Indicates whether guest users can write product reviews. Possible values: 1 (Yes) and 0 (No) | 1 +`allow_items` | String | Allows gift messages for order items. Possible values: 1 (Yes) and 0 (No).
Configuration path: sales/gift_options/allow_items | 0 +`allow_order` | String | Allows gift messages at the order level. Possible values: 1 (Yes) and 0 (No).
Configuration path: sales/gift_options/allow_order | 0 +`allow_printed_card` | String | Indicates if a printed card can accompany an order. Possible values: 1 (Yes) and 0 (No) | 1 +`autocomplete_on_storefront` | Boolean | Enable autocomplete on login and forgot password forms.
Configuration path: customer/password/autocomplete_on_storefront | true +`base_currency_code` | String | The code representing the currency in which Magento processes all payment transactions | `USD` +`base_link_url` | String | A fully-qualified URL that is used to create relative links to the `base_url` | `http://magentohost.example.com/` +`base_media_url` | String | The fully-qualified URL that specifies the location of user media files | `http://magentohost.example.com/pub/media/` +`base_static_url` | String | The fully-qualified URL that specifies the location of static view files | `http://magentohost.example.com/pub/static/` +`base_url` | String | The store's fully-qualified base URL | `http://magentohost.example.com/` +`cart_gift_wrapping` | String | Indicates if gift wrapping prices are displayed on the Shopping Cart page. Possible values: 1 (Yes) and 0 (No) | 1 +`cart_printed_card` | String | Indicates if printed card prices are displayed on the Shopping Cart page. Possible values: 1 (Yes) and 0 (No) | 1 +`catalog_default_sort_by` | String | The default sort order of the search results list | `position` +`category_fixed_product_tax_display_setting` | [FixedProductTaxDisplaySettings](#FixedProductTaxDisplaySettings) | Corresponds to the **Display Prices In Product Lists** field. It indicates how Fixed Product Tax information is displayed on category pages | FPT_DISABLED +`category_url_suffix` | String | The suffix applied to category pages, such as `.htm` or `.html` | `.html` +`cms_home_page` | String | Returns the name of the CMS page that identifies the home page for the store | `home` +`cms_no_cookies` | String | Identifies a specific CMS page that appears when cookies are not enabled for the browser | `enable-cookies` +`cms_no_route` | String | Identifies a specific CMS page that you want to appear when a 404 “Page Not Found” error occurs | `no-route` +`code` | String | A unique identifier for the store | `default` +`copyright` | String | The copyright statement that appears at the bottom of each page | Copyright © 2013-present Magento, Inc. All rights reserved. +`default_description` | String | The description that provides a summary of your site for search engine listings and should not be more than 160 characters in length | null +`default_display_currency_code` | String | The code representing the currency displayed on the store | `USD` +`default_keywords` | String | A series of keywords that describe your store, each separated by a comma | `Magento, Varien, E-commerce` +`default_title` | String | The title that appears at the title bar of each page when viewed in a browser | Magento Enterprise Edition +`demonotice` | Int | Controls the display of the demo store notice at the top of the page. Options: `0` (No) or `1` (Yes) | 0 +`front` | String | Indicates the landing page that is associated with the base URL | `cms` +`grid_per_page` | Int | The default number of products per page in Grid View | `9` +`grid_per_page_values` | String | A list of numbers that define how many products can be displayed in List View | `9,15,30` +`head_includes` | String | Contains scripts that must be included in the HTML before the closing `` tag | `` +`head_shortcut_icon` | String | Uploads the small graphic image that appears in the address bar and tab of the browser | null +`header_logo_src` | String | The path to the logo that appears in the header | null +`id` | Int | The ID number assigned to the store | `1` +`list_mode` | String | The format of the search results list | `grid-list` +`list_per_page` | Int | The default number of products per page in List View | `10` +`list_per_page_values` | String | A list of numbers that define how many products can be displayed in List View | `5,10,15,20,25` +`locale` | String | The store's locale | `en_US` +`logo_alt` | String | The Alt text that is associated with the logo | null +`logo_height` | Int | The height of your logo image in pixels | null +`logo_width` | Int | The width of your logo image in pixels | null +`magento_reward_general_is_enabled_on_front` | String | Indicates whether reward points functionality is enabled on the storefront | `1` (enabled) +`magento_reward_general_is_enabled` | String | Indicates whether reward points are enabled. | `1` (enabled) +`magento_reward_general_min_points_balance` | String | The minimum point balance customers must have before they can redeem them. A null value indicates no minimum | null +`magento_reward_general_publish_history` | String | When enabled, customers can see a detailed history of their reward points | `1` (enabled) +`magento_reward_points_invitation_customer_limit` | String | The maximum number of registration referrals that qualify for rewards. A null value indicates no limit | null +`magento_reward_points_invitation_customer` | String | The number of points for a referral when the invitee registers on the site | null +`magento_reward_points_invitation_order_limit` | String | The number of order conversions that can earn points for the customer who sends the invitation. A null value indicates no limit | null +`magento_reward_points_invitation_order` | String | The number of points for a referral when the invitee places their first order on the site | null +`magento_reward_points_newsletter` | String | The number of points earned by registered customers who subscribe to a newsletter | null +`magento_reward_points_order` | String | Indicates whether customers earn points for shopping according to the reward point exchange rate. In Luma, this also controls whether to show a message in the shopping cart about the rewards points earned for the purchase, as well as the customer’s current reward point balance | null +`magento_reward_points_register` | String | The number of points a customer gets for registering | null +`magento_reward_points_review_limit` | String | The maximum number of reviews that qualify for rewards. A null value indicates no limit | null +`magento_reward_points_review` | String | The number of points for writing a review | null +`magento_wishlist_general_is_enabled` | String | Indicates whether wish lists are enabled (1) or disabled (0) +`minimum_password_length` | String | The minimum number of characters required for a valid password.
Configuration path: customer/password/minimum_password_length | 6 +`no_route` | String | Contains the URL of the default page that you want to appear when if a 404 “Page not Found” error occurs | `cms/noroute/index` +`payment_payflowpro_cc_vault_active` | String | Payflow Pro vault status | `0` (inactive) or `1` (active) +`printed_card_price` | String | The default price of a printed card that accompanies an order | 10 +`product_fixed_product_tax_display_setting` | [FixedProductTaxDisplaySettings](#FixedProductTaxDisplaySettings) | Corresponds to the **Display Prices On Product View Page** field. It indicates how Fixed Product Taxes information is displayed on product pages | FPT_DISABLED +`product_reviews_enabled` | String | Indicates whether product reviews are enabled. Possible values: 1 (Yes) and 0 (No) | 1 +`product_url_suffix` | String | The suffix applied to product pages, such as `.htm` or `.html` | `.html` +`required_character_classes_number` | String | The number of different character classes required in a password (lowercase, uppercase, digits, special characters).
Configuration path: customer/password/required_character_classes_number | 2 +`root_category_id` | Int | The ID of the root category | 2 +`sales_fixed_product_tax_display_setting` | [FixedProductTaxDisplaySettings](#FixedProductTaxDisplaySettings) | Corresponds to the **Display Prices In Sales Modules** field. It indicates how Fixed Product Taxes information is displayed on cart, checkout, and order pages | FPT_DISABLED +`sales_gift_wrapping` | String | Indicates if gift wrapping prices are displayed on the Orders page. Possible values: 1 (Yes) and 0 (No) | 1 +`sales_printed_card` | String | Indicates if printed card prices are displayed on the Orders page. Possible values: 1 (Yes) and 0 (No) | 1 +`secure_base_link_url` | String | A secure fully-qualified URL that is used to create relative links to the `base_url` | `https://magentohost.example.com/` +`secure_base_media_url` | String | The secure fully-qualified URL that specifies the location of user media files | `https://magentohost.example.com/pub/media/` +`secure_base_static_url` | String | The secure fully-qualified URL that specifies the location of static view files | `https://magentohost.example.com/pub/static/` +`secure_base_url` | String | The store's fully-qualified secure base URL | `https://magentohost.example.com/` +`send_friend` | [SendFriendConfiguration](#SendFriendConfiguration) | Email to a Friend configuration | Not applicable +`show_cms_breadcrumbs` | Int | Determines if a breadcrumb trail appears on all CMS pages in the catalog. Options: `0` (No) or `1` (Yes) | 1 +`store_name` | String | The store's name | `My Store` +`timezone` | String | The store's time zone | `America/Chicago` +`title_prefix` | String | A prefix that appears before the title to create a two- or three-part title | null +`title_separator` | String | Identifies the character that separates the category name and subcategory in the browser title bar | `-` +`title_suffix` | String | A suffix that appears after the title to create a two-or three part title | null +`website_id` | Integer | The ID number assigned to the parent website | `1` +`weight_unit` | String | The weight unit for products | `lbs`, `kgs`, or similar +`welcome` | String | Text that appears in the header of the page and includes the name of customers who are logged in | Default welcome msg! + +### SendFriendConfiguration attributes {#SendFriendConfiguration} + +Attribute | Data Type | Description +--- | --- | --- +`enabled_for_customers` | Boolean! | Indicates whether the Email to a Friend feature is enabled for customers +`enabled_for_guests` | Boolean! | Indicates whether the Email to a Friend feature is enabled for guests + +### FixedProductTaxDisplaySettings attributes {#FixedProductTaxDisplaySettings} + +The **Stores** > Settings > **Configuration** > **Sales** > **Tax** > **Fixed Product Taxes** panel contains several fields that determine how to display fixed product tax (FPT) values and descriptions. + +The `FixedProductTaxDisplaySettings` data type is an enumeration that describes whether displayed prices include fixed product taxes and whether Magento separately displays detailed information about the FPTs. These attributes are defined in the `WeeeGraphQl` module. + +Value | Description +--- | --- +EXCLUDE_FPT_AND_INCLUDE_WITH_DETAILS | The displayed price does not include the FPT amount. You must display the values of `ProductPrice.fixed_product_taxes` and the price including the FPT separately. This value corresponds to **Excluding FPT, Including FPT description and final price** +EXCLUDE_FPT_WITHOUT_DETAILS | The displayed price does not include the FPT amount. The values from `ProductPrice.fixed_product_taxes` are not displayed. This value corresponds to **Excluding FPT** +FPT_DISABLED | The FPT feature is not enabled. You can omit `ProductPrice.fixed_product_taxes` from your query +INCLUDE_FPT_WITH_DETAILS | The displayed price includes the FPT amount while displaying the values of `ProductPrice.fixed_product_taxes` separately. This value corresponds to **Including FPT and FPT description** +INCLUDE_FPT_WITHOUT_DETAILS | The displayed price includes the FPT amount without displaying the `ProductPrice.fixed_product_taxes` values. This value corresponds to **Including FPT only** diff --git a/src/_includes/graphql/wishlist-user-input-errors.md b/src/_includes/graphql/wishlist-user-input-errors.md new file mode 100644 index 00000000000..2e08887a9e9 --- /dev/null +++ b/src/_includes/graphql/wishlist-user-input-errors.md @@ -0,0 +1,6 @@ +The `WishListUserInputError` object contains information about errors that are specific to wish lists. + +Attribute | Data Type | Description +--- | --- | --- +`code` | WishListUserInputErrorType! | A wish list-specific error code. Possible values include `PRODUCT_NOT_FOUND` and `UNDEFINED` +`message` | String! | A localized error message diff --git a/src/_includes/graphql/wishlist.md b/src/_includes/graphql/wishlist.md new file mode 100644 index 00000000000..5bc13a10beb --- /dev/null +++ b/src/_includes/graphql/wishlist.md @@ -0,0 +1,21 @@ +The `Wishlist` object contains all the items in the customer's wish list. + +Attribute | Data type | Description +--- | --- | --- +`id` | ID | The unique identifier of the wish list +`items` | [[WishlistItem](#WishlistItem)] | An array of items in the customer's wish list +`items_count` | Int | The number of items in the wish list +`sharing_code` | String | An encrypted code that Magento uses to link to the wish list +`updated_at` | String | The time of the last modification to the wish list + +#### WishlistItem attributes {#WishlistItem} + +The `WishlistItem` object can contain the following attributes. + +Attribute | Data type | Description +--- | --- | --- +`added_at` | String | The time when the customer added the item to the wish list +`description` | String | The customer's comment about this item +`id` | Int | The wish list item ID +`product` | [ProductInterface]({{ page.baseurl }}/graphql/interfaces/product-interface.html) | The ProductInterface contains attributes that are common to all types of products. Note that descriptions may not be available for custom and EAV attributes +`qty` | Float | The quantity of this wish list item \ No newline at end of file diff --git a/src/_includes/release-notes/engcomm-2-4-1-issues.md b/src/_includes/release-notes/engcomm-2-4-1-issues.md new file mode 100644 index 00000000000..9bbb7087c30 --- /dev/null +++ b/src/_includes/release-notes/engcomm-2-4-1-issues.md @@ -0,0 +1,274 @@ + +| Contributing community member | Pull Requests | Related GitHub Issues | +| ------- | ------- | ------- | +| Nazar Klovanych | [#28048](https://github.com/magento/magento2/pull/28048) | | +| Volodymyr Zaets | [#27948](https://github.com/magento/magento2/pull/27948) | | +| Volodymyr Zaets | [#27662](https://github.com/magento/magento2/pull/27662) | | +| Ajith | [#26704](https://github.com/magento/magento2/pull/26704) | | +| Tu Nguyen | [#27572](https://github.com/magento/magento2/pull/27572) | [27058](https://github.com/magento/magento2/issues/27058) | +| Dzung Nguyen | [#27455](https://github.com/magento/magento2/pull/27455) | [23440](https://github.com/magento/magento2/issues/23440) | +| Rohan Hapani | [#27359](https://github.com/magento/magento2/pull/27359) | [27358](https://github.com/magento/magento2/issues/27358) | +| Mateusz Krzeszowiak | [#27622](https://github.com/magento/magento2/pull/27622) | [28110](https://github.com/magento/magento2/issues/28110) | +| Mateusz Krzeszowiak | [#27270](https://github.com/magento/magento2/pull/27270) | [26026](https://github.com/magento/magento2/issues/26026) | +| Serhii Dzhepa | [#28168](https://github.com/magento/magento2/pull/28168) | | +| Oleg Aleksin | [#28150](https://github.com/magento/magento2/pull/28150) | [28149](https://github.com/magento/magento2/issues/28149) | +| Sathish Subramanian | [#28113](https://github.com/magento/magento2/pull/28113) | [28165](https://github.com/magento/magento2/issues/28165) | +| Nikola Lardev | [#27957](https://github.com/magento/magento2/pull/27957) | [28215](https://github.com/magento/magento2/issues/28215) | +| Marvin Hinz| [#26572](https://github.com/magento/magento2/pull/26572) | [26550](https://github.com/magento/magento2/issues/26550) | +| Sathish Subramanian | [#28174](https://github.com/magento/magento2/pull/28174) | [28201](https://github.com/magento/magento2/issues/28201) | +| Vadim Malesh | [#28108](https://github.com/magento/magento2/pull/28108) | [5477](https://github.com/magento/magento2/issues/5477) | +| Dmitry Tsymbal | [#28112](https://github.com/magento/magento2/pull/28112) | [28202](https://github.com/magento/magento2/issues/28202) | +| Tu Nguyen | [#27828](https://github.com/magento/magento2/pull/27828) | [27543](https://github.com/magento/magento2/issues/27543) | +| Tu Nguyen | [#27642](https://github.com/magento/magento2/pull/27642) | [27633](https://github.com/magento/magento2/issues/27633) | +| Alok Patel | [#27134](https://github.com/magento/magento2/pull/27134) | [28167](https://github.com/magento/magento2/issues/28167) | +| Tu Nguyen | [#28084](https://github.com/magento/magento2/pull/28084) | [28059](https://github.com/magento/magento2/issues/28059) | +| Tu Nguyen | [#28083](https://github.com/magento/magento2/pull/28083) | [27095](https://github.com/magento/magento2/issues/27095) | +| Ajith | [#28039](https://github.com/magento/magento2/pull/28039) | | +| Tu Nguyen | [#28032](https://github.com/magento/magento2/pull/28032) | [22702](https://github.com/magento/magento2/issues/22702), [26022](https://github.com/magento/magento2/issues/26022) | +| Oleh Usik | [#27670](https://github.com/magento/magento2/pull/27670) | | +| Ivan Chepurnyi | [#22829](https://github.com/magento/magento2/pull/22829) | | +| Oleh Usik | [#28466](https://github.com/magento/magento2/pull/28466) | | +| Oleh Usik | [#28450](https://github.com/magento/magento2/pull/28450) | | +| Oleh Usik | [#28449](https://github.com/magento/magento2/pull/28449) | | +| Kate Kyzyma | [#28418](https://github.com/magento/magento2/pull/28418) | | +| Kate Kyzyma | [#28408](https://github.com/magento/magento2/pull/28408) | | +| Kate Kyzyma | [#28391](https://github.com/magento/magento2/pull/28391) | | +| Kate Kyzyma | [#28361](https://github.com/magento/magento2/pull/28361) | [28393](https://github.com/magento/magento2/issues/28393) | +| Dmitry Tsymbal | [#28330](https://github.com/magento/magento2/pull/28330) | [28377](https://github.com/magento/magento2/issues/28377) | +| Alexander Taranovsky | [#28304](https://github.com/magento/magento2/pull/28304) | [28394](https://github.com/magento/magento2/issues/28394) | +| Nikolaj Malevanec | [#28287](https://github.com/magento/magento2/pull/28287) | [28392](https://github.com/magento/magento2/issues/28392) | +| Oleh Usik | [#28105](https://github.com/magento/magento2/pull/28105) | [253](https://github.com/magento/magento2/issues/253) | +| Alexander Taranovsky | [#28034](https://github.com/magento/magento2/pull/28034) | [28138](https://github.com/magento/magento2/issues/28138) | +| Oleh Usik | [#27956](https://github.com/magento/magento2/pull/27956) | [253](https://github.com/magento/magento2/issues/253) | +| Lukasz Bajsarowicz | [#27903](https://github.com/magento/magento2/pull/27903) | | +| Lukasz Bajsarowicz | [#27902](https://github.com/magento/magento2/pull/27902) | [28383](https://github.com/magento/magento2/issues/28383) | +| Mateusz Krzeszowiak | [#27871](https://github.com/magento/magento2/pull/27871) | [28339](https://github.com/magento/magento2/issues/28339) | +| Evgeny Levinsky | [#27839](https://github.com/magento/magento2/pull/27839) | [28305](https://github.com/magento/magento2/issues/28305) | +| Mateusz Krzeszowiak | [#27690](https://github.com/magento/magento2/pull/27690) | [28340](https://github.com/magento/magento2/issues/28340) | +| Mateusz Krzeszowiak | [#27619](https://github.com/magento/magento2/pull/27619) | [28381](https://github.com/magento/magento2/issues/28381) | +| Mateusz Krzeszowiak | [#27618](https://github.com/magento/magento2/pull/27618) | [28382](https://github.com/magento/magento2/issues/28382) | +| Alexander Taranovsky | [#27586](https://github.com/magento/magento2/pull/27586) | [27337](https://github.com/magento/magento2/issues/27337) | +| Andrii Beziazychnyi | [#27481](https://github.com/magento/magento2/pull/27481) | [19481](https://github.com/magento/magento2/issues/19481) | +| Alexander Taranovsky | [#27373](https://github.com/magento/magento2/pull/27373) | [28040](https://github.com/magento/magento2/issues/28040) | +| Paweł Tylek | [#27356](https://github.com/magento/magento2/pull/27356) | [28433](https://github.com/magento/magento2/issues/28433) | +| Paweł Tylek | [#27357](https://github.com/magento/magento2/pull/27357) | [28166](https://github.com/magento/magento2/issues/28166) | +| Ihor Sviziev | [#27260](https://github.com/magento/magento2/pull/27260) | [28342](https://github.com/magento/magento2/issues/28342) | +| Oleh Usik | [#28467](https://github.com/magento/magento2/pull/28467) | | +| Kate Kyzyma | [#28407](https://github.com/magento/magento2/pull/28407) | | +| WK | [#28547](https://github.com/magento/magento2/pull/28547) | [28685](https://github.com/magento/magento2/issues/28685) | +| Eduard Chitoraga | [#28222](https://github.com/magento/magento2/pull/28222) | [28261](https://github.com/magento/magento2/issues/28261) | +| Bartłomiej Szubert | [#28015](https://github.com/magento/magento2/pull/28015) | [28011](https://github.com/magento/magento2/issues/28011) | +| Kate Kyzyma | [#28631](https://github.com/magento/magento2/pull/28631) | | +| Kate Kyzyma | [#28629](https://github.com/magento/magento2/pull/28629) | | +| Oleh Usik | [#28498](https://github.com/magento/magento2/pull/28498) | | +| Oleh Usik | [#28496](https://github.com/magento/magento2/pull/28496) | | +| Kate Kyzyma | [#28469](https://github.com/magento/magento2/pull/28469) | | +| Vadim Malesh | [#28417](https://github.com/magento/magento2/pull/28417) | [28488](https://github.com/magento/magento2/issues/28488) | +| Lukasz Bajsarowicz | [#28606](https://github.com/magento/magento2/pull/28606) | | +| Lukasz Bajsarowicz | [#28601](https://github.com/magento/magento2/pull/28601) | | +| kishorekumarkesavan | [#28264](https://github.com/magento/magento2/pull/28264) | [28308](https://github.com/magento/magento2/issues/28308) | +| Vitaliy Prokopov| [#27854](https://github.com/magento/magento2/pull/27854) | [27489](https://github.com/magento/magento2/issues/27489) | +| Eduard Chitoraga | [#27451](https://github.com/magento/magento2/pull/27451) | [21101](https://github.com/magento/magento2/issues/21101) | +| Abel Truong | [#27339](https://github.com/magento/magento2/pull/27339) | [26449](https://github.com/magento/magento2/issues/26449) | +| Alexander Menk | [#27338](https://github.com/magento/magento2/pull/27338) | [26682](https://github.com/magento/magento2/issues/26682) | +| Dipesh Rangani | [#27106](https://github.com/magento/magento2/pull/27106) | [27099](https://github.com/magento/magento2/issues/27099) | +| Bartłomiej Szubert | [#28735](https://github.com/magento/magento2/pull/28735) | [26504](https://github.com/magento/magento2/issues/26504) | +| Kate Kyzyma | [#28725](https://github.com/magento/magento2/pull/28725) | | +| Vadim Malesh | [#28332](https://github.com/magento/magento2/pull/28332) | [21237](https://github.com/magento/magento2/issues/21237) | +| Oleh Usik | [#27549](https://github.com/magento/magento2/pull/27549) | [28755](https://github.com/magento/magento2/issues/28755) | +| Oleksandr Melnyk | [#28666](https://github.com/magento/magento2/pull/28666) | | +| Petkovski Marjan | [#28714](https://github.com/magento/magento2/pull/28714) | | +| [Dmitriy Gallyamov | [#28647](https://github.com/magento/magento2/pull/28647) | [28568](https://github.com/magento/magento2/issues/28568), [28572](https://github.com/magento/magento2/issues/28572) | +| Dmitry Tsymbal | [#28641](https://github.com/magento/magento2/pull/28641) | [28720](https://github.com/magento/magento2/issues/28720) | +| Dmitry Tsymbal | [#28632](https://github.com/magento/magento2/pull/28632) | [28721](https://github.com/magento/magento2/issues/28721) | +| Dmitry Tsymbal | [#28635](https://github.com/magento/magento2/pull/28635) | [28744](https://github.com/magento/magento2/issues/28744) | +| Kate Kyzyma | [#28457](https://github.com/magento/magento2/pull/28457) | | +| Eduard Chitoraga | [#28205](https://github.com/magento/magento2/pull/28205) | | +| Oleh Usik | [#28072](https://github.com/magento/magento2/pull/28072) | [253](https://github.com/magento/magento2/issues/253), [246](https://github.com/magento/magento2/issues/246), [28519](https://github.com/magento/magento2/issues/28519) | +| Vitaliy Prokopov | [#28044](https://github.com/magento/magento2/pull/28044) | [27969](https://github.com/magento/magento2/issues/27969) | +| Mateusz Krzeszowiak | [#27616](https://github.com/magento/magento2/pull/27616) | [28807](https://github.com/magento/magento2/issues/28807) | +| Toan Nguyen | [#27064](https://github.com/magento/magento2/pull/27064) | [27063](https://github.com/magento/magento2/issues/27063) | +| Nazar Klovanych | [#28798](https://github.com/magento/magento2/pull/28798) | [1474](https://github.com/magento/magento2/issues/1474) | +| Lukasz Bajsarowicz | [#28605](https://github.com/magento/magento2/pull/28605) | [28850](https://github.com/magento/magento2/issues/28850) | +| Pavel Bystritsky | [#28213](https://github.com/magento/magento2/pull/28213) | [26089](https://github.com/magento/magento2/issues/26089) | +| Sathish Subramanian | [#28004](https://github.com/magento/magento2/pull/28004) | [27985](https://github.com/magento/magento2/issues/27985) | +| Mateusz Krzeszowiak | [#27860](https://github.com/magento/magento2/pull/27860) | [28823](https://github.com/magento/magento2/issues/28823) | +| Nazar Klovanych | [#28739](https://github.com/magento/magento2/pull/28739) | | +| Nathan de Graaf | [#28515](https://github.com/magento/magento2/pull/28515) | [28795](https://github.com/magento/magento2/issues/28795) | +| Vadim Malesh | [#28460](https://github.com/magento/magento2/pull/28460) | [28420](https://github.com/magento/magento2/issues/28420) | +| Vadim Malesh | [#28421](https://github.com/magento/magento2/pull/28421) | [28357](https://github.com/magento/magento2/issues/28357) | +| Lukasz Bajsarowicz | [#28351](https://github.com/magento/magento2/pull/28351) | [28376](https://github.com/magento/magento2/issues/28376) | +| Lukasz Bajsarowicz | [#27965](https://github.com/magento/magento2/pull/27965) | [27962](https://github.com/magento/magento2/issues/27962) | +| Sathish Subramanian | [#27567](https://github.com/magento/magento2/pull/27567) | [27091](https://github.com/magento/magento2/issues/27091) | +| quangdo-aligent | [#27429](https://github.com/magento/magento2/pull/27429) | [28306](https://github.com/magento/magento2/issues/28306) | +| Kate Kyzyma | [#28727](https://github.com/magento/magento2/pull/28727) | | +| Kate Kyzyma | [#28684](https://github.com/magento/magento2/pull/28684) | | +| Kate Kyzyma | [#28679](https://github.com/magento/magento2/pull/28679) | | +| Kate Kyzyma | [#28401](https://github.com/magento/magento2/pull/28401) | | +| jiten-patel | [#27369](https://github.com/magento/magento2/pull/27369) | [27051](https://github.com/magento/magento2/issues/27051) | +| Vadim Malesh | [#28483](https://github.com/magento/magento2/pull/28483) | [22431](https://github.com/magento/magento2/issues/22431) | +| Mateusz Krzeszowiak | [#27617](https://github.com/magento/magento2/pull/27617) | [28811](https://github.com/magento/magento2/issues/28811) | +| Vadim Malesh | [#28822](https://github.com/magento/magento2/pull/28822) | [27098](https://github.com/magento/magento2/issues/27098) | +| Oleksandr Melnyk | [#28855](https://github.com/magento/magento2/pull/28855) | | +| [Dmitriy Gallyamov | [#28745](https://github.com/magento/magento2/pull/28745) | [28628](https://github.com/magento/magento2/issues/28628) | +| Petkovski Marjan | [#28743](https://github.com/magento/magento2/pull/28743) | | +| Michał Derlatka | [#28713](https://github.com/magento/magento2/pull/28713) | [28561](https://github.com/magento/magento2/issues/28561) | +| Ulzii | [#28710](https://github.com/magento/magento2/pull/28710) | [28584](https://github.com/magento/magento2/issues/28584) | +| Alexander Taranovsky | [#28506](https://github.com/magento/magento2/pull/28506) | | +| Alexander Taranovsky | [#28492](https://github.com/magento/magento2/pull/28492) | | +| Alexander Taranovsky | [#28487](https://github.com/magento/magento2/pull/28487) | [28481](https://github.com/magento/magento2/issues/28481) | +| Alexander Taranovsky | [#27349](https://github.com/magento/magento2/pull/27349) | [28262](https://github.com/magento/magento2/issues/28262), [28427](https://github.com/magento/magento2/issues/28427) | +| Oleh Usik | [#28991](https://github.com/magento/magento2/pull/28991) | | +| Dmitry Tsymbal | [#28972](https://github.com/magento/magento2/pull/28972) | [29032](https://github.com/magento/magento2/issues/29032) | +| Kate Kyzyma | [#28869](https://github.com/magento/magento2/pull/28869) | | +| Konstantin | [#28810](https://github.com/magento/magento2/pull/28810) | [28982](https://github.com/magento/magento2/issues/28982) | +| Oleh Usik | [#28696](https://github.com/magento/magento2/pull/28696) | [29012](https://github.com/magento/magento2/issues/29012) | +| Oleh Usik | [#28956](https://github.com/magento/magento2/pull/28956) | | +| Oleh Usik | [#28942](https://github.com/magento/magento2/pull/28942) | | +| Oleh Usik | [#28941](https://github.com/magento/magento2/pull/28941) | | +| Dmitry Tsymbal | [#28872](https://github.com/magento/magento2/pull/28872) | [29039](https://github.com/magento/magento2/issues/29039) | +| Oleh Usik | [#28854](https://github.com/magento/magento2/pull/28854) | | +| Pierre Grimaud | [#28832](https://github.com/magento/magento2/pull/28832) | [28829](https://github.com/magento/magento2/issues/28829) | +| Kate Kyzyma | [#28661](https://github.com/magento/magento2/pull/28661) | | +| Maciej Pawłowski | [#26534](https://github.com/magento/magento2/pull/26534) | [28968](https://github.com/magento/magento2/issues/28968) | +| Vadim Malesh | [#28898](https://github.com/magento/magento2/pull/28898) | [23638](https://github.com/magento/magento2/issues/23638) | +| Oleh Usik | [#28852](https://github.com/magento/magento2/pull/28852) | | +| Dmitry Tsymbal | [#28812](https://github.com/magento/magento2/pull/28812) | [28969](https://github.com/magento/magento2/issues/28969) | +| Oleh Usik | [#28650](https://github.com/magento/magento2/pull/28650) | [29009](https://github.com/magento/magento2/issues/29009) | +| Michał Derlatka | [#28904](https://github.com/magento/magento2/pull/28904) | [26107](https://github.com/magento/magento2/issues/26107) | +| Dmitriy Gallyamov | [#28794](https://github.com/magento/magento2/pull/28794) | [28569](https://github.com/magento/magento2/issues/28569) | +| Petkovski Marjan | [#28757](https://github.com/magento/magento2/pull/28757) | [28563](https://github.com/magento/magento2/issues/28563) | +| Oleksandr Melnyk | [#28747](https://github.com/magento/magento2/pull/28747) | | +| Eduard Chitoraga | [#27882](https://github.com/magento/magento2/pull/27882) | [250](https://github.com/magento/magento2/issues/250) | +| Paweł Tylek | [#29054](https://github.com/magento/magento2/pull/29054) | [29087](https://github.com/magento/magento2/issues/29087) | +| Oleh Usik | [#29002](https://github.com/magento/magento2/pull/29002) | | +| Oleh Usik | [#28959](https://github.com/magento/magento2/pull/28959) | | +| Oleh Usik | [#28955](https://github.com/magento/magento2/pull/28955) | | +| Gabriel da Gama | [#28932](https://github.com/magento/magento2/pull/28932) | [1501](https://github.com/magento/magento2/issues/1501) | +| Oleh Usik | [#28925](https://github.com/magento/magento2/pull/28925) | | +| Vadim Malesh | [#28903](https://github.com/magento/magento2/pull/28903) | [28064](https://github.com/magento/magento2/issues/28064) | +| Andrii Kalinich | [#28839](https://github.com/magento/magento2/pull/28839) | [26723](https://github.com/magento/magento2/issues/26723) | +| Vadim Malesh | [#28799](https://github.com/magento/magento2/pull/28799) | [21811](https://github.com/magento/magento2/issues/21811) | +| Vova Yatsyuk | [#28797](https://github.com/magento/magento2/pull/28797) | [28981](https://github.com/magento/magento2/issues/28981) | +| Vadim Malesh | [#28752](https://github.com/magento/magento2/pull/28752) | [24922](https://github.com/magento/magento2/issues/24922) | +| Ihor Sviziev | [#28749](https://github.com/magento/magento2/pull/28749) | [28900](https://github.com/magento/magento2/issues/28900) | +| Vadim Malesh | [#28549](https://github.com/magento/magento2/pull/28549) | [23290](https://github.com/magento/magento2/issues/23290) | +| Nazar Klovanych | [#28366](https://github.com/magento/magento2/pull/28366) | [824](https://github.com/magento/magento2/issues/824), [972](https://github.com/magento/magento2/issues/972) | +| Madhu Rajawat | [#27516](https://github.com/magento/magento2/pull/27516) | [26191](https://github.com/magento/magento2/issues/26191) | +| Aditya Yadav | [#26660](https://github.com/magento/magento2/pull/26660) | [28143](https://github.com/magento/magento2/issues/28143) | +| Nazar Klovanych | [#29144](https://github.com/magento/magento2/pull/29144) | | +| Nazar Klovanych | [#29071](https://github.com/magento/magento2/pull/29071) | | +| Oleh Usik | [#29053](https://github.com/magento/magento2/pull/29053) | | +| Michał Derlatka | [#28888](https://github.com/magento/magento2/pull/28888) | [28570](https://github.com/magento/magento2/issues/28570) | +| Slava Mankivski| [#29179](https://github.com/magento/magento2/pull/29179) | | +| Max Mezhensky | [#28210](https://github.com/magento/magento2/pull/28210) | | +| Pavlo Sydorenko | [#27850](https://github.com/magento/magento2/pull/27850) | | +| Nazar Klovanych | [#29149](https://github.com/magento/magento2/pull/29149) | | +| Oleh Usik| [#29143](https://github.com/magento/magento2/pull/29143) | | +| Vadim Malesh | [#29001](https://github.com/magento/magento2/pull/29001) | [13210](https://github.com/magento/magento2/issues/13210) | +| Paweł Tylek | [#28838](https://github.com/magento/magento2/pull/28838) | [25934](https://github.com/magento/magento2/issues/25934) | +| Petkovski Marjan | [#28890](https://github.com/magento/magento2/pull/28890) | [26121](https://github.com/magento/magento2/issues/26121) | +| Oleh Usik | [#29156](https://github.com/magento/magento2/pull/29156) | | +| Gabriel da Gama | [#29058](https://github.com/magento/magento2/pull/29058) | [1464](https://github.com/magento/magento2/issues/1464) | +| Oleh Usik | [#29004](https://github.com/magento/magento2/pull/29004) | | +| Rafael Corrêa Gomes | [#28891](https://github.com/magento/magento2/pull/28891) | [29056](https://github.com/magento/magento2/issues/29056) | +| Bartłomiej Szubert | [#28285](https://github.com/magento/magento2/pull/28285) | [26427](https://github.com/magento/magento2/issues/26427) | +| Oleh Usik | [#29162](https://github.com/magento/magento2/pull/29162) | | +| Sean van Zuidam | [#29077](https://github.com/magento/magento2/pull/29077) | [29076](https://github.com/magento/magento2/issues/29076) | +| Oleh Usik | [#28999](https://github.com/magento/magento2/pull/28999) | | +| Anton Evers | [#28922](https://github.com/magento/magento2/pull/28922) | [29218](https://github.com/magento/magento2/issues/29218) | +| Zach Nanninga | [#28856](https://github.com/magento/magento2/pull/28856) | [28656](https://github.com/magento/magento2/issues/28656) | +| Tu Nguyen | [#27340](https://github.com/magento/magento2/pull/27340) | [27162](https://github.com/magento/magento2/issues/27162) | +| Ihor Sviziev | [#27221](https://github.com/magento/magento2/pull/27221) | [28693](https://github.com/magento/magento2/issues/28693) | +| Andrii Kasian | [#27377](https://github.com/magento/magento2/pull/27377) | | +| jmonteros422 | [#29207](https://github.com/magento/magento2/pull/29207) | [1391](https://github.com/magento/magento2/issues/1391) | +| Sathish Subramanian | [#29137](https://github.com/magento/magento2/pull/29137) | [28270](https://github.com/magento/magento2/issues/28270) | +| Oleh Usik | [#29134](https://github.com/magento/magento2/pull/29134) | [29287](https://github.com/magento/magento2/issues/29287) | +| Oleh Usik | [#29133](https://github.com/magento/magento2/pull/29133) | [29289](https://github.com/magento/magento2/issues/29289) | +| Vadim Malesh | [#29066](https://github.com/magento/magento2/pull/29066) | [28943](https://github.com/magento/magento2/issues/28943) | +| Oleh Usik | [#29007](https://github.com/magento/magento2/pull/29007) | [29281](https://github.com/magento/magento2/issues/29281) | +| Oleh Usik | [#29000](https://github.com/magento/magento2/pull/29000) | [29295](https://github.com/magento/magento2/issues/29295) | +| lumnn | [#28963](https://github.com/magento/magento2/pull/28963) | [29160](https://github.com/magento/magento2/issues/29160) | +| lumnn | [#28906](https://github.com/magento/magento2/pull/28906) | [29161](https://github.com/magento/magento2/issues/29161) | +| Tu Nguyen | [#28895](https://github.com/magento/magento2/pull/28895) | [24004](https://github.com/magento/magento2/issues/24004) | +| Tu Nguyen | [#28639](https://github.com/magento/magento2/pull/28639) | [28345](https://github.com/magento/magento2/issues/28345), [29261](https://github.com/magento/magento2/issues/29261) | +| RowenaS | [#29170](https://github.com/magento/magento2/pull/29170) | | +| John Carlo Octabio | [#28594](https://github.com/magento/magento2/pull/28594) | | +| Pavlo Sydorenko | [#27917](https://github.com/magento/magento2/pull/27917) | [28705](https://github.com/magento/magento2/issues/28705) | +| Hazel Joie Caquicla | [#29290](https://github.com/magento/magento2/pull/29290) | | +| Lukasz Bajsarowicz | [#29271](https://github.com/magento/magento2/pull/29271) | [29283](https://github.com/magento/magento2/issues/29283) | +| Anton Evers | [#29244](https://github.com/magento/magento2/pull/29244) | [29329](https://github.com/magento/magento2/issues/29329) | +| [Andrii Kalinich | [#29139](https://github.com/magento/magento2/pull/29139) | [28793](https://github.com/magento/magento2/issues/28793) | +| Oleh Usik | [#29135](https://github.com/magento/magento2/pull/29135) | | +| Lukasz Bajsarowicz | [#28992](https://github.com/magento/magento2/pull/28992) | [29159](https://github.com/magento/magento2/issues/29159) | +| Vitaliy Ryaboy | [#28975](https://github.com/magento/magento2/pull/28975) | [29308](https://github.com/magento/magento2/issues/29308) | +| Anton Evers | [#28930](https://github.com/magento/magento2/pull/28930) | [29240](https://github.com/magento/magento2/issues/29240) | +| Tu Nguyen | [#28842](https://github.com/magento/magento2/pull/28842) | | +| [Oleh Usik | [#27537](https://github.com/magento/magento2/pull/27537) | [28800](https://github.com/magento/magento2/issues/28800) | +| Maciej Pawłowski | [#26032](https://github.com/magento/magento2/pull/26032) | [7213](https://github.com/magento/magento2/issues/7213) | +| Rani Priya | [#23972](https://github.com/magento/magento2/pull/23972) | [23971](https://github.com/magento/magento2/issues/23971) | +| Sathish Subramanian | [#29206](https://github.com/magento/magento2/pull/29206) | [28947](https://github.com/magento/magento2/issues/28947) | +| Oleh Usik | [#29142](https://github.com/magento/magento2/pull/29142) | [29292](https://github.com/magento/magento2/issues/29292) | +| Nazar Klovanych | [#29402](https://github.com/magento/magento2/pull/29402) | | +| Matt Walters | [#29238](https://github.com/magento/magento2/pull/29238) | [543](https://github.com/magento/magento2/issues/543) | +| Nazar Klovanych | [#29422](https://github.com/magento/magento2/pull/29422) | | +| Hazel Joie Caquicla | [#29412](https://github.com/magento/magento2/pull/29412) | | +| Nazar Klovanych | [#29405](https://github.com/magento/magento2/pull/29405) | | +| Hazel Joie Caquicla | [#29404](https://github.com/magento/magento2/pull/29404) | | +| Hazel Joie Caquicla | [#29401](https://github.com/magento/magento2/pull/29401) | | +| jmonteros422 | [#29399](https://github.com/magento/magento2/pull/29399) | | +| Sergii Ivashchenko | [#29396](https://github.com/magento/magento2/pull/29396) | | +| jmonteros422 | [#29393](https://github.com/magento/magento2/pull/29393) | | +| Nazar Klovanych | [#29392](https://github.com/magento/magento2/pull/29392) | [1700](https://github.com/magento/magento2/issues/1700), [1693](https://github.com/magento/magento2/issues/1693) | +| Oleh Usik | [#29386](https://github.com/magento/magento2/pull/29386) | [29420](https://github.com/magento/magento2/issues/29420) | +| Oleh Usik | [#29385](https://github.com/magento/magento2/pull/29385) | [29434](https://github.com/magento/magento2/issues/29434) | +| Lukasz Bajsarowicz | [#29341](https://github.com/magento/magento2/pull/29341) | [29389](https://github.com/magento/magento2/issues/29389) | +| Vadim Malesh | [#29331](https://github.com/magento/magento2/pull/29331) | [28901](https://github.com/magento/magento2/issues/28901) | +| Yevhenii Dumskyi | [#29300](https://github.com/magento/magento2/pull/29300) | [29299](https://github.com/magento/magento2/issues/29299) | +| Nazar Klovanych | [#29285](https://github.com/magento/magento2/pull/29285) | | +| Eden Duong | [#29222](https://github.com/magento/magento2/pull/29222) | [29280](https://github.com/magento/magento2/issues/29280) | +| Eden Duong | [#29199](https://github.com/magento/magento2/pull/29199) | [29198](https://github.com/magento/magento2/issues/29198) | +| Pieter Hoste | [#29035](https://github.com/magento/magento2/pull/29035) | [29034](https://github.com/magento/magento2/issues/29034) | +| Andrii Kalinich | [#29023](https://github.com/magento/magento2/pull/29023) | [22762](https://github.com/magento/magento2/issues/22762) | +| Oleh Usik | [#28993](https://github.com/magento/magento2/pull/28993) | [29388](https://github.com/magento/magento2/issues/29388) | +| Oleh Usik | [#28989](https://github.com/magento/magento2/pull/28989) | [29380](https://github.com/magento/magento2/issues/29380) | +| Konstantin | [#28902](https://github.com/magento/magento2/pull/28902) | [29327](https://github.com/magento/magento2/issues/29327) | +| Chris Snedaker | [#28608](https://github.com/magento/magento2/pull/28608) | [29381](https://github.com/magento/magento2/issues/29381) | +| Chandru Rajendran | [#28250](https://github.com/magento/magento2/pull/28250) | [29344](https://github.com/magento/magento2/issues/29344) | +| Ihor Sviziev | [#28137](https://github.com/magento/magento2/pull/28137) | [24353](https://github.com/magento/magento2/issues/24353) | +| Ajith | [#27977](https://github.com/magento/magento2/pull/27977) | [29097](https://github.com/magento/magento2/issues/29097) | +| Oleksandr Kravchuk | [#27905](https://github.com/magento/magento2/pull/27905) | [28303](https://github.com/magento/magento2/issues/28303) | +| Ledian Hymetllari | [#27582](https://github.com/magento/magento2/pull/27582) | [27570](https://github.com/magento/magento2/issues/27570) | +| Ihor Sviziev | [#27364](https://github.com/magento/magento2/pull/27364) | [17195](https://github.com/magento/magento2/issues/17195), [27355](https://github.com/magento/magento2/issues/27355) | +| Michał Derlatka | [#29256](https://github.com/magento/magento2/pull/29256) | [26110](https://github.com/magento/magento2/issues/26110) | +| [Yaroslav Rogoza | [#27914](https://github.com/magento/magento2/pull/27914) | [28524](https://github.com/magento/magento2/issues/28524) | +| Hazel Joie Caquicla | [#29441](https://github.com/magento/magento2/pull/29441) | | +| Nazar Klovanych | [#29438](https://github.com/magento/magento2/pull/29438) | | +| jmonteros422 | [#29424](https://github.com/magento/magento2/pull/29424) | | +| Nazar Klovanych | [#29367](https://github.com/magento/magento2/pull/29367) | [1747](https://github.com/magento/magento2/issues/1747), [1704](https://github.com/magento/magento2/issues/1704), [1702](https://github.com/magento/magento2/issues/1702), [1699](https://github.com/magento/magento2/issues/1699), [1694](https://github.com/magento/magento2/issues/1694) | +| Benjamin Rosenberger | [#29451](https://github.com/magento/magento2/pull/29451) | [29470](https://github.com/magento/magento2/issues/29470) | +| Kristof, Fooman | [#29305](https://github.com/magento/magento2/pull/29305) | [29345](https://github.com/magento/magento2/issues/29345) | +| Lukasz Bajsarowicz | [#29272](https://github.com/magento/magento2/pull/29272) | [29346](https://github.com/magento/magento2/issues/29346) | +| Tu Nguyen | [#28480](https://github.com/magento/magento2/pull/28480) | [26498](https://github.com/magento/magento2/issues/26498) | +| Vadim Malesh | [#28238](https://github.com/magento/magento2/pull/28238) | [18823](https://github.com/magento/magento2/issues/18823) | +| Matthew O'Loughlin | [#26256](https://github.com/magento/magento2/pull/26256) | [8815](https://github.com/magento/magento2/issues/8815), [26255](https://github.com/magento/magento2/issues/26255) | +| jmonteros422 | [#29493](https://github.com/magento/magento2/pull/29493) | [1742](https://github.com/magento/magento2/issues/1742) | +| Sergii Ivashchenko | [#29449](https://github.com/magento/magento2/pull/29449) | | +| Oleh Usik | [#29427](https://github.com/magento/magento2/pull/29427) | | +| Tu Nguyen | [#28642](https://github.com/magento/magento2/pull/28642) | [29468](https://github.com/magento/magento2/issues/29468) | +| Lukasz Bajsarowicz | [#28599](https://github.com/magento/magento2/pull/28599) | | +| Vitaliy Prokopov | [#27758](https://github.com/magento/magento2/pull/27758) | [26702](https://github.com/magento/magento2/issues/26702) | +| [Pavel Bystritsky | [#26175](https://github.com/magento/magento2/pull/26175) | [28319](https://github.com/magento/magento2/issues/28319), [29313](https://github.com/magento/magento2/issues/29313) | +| Nazar Klovanych | [#29492](https://github.com/magento/magento2/pull/29492) | [1750](https://github.com/magento/magento2/issues/1750) | +| Nazar Klovanych | [#29490](https://github.com/magento/magento2/pull/29490) | [1749](https://github.com/magento/magento2/issues/1749) | +| Oleh Usik | [#29485](https://github.com/magento/magento2/pull/29485) | | +| Sergii Ivashchenko | [#29484](https://github.com/magento/magento2/pull/29484) | | +| Nazar Klovanych | [#29475](https://github.com/magento/magento2/pull/29475) | | +| Oleh Usik | [#29472](https://github.com/magento/magento2/pull/29472) | [29539](https://github.com/magento/magento2/issues/29539) | +| Vadim Malesh | [#29455](https://github.com/magento/magento2/pull/29455) | [25211](https://github.com/magento/magento2/issues/25211) | +| yolouiese | [#29398](https://github.com/magento/magento2/pull/29398) | [1684](https://github.com/magento/magento2/issues/1684) | +| Lukasz Bajsarowicz | [#29376](https://github.com/magento/magento2/pull/29376) | [29453](https://github.com/magento/magento2/issues/29453) | +| iGerchak | [#29291](https://github.com/magento/magento2/pull/29291) | [29286](https://github.com/magento/magento2/issues/29286) | +| Nikita Sarychev | [#29214](https://github.com/magento/magento2/pull/29214) | [29213](https://github.com/magento/magento2/issues/29213) | +| Lukasz Bajsarowicz | [#29202](https://github.com/magento/magento2/pull/29202) | [29477](https://github.com/magento/magento2/issues/29477) | +| Vitaliy Ryaboy | [#28923](https://github.com/magento/magento2/pull/28923) | [29527](https://github.com/magento/magento2/issues/29527) | \ No newline at end of file diff --git a/src/_includes/release-notes/engcomm-2-4-1-partner.md b/src/_includes/release-notes/engcomm-2-4-1-partner.md new file mode 100644 index 00000000000..91a9ebd17b2 --- /dev/null +++ b/src/_includes/release-notes/engcomm-2-4-1-partner.md @@ -0,0 +1,18 @@ +| Partner | Pull Requests | Related GitHub Issues | +| ------- | ------- | ------- | +| Atwix | [magento/magento2#27670](https://github.com/magento/magento2/pull/27670), [magento/magento2#28112](https://github.com/magento/magento2/pull/28112), magento/partners-magento2ee#258, [magento/magento2#28466](https://github.com/magento/magento2/pull/28466), [magento/magento2#28450](https://github.com/magento/magento2/pull/28450), [magento/magento2#28449](https://github.com/magento/magento2/pull/28449), [magento/magento2#28408](https://github.com/magento/magento2/pull/28408), [magento/magento2#28391](https://github.com/magento/magento2/pull/28391), [magento/magento2#28361](https://github.com/magento/magento2/pull/28361), [magento/magento2#28330](https://github.com/magento/magento2/pull/28330), [magento/magento2#28304](https://github.com/magento/magento2/pull/28304), [magento/magento2#27481](https://github.com/magento/magento2/pull/27481), [magento/magento2#27373](https://github.com/magento/magento2/pull/27373), [magento/magento2#28467](https://github.com/magento/magento2/pull/28467), [magento/magento2#28407](https://github.com/magento/magento2/pull/28407), [magento/magento2#28418](https://github.com/magento/magento2/pull/28418), [magento/magento2#28034](https://github.com/magento/magento2/pull/28034), [magento/magento2#28222](https://github.com/magento/magento2/pull/28222), [magento/magento2#27956](https://github.com/magento/magento2/pull/27956), [magento/magento2#28105](https://github.com/magento/magento2/pull/28105), [magento/magento2#27586](https://github.com/magento/magento2/pull/27586), [magento/magento2#28631](https://github.com/magento/magento2/pull/28631), [magento/magento2#28629](https://github.com/magento/magento2/pull/28629), [magento/magento2#28498](https://github.com/magento/magento2/pull/28498), [magento/magento2#28496](https://github.com/magento/magento2/pull/28496), [magento/magento2#28469](https://github.com/magento/magento2/pull/28469), [magento/magento2#27451](https://github.com/magento/magento2/pull/27451), [magento/magento2#28725](https://github.com/magento/magento2/pull/28725), [magento/magento2#27549](https://github.com/magento/magento2/pull/27549), [magento/magento2#28641](https://github.com/magento/magento2/pull/28641), [magento/magento2#28635](https://github.com/magento/magento2/pull/28635), [magento/magento2#28632](https://github.com/magento/magento2/pull/28632), [magento/magento2#28457](https://github.com/magento/magento2/pull/28457), magento/partners-magento2ee#247, [magento/magento2#28205](https://github.com/magento/magento2/pull/28205), [magento/magento2#28072](https://github.com/magento/magento2/pull/28072), [magento/magento2#28727](https://github.com/magento/magento2/pull/28727), [magento/magento2#28684](https://github.com/magento/magento2/pull/28684), [magento/magento2#28679](https://github.com/magento/magento2/pull/28679), [magento/magento2#28401](https://github.com/magento/magento2/pull/28401), [magento/magento2#28506](https://github.com/magento/magento2/pull/28506), [magento/magento2#28492](https://github.com/magento/magento2/pull/28492), [magento/magento2#28487](https://github.com/magento/magento2/pull/28487), [magento/magento2#27349](https://github.com/magento/magento2/pull/27349), [magento/magento2#28991](https://github.com/magento/magento2/pull/28991), [magento/magento2#28972](https://github.com/magento/magento2/pull/28972), [magento/magento2#28869](https://github.com/magento/magento2/pull/28869), [magento/magento2#28696](https://github.com/magento/magento2/pull/28696), [magento/magento2#28956](https://github.com/magento/magento2/pull/28956), [magento/magento2#28942](https://github.com/magento/magento2/pull/28942), [magento/magento2#28941](https://github.com/magento/magento2/pull/28941), [magento/magento2#28872](https://github.com/magento/magento2/pull/28872), [magento/magento2#28854](https://github.com/magento/magento2/pull/28854), [magento/magento2#28661](https://github.com/magento/magento2/pull/28661), [magento/magento2#28852](https://github.com/magento/magento2/pull/28852), [magento/magento2#28812](https://github.com/magento/magento2/pull/28812), [magento/magento2#28650](https://github.com/magento/magento2/pull/28650), [magento/magento2#27882](https://github.com/magento/magento2/pull/27882), magento/partners-magento2ee#250, [magento/magento2#29002](https://github.com/magento/magento2/pull/29002), [magento/magento2#28959](https://github.com/magento/magento2/pull/28959), [magento/magento2#28955](https://github.com/magento/magento2/pull/28955), [magento/magento2#28925](https://github.com/magento/magento2/pull/28925), [magento/magento2#29053](https://github.com/magento/magento2/pull/29053), [magento/magento2#27697](https://github.com/magento/magento2/pull/27697), [magento/magento2#29143](https://github.com/magento/magento2/pull/29143), [magento/magento2#29156](https://github.com/magento/magento2/pull/29156), [magento/magento2#29004](https://github.com/magento/magento2/pull/29004), [magento/magento2#29162](https://github.com/magento/magento2/pull/29162), [magento/magento2#28999](https://github.com/magento/magento2/pull/28999), [magento/magento2#29134](https://github.com/magento/magento2/pull/29134), [magento/magento2#29133](https://github.com/magento/magento2/pull/29133), [magento/magento2#29007](https://github.com/magento/magento2/pull/29007), [magento/magento2#29000](https://github.com/magento/magento2/pull/29000), [magento/magento2#28210](https://github.com/magento/magento2/pull/28210), [magento/magento2#29135](https://github.com/magento/magento2/pull/29135), [magento/magento2#27537](https://github.com/magento/magento2/pull/27537), [magento/magento2#29142](https://github.com/magento/magento2/pull/29142), [magento/magento2#29386](https://github.com/magento/magento2/pull/29386), [magento/magento2#29385](https://github.com/magento/magento2/pull/29385), [magento/magento2#28993](https://github.com/magento/magento2/pull/28993), [magento/magento2#28989](https://github.com/magento/magento2/pull/28989), magento/partners-magento2ee#263, magento/partners-magento2ee#246, [magento/magento2#27914](https://github.com/magento/magento2/pull/27914), [magento/magento2#29427](https://github.com/magento/magento2/pull/29427), [magento/magento2#29485](https://github.com/magento/magento2/pull/29485), [magento/magento2#29472](https://github.com/magento/magento2/pull/29472) | [magento/magento2#28202](https://github.com/magento/magento2/issues/28202), [magento/magento2#28393](https://github.com/magento/magento2/issues/28393), [magento/magento2#28377](https://github.com/magento/magento2/issues/28377), [magento/magento2#28394](https://github.com/magento/magento2/issues/28394), [magento/magento2#19481](https://github.com/magento/magento2/issues/19481), [magento/magento2#28040](https://github.com/magento/magento2/issues/28040), [magento/magento2#28138](https://github.com/magento/magento2/issues/28138), [magento/magento2#28261](https://github.com/magento/magento2/issues/28261), [magento/magento2#253](https://github.com/magento/magento2/issues/253), [magento/magento2#27337](https://github.com/magento/magento2/issues/27337), [magento/magento2#21101](https://github.com/magento/magento2/issues/21101), [magento/magento2#28755](https://github.com/magento/magento2/issues/28755), [magento/magento2#28720](https://github.com/magento/magento2/issues/28720), [magento/magento2#28744](https://github.com/magento/magento2/issues/28744), [magento/magento2#28721](https://github.com/magento/magento2/issues/28721), magento/partners-magento2ee#261, [magento/magento2#246](https://github.com/magento/magento2/issues/246), [magento/magento2#28519](https://github.com/magento/magento2/issues/28519), [magento/magento2#28481](https://github.com/magento/magento2/issues/28481), [magento/magento2#28262](https://github.com/magento/magento2/issues/28262), [magento/magento2#28427](https://github.com/magento/magento2/issues/28427), [magento/magento2#29032](https://github.com/magento/magento2/issues/29032), [magento/magento2#29012](https://github.com/magento/magento2/issues/29012), [magento/magento2#29039](https://github.com/magento/magento2/issues/29039), [magento/magento2#28969](https://github.com/magento/magento2/issues/28969), [magento/magento2#29009](https://github.com/magento/magento2/issues/29009), [magento/magento2#250](https://github.com/magento/magento2/issues/250), [magento/magento2#29287](https://github.com/magento/magento2/issues/29287), [magento/magento2#29289](https://github.com/magento/magento2/issues/29289), [magento/magento2#29281](https://github.com/magento/magento2/issues/29281), [magento/magento2#29295](https://github.com/magento/magento2/issues/29295), [magento/magento2#28800](https://github.com/magento/magento2/issues/28800), [magento/magento2#29292](https://github.com/magento/magento2/issues/29292), [magento/magento2#29420](https://github.com/magento/magento2/issues/29420), [magento/magento2#29434](https://github.com/magento/magento2/issues/29434), [magento/magento2#29388](https://github.com/magento/magento2/issues/29388), [magento/magento2#29380](https://github.com/magento/magento2/issues/29380), [magento/magento2#28524](https://github.com/magento/magento2/issues/28524), [magento/magento2#29539](https://github.com/magento/magento2/issues/29539) | +| Blue Acorn iCi | [magento/magento2#27903](https://github.com/magento/magento2/pull/27903), [magento/magento2#27902](https://github.com/magento/magento2/pull/27902), [magento/magento2#28606](https://github.com/magento/magento2/pull/28606), [magento/magento2#28601](https://github.com/magento/magento2/pull/28601), [magento/magento2#28605](https://github.com/magento/magento2/pull/28605), [magento/magento2#28351](https://github.com/magento/magento2/pull/28351), [magento/magento2#27965](https://github.com/magento/magento2/pull/27965), [magento/magento2#28856](https://github.com/magento/magento2/pull/28856), [magento/magento2#29271](https://github.com/magento/magento2/pull/29271), [magento/magento2#28992](https://github.com/magento/magento2/pull/28992), [magento/magento2#29341](https://github.com/magento/magento2/pull/29341), [magento/magento2#29272](https://github.com/magento/magento2/pull/29272), [magento/magento2#28599](https://github.com/magento/magento2/pull/28599), [magento/magento2#29376](https://github.com/magento/magento2/pull/29376), [magento/magento2#29202](https://github.com/magento/magento2/pull/29202) | [magento/magento2#28383](https://github.com/magento/magento2/issues/28383), [magento/magento2#28850](https://github.com/magento/magento2/issues/28850), [magento/magento2#28376](https://github.com/magento/magento2/issues/28376), [magento/magento2#27962](https://github.com/magento/magento2/issues/27962), [magento/magento2#28656](https://github.com/magento/magento2/issues/28656), [magento/magento2#29283](https://github.com/magento/magento2/issues/29283), [magento/magento2#29159](https://github.com/magento/magento2/issues/29159), [magento/magento2#29389](https://github.com/magento/magento2/issues/29389), [magento/magento2#29346](https://github.com/magento/magento2/issues/29346), [magento/magento2#29453](https://github.com/magento/magento2/issues/29453), [magento/magento2#29477](https://github.com/magento/magento2/issues/29477) | +| creativestyle | [magento/magento2#27622](https://github.com/magento/magento2/pull/27622), [magento/magento2#27270](https://github.com/magento/magento2/pull/27270), [magento/magento2#27871](https://github.com/magento/magento2/pull/27871), [magento/magento2#27690](https://github.com/magento/magento2/pull/27690), [magento/magento2#27619](https://github.com/magento/magento2/pull/27619), [magento/magento2#27618](https://github.com/magento/magento2/pull/27618), [magento/magento2#27357](https://github.com/magento/magento2/pull/27357), [magento/magento2#27356](https://github.com/magento/magento2/pull/27356), [magento/magento2#27616](https://github.com/magento/magento2/pull/27616), [magento/magento2#27860](https://github.com/magento/magento2/pull/27860), [magento/magento2#27617](https://github.com/magento/magento2/pull/27617), [magento/magento2#29054](https://github.com/magento/magento2/pull/29054), [magento/magento2#28838](https://github.com/magento/magento2/pull/28838) | [magento/magento2#28110](https://github.com/magento/magento2/issues/28110), [magento/magento2#26026](https://github.com/magento/magento2/issues/26026), [magento/magento2#28339](https://github.com/magento/magento2/issues/28339), [magento/magento2#28340](https://github.com/magento/magento2/issues/28340), [magento/magento2#28381](https://github.com/magento/magento2/issues/28381), [magento/magento2#28382](https://github.com/magento/magento2/issues/28382), [magento/magento2#28166](https://github.com/magento/magento2/issues/28166), [magento/magento2#28433](https://github.com/magento/magento2/issues/28433), [magento/magento2#28807](https://github.com/magento/magento2/issues/28807), [magento/magento2#28823](https://github.com/magento/magento2/issues/28823), [magento/magento2#28811](https://github.com/magento/magento2/issues/28811), [magento/magento2#29087](https://github.com/magento/magento2/issues/29087), [magento/magento2#25934](https://github.com/magento/magento2/issues/25934) | +| Comwrap | [magento/magento2#28714](https://github.com/magento/magento2/pull/28714), [magento/magento2#28743](https://github.com/magento/magento2/pull/28743), [magento/magento2#28710](https://github.com/magento/magento2/pull/28710), [magento/magento2#28757](https://github.com/magento/magento2/pull/28757), magento/partners-magento2ee#288, magento/partners-magento2ee#271, magento/partners-magento2ee#277, [magento/magento2#28890](https://github.com/magento/magento2/pull/28890), magento/partners-magento2ee#285, [magento/magento2#27850](https://github.com/magento/magento2/pull/27850), [magento/magento2#27917](https://github.com/magento/magento2/pull/27917) | [magento/magento2#28584](https://github.com/magento/magento2/issues/28584), magento/partners-magento2ee#28563, magento/partners-magento2ee#28566, magento/partners-magento2ee#28769, [magento/magento2#26121](https://github.com/magento/magento2/issues/26121), magento/partners-magento2ee#28834, [magento/magento2#28705](https://github.com/magento/magento2/issues/28705) | +| Ziffity | [magento/magento2#26704](https://github.com/magento/magento2/pull/26704), [magento/magento2#28113](https://github.com/magento/magento2/pull/28113), [magento/magento2#28174](https://github.com/magento/magento2/pull/28174), [magento/magento2#28039](https://github.com/magento/magento2/pull/28039), [magento/magento2#28004](https://github.com/magento/magento2/pull/28004), [magento/magento2#27567](https://github.com/magento/magento2/pull/27567), [magento/magento2#28264](https://github.com/magento/magento2/pull/28264), [magento/magento2#29137](https://github.com/magento/magento2/pull/29137), [magento/magento2#29206](https://github.com/magento/magento2/pull/29206), [magento/magento2#28250](https://github.com/magento/magento2/pull/28250), [magento/magento2#27977](https://github.com/magento/magento2/pull/27977) | [magento/magento2#28165](https://github.com/magento/magento2/issues/28165), [magento/magento2#28201](https://github.com/magento/magento2/issues/28201), [magento/magento2#27985](https://github.com/magento/magento2/issues/27985), [magento/magento2#27091](https://github.com/magento/magento2/issues/27091), [magento/magento2#28308](https://github.com/magento/magento2/issues/28308), [magento/magento2#28270](https://github.com/magento/magento2/issues/28270), [magento/magento2#28947](https://github.com/magento/magento2/issues/28947), [magento/magento2#29344](https://github.com/magento/magento2/issues/29344), [magento/magento2#29097](https://github.com/magento/magento2/issues/29097) | +| Aligent Consulting | [magento/magento2#27429](https://github.com/magento/magento2/pull/27429), [magento/magento2#26256](https://github.com/magento/magento2/pull/26256) | [magento/magento2#28306](https://github.com/magento/magento2/issues/28306), [magento/magento2#8815](https://github.com/magento/magento2/issues/8815), [magento/magento2#26255](https://github.com/magento/magento2/issues/26255) | +| Fast White Cat | [magento/magento2#28015](https://github.com/magento/magento2/pull/28015), [magento/magento2#28735](https://github.com/magento/magento2/pull/28735), [magento/magento2#28285](https://github.com/magento/magento2/pull/28285) | [magento/magento2#28011](https://github.com/magento/magento2/issues/28011), [magento/magento2#26504](https://github.com/magento/magento2/issues/26504), [magento/magento2#26427](https://github.com/magento/magento2/issues/26427) | +| Vaimo | [magento/magento2#29300](https://github.com/magento/magento2/pull/29300), [magento/magento2#27905](https://github.com/magento/magento2/pull/27905), [magento/magento2#27582](https://github.com/magento/magento2/pull/27582) | [magento/magento2#29299](https://github.com/magento/magento2/issues/29299), [magento/magento2#28303](https://github.com/magento/magento2/issues/28303), [magento/magento2#27570](https://github.com/magento/magento2/issues/27570) | +| Guidance Solutions | [magento/magento2#28810](https://github.com/magento/magento2/pull/28810), [magento/magento2#28902](https://github.com/magento/magento2/pull/28902) | [magento/magento2#28982](https://github.com/magento/magento2/issues/28982), [magento/magento2#29327](https://github.com/magento/magento2/issues/29327) | +| Cedcommerce | [magento/magento2#27990](https://github.com/magento/magento2/pull/27990), [magento/magento2#26660](https://github.com/magento/magento2/pull/26660) | [magento/magento2#26118](https://github.com/magento/magento2/issues/26118), [magento/magento2#28143](https://github.com/magento/magento2/issues/28143) | +| Balance Internet | [magento/magento2#27064](https://github.com/magento/magento2/pull/27064) | [magento/magento2#27063](https://github.com/magento/magento2/issues/27063) | +| Krish TechnoLabs | [magento/magento2#27359](https://github.com/magento/magento2/pull/27359), [magento/magento2#27106](https://github.com/magento/magento2/pull/27106) | [magento/magento2#27358](https://github.com/magento/magento2/issues/27358), [magento/magento2#27099](https://github.com/magento/magento2/issues/27099) | +| Ranosys Technologies | [magento/magento2#27516](https://github.com/magento/magento2/pull/27516) | [magento/magento2#26191](https://github.com/magento/magento2/issues/26191) | +| Briteskies | [magento/magento2#29301](https://github.com/magento/magento2/pull/29301) | [magento/magento2#104](https://github.com/magento/magento2/issues/104) | +| Le Site | [magento/magento2#28891](https://github.com/magento/magento2/pull/28891) | [magento/magento2#29056](https://github.com/magento/magento2/issues/29056) | +| MediaCT | [magento/magento2#28547](https://github.com/magento/magento2/pull/28547) | [magento/magento2#28685](https://github.com/magento/magento2/issues/28685) | diff --git a/src/cloud/env/variables-build.md b/src/cloud/env/variables-build.md index f9dc605d70c..998a1d01083 100644 --- a/src/cloud/env/variables-build.md +++ b/src/cloud/env/variables-build.md @@ -122,7 +122,7 @@ stage: Allows you to increase the maximum expected execution time for static content deployment. -By default, Magento Commerce sets the maximum expected execution to 400 seconds, but in some scenarios you might need more time to complete the static content deployment for a Cloud project. +By default, Magento Commerce sets the maximum expected execution to 900 seconds, but in some scenarios you might need more time to complete the static content deployment for a Cloud project. ```yaml stage: diff --git a/src/cloud/env/variables-deploy.md b/src/cloud/env/variables-deploy.md index c81a0cf5cc9..45e49bce338 100644 --- a/src/cloud/env/variables-deploy.md +++ b/src/cloud/env/variables-deploy.md @@ -507,7 +507,7 @@ stage: Allows you to increase the maximum expected execution time for static content deployment. -By default, Magento Commerce sets the maximum expected execution to 400 seconds, but in some scenarios you might need more time to complete the static content deployment for a Cloud project. +By default, Magento Commerce sets the maximum expected execution to 900 seconds, but in some scenarios you might need more time to complete the static content deployment for a Cloud project. ```yaml stage: diff --git a/src/cloud/env/variables-global.md b/src/cloud/env/variables-global.md index a43f1ab8d92..548285ae635 100644 --- a/src/cloud/env/variables-global.md +++ b/src/cloud/env/variables-global.md @@ -65,7 +65,7 @@ return array( Allows you to increase the maximum expected execution time for static content deployment. -By default, Magento Commerce sets the maximum expected execution to 400 seconds, but in some scenarios you might need more time to complete the static content deployment for a Cloud project. +By default, Magento Commerce sets the maximum expected execution to 900 seconds, but in some scenarios you might need more time to complete the static content deployment for a Cloud project. ```yaml stage: diff --git a/src/common/images/graphql/paypal-payflow-pro-vault.svg b/src/common/images/graphql/paypal-payflow-pro-vault.svg new file mode 100644 index 00000000000..c7bc71af169 --- /dev/null +++ b/src/common/images/graphql/paypal-payflow-pro-vault.svg @@ -0,0 +1,3 @@ + + +
4
4

Magento returns a Cart object.

Magento returns a Cart...
3
3

Set the payment method and provide the public hash.

Set the payment meth...

Magento returns the tokens stored in the vault.

Magento returns t...
2
2

Run the customer
PaymentTokens query.

Run the customer...
1
1

Client
(PWA)

Client...

Magento

Magento

Braintree

Braintree
8
8

Magento creates an order.

Magento creates an ord...
5
5

Run the placeOrder mutation.

Run the placeOrde...
7
7

Braintree sends the response to Magento.

Braintree sends the re...
6
6

Magento sends an authorization request.

Magento sends an author...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/src/guides/v2.3/config-guide/elasticsearch/es-downgrade.md b/src/guides/v2.3/config-guide/elasticsearch/es-downgrade.md index 750f08f7303..344e7cbe9ce 100644 --- a/src/guides/v2.3/config-guide/elasticsearch/es-downgrade.md +++ b/src/guides/v2.3/config-guide/elasticsearch/es-downgrade.md @@ -8,9 +8,7 @@ functional_areas: - Setup --- -The Magento 2.3.5 update adds support for Elasticsearch (ES) 6.8.x and 7.x.x. - -Both ES 2.x and 5.x are [End of Life][] and are no longer supported in Magento. +{% include config/es-version-23.md %} ## Change the Elasticsearch Client version @@ -30,6 +28,4 @@ Then configure Elasticsearch within [Magento Admin][]. -[End of Life]: https://www.elastic.co/support/eol -[PHP client]: https://github.com/elastic/elasticsearch-php [Magento Admin]: https://docs.magento.com/m2/ee/user_guide/catalog/search-elasticsearch.html diff --git a/src/guides/v2.3/config-guide/elasticsearch/es-overview.md b/src/guides/v2.3/config-guide/elasticsearch/es-overview.md index 487262844fc..80275f1bd76 100644 --- a/src/guides/v2.3/config-guide/elasticsearch/es-overview.md +++ b/src/guides/v2.3/config-guide/elasticsearch/es-overview.md @@ -32,14 +32,7 @@ Using [Elasticsearch][] as your [catalog](https://glossary.magento.com/catalog) ### Supported versions {#es-spt-versions} -Magento 2.3.5 adds support for Elasticsearch 7.x.x (default) and 6.8.x. -Both ES 2.x and 5.x are [End of Life][] and are no longer supported in Magento. -Follow the instructions in [Change Elasticsearch Client][]. - -{{site.data.var.ee}} version 2.3.5 supports the following Elasticsearch versions: - -* Elasticsearch 7.x.x -* Elasticsearch 6.8.x +{% include config/es-version-23.md %} ### Recommended configuration {#es-arch} @@ -133,9 +126,7 @@ For additional information, see [Elasticsearch documentation][]{:target="_blank" [Configure Magento to use Elasticsearch]: {{page.baseurl}}/config-guide/elasticsearch/configure-magento.html [Elasticsearch Ubuntu documentation]: https://www.elastic.co/guide/en/elasticsearch/reference/current/deb.html [Configuring Elasticsearch]: https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html -[End of Life]: https://www.elastic.co/support/eol [Upgrading Elasticsearch]: https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-upgrade.html [Full cluster restart upgrade]: https://www.elastic.co/guide/en/elasticsearch/reference/current/restart-upgrade.html [Elasticsearch documentation]: https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html -[Change Elasticsearch Client]: {{page.baseurl}}/config-guide/elasticsearch/es-downgrade.html [Installing Elasticsearch]: https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html diff --git a/src/guides/v2.3/extension-dev-guide/message-queues/message-queues.md b/src/guides/v2.3/extension-dev-guide/message-queues/message-queues.md index 421a7238bdb..3b99c005c90 100644 --- a/src/guides/v2.3/extension-dev-guide/message-queues/message-queues.md +++ b/src/guides/v2.3/extension-dev-guide/message-queues/message-queues.md @@ -46,36 +46,39 @@ Perform the following actions: 1. Decode the message using topic name taken from the `\Magento\Framework\MessageQueue\ConsumerConfigurationInterface`. 1. Invoke callback `Magento\Framework\MessageQueue\ConsumerConfigurationInterface::getCallback` and pass the decoded data as an argument. -## Override topic configuration +## Change message queue from MySQL to AMQP The following sample introduces a runtime configuration that allows you to redefine the adapter for a topic. ```php 'queue' => [ 'topics' => [ - 'customer.created' => [ - 'schema' => [ - 'schema_type' => 'object', - 'schema_value' => 'string' - ], - 'response_schema' => [ - 'schema_type' => 'object', - 'schema_value' => 'string' - ], - 'publisher' = 'default-rabitmq' + 'product_action_attribute.update' => [ + 'publisher' => 'amqp-magento' + ] + ], + 'config' => [ + 'publishers' => [ + 'product_action_attribute.update' => [ + 'connections' => [ + 'amqp' => [ + 'name' => 'amqp', + 'exchange' => 'magento', + 'disabled' => false + ], + 'db' => [ + 'name' => 'db', + 'disabled' => true + ] + ] + ] + ] + ], + 'consumers' => [ + 'product_action_attribute.update' => [ + 'connection' => 'amqp', ], - 'order.created' => [ - 'schema' => [ - 'schema_type' => 'object', - 'schema_value' => 'string' - ], - 'response_schema' => [ - 'schema_type' => 'object', - 'schema_value' => 'string' - ], - 'publisher' = 'default-rabitmq' - ], - ], + ], ], ``` diff --git a/src/guides/v2.3/get-started/gs-web-api-request.md b/src/guides/v2.3/get-started/gs-web-api-request.md index 279d8403894..3be11412dfb 100644 --- a/src/guides/v2.3/get-started/gs-web-api-request.md +++ b/src/guides/v2.3/get-started/gs-web-api-request.md @@ -46,9 +46,10 @@ Specify one or more of the following HTTP headers in your web API calls: HTTP header | Description | Syntax --- | --- | --- -`Authorization` | Required. Specifies the authentication token that proves you as the owner of a Magento account. You specify the token in the `Authorization` request header with the `Bearer` HTTP authorization scheme. | `Authorization: Bearer `

`` is the authentication token returned by the Magento token service. See [Authentication]({{ page.baseurl }}/get-started/authentication/gs-authentication.html). +`Authorization` | Required, except for calls made on behalf of a guest. Specifies the authentication token that proves you as the owner of a Magento account. You specify the token in the `Authorization` request header with the `Bearer` HTTP authorization scheme. | `Authorization: Bearer `

`` is the authentication token returned by the Magento token service. See [Authentication]({{ page.baseurl }}/get-started/authentication/gs-authentication.html). `Accept` | Optional. Specifies the format of the response body. Default is `JSON`. | `Accept: application/`

`` is either `JSON` or `XML`. `Content-Type` | Required for operations with a request body. Specifies the format of the request body. | `Content-Type:application/`

`` is either `JSON` or `XML`. +`X-Captcha` | A shopper-entered CAPTCHA value. It is required when a shopper enters a CAPTCHA value on the frontend, unless an integration token is provided. Forms requiring CAPTCHA values are configured at **Stores** > **Configuration** > **Customers** > **Customer Configuration** > **CAPTCHA** > **Forms**. | String ### Call payload {#payload} diff --git a/src/guides/v2.3/graphql/payment-methods/braintree-vault.md b/src/guides/v2.3/graphql/payment-methods/braintree-vault.md index 662a20440f9..fa5aa37af3e 100644 --- a/src/guides/v2.3/graphql/payment-methods/braintree-vault.md +++ b/src/guides/v2.3/graphql/payment-methods/braintree-vault.md @@ -20,7 +20,7 @@ The following diagram shows the workflow for placing an order when Braintree Vau 1. The client renders the token information, and the customer selects a payment method. - When the customer clicks **Place Order**, the PWA uses the [`setPaymentMethodOnCart`]({{page.baseurl}}/graphql/mutations/set-payment-method.html) mutation to set the payment method to `braintree_cc_vault`. The vaulted public hash is passed with other optional properties in the [`braintree_cc_vault`](#braintree_cc_vault-object). + When the customer selects a stored payment method, the PWA uses the [`setPaymentMethodOnCart`]({{page.baseurl}}/graphql/mutations/set-payment-method.html) mutation to set the payment method to `braintree_cc_vault`. The vaulted public hash is passed with other optional properties in the [`braintree_cc_vault`](#braintree_cc_vault-object). 1. Magento returns a `Cart` object. diff --git a/src/guides/v2.3/graphql/protected-mutations.md b/src/guides/v2.3/graphql/protected-mutations.md new file mode 100644 index 00000000000..f9d4552ccbc --- /dev/null +++ b/src/guides/v2.3/graphql/protected-mutations.md @@ -0,0 +1,28 @@ +--- +group: graphql +title: Protected mutations +--- + +If CAPTCHA is enabled on pages requiring shopper input, then in most cases, the corresponding mutations that send requests to the Magento server must include the shopper's CAPTCHA response. Supply the shopper's response in the HTTP `X-Captcha` header. The exception to this policy is that you do not send the CAPTCHA response if you specify an integration authorization token in the header of the mutation. + +The following table lists the forms that can be configured to require CAPTCHA. Go to **Stores** > **Configuration** > **Customers** > **Customer Configuration** > **CAPTCHA** > **Forms** to enable or disable CAPTCHA on these forms. + +Form name | Mutation +--- | --- +Add Gift Card Code | `applyGiftCardToCart` +Applying Coupon Code | `applyCouponToCart` +Change password | `changeCustomerPassword` +Checkout/Placing Order | `setPaymentMethodOnCart`, `setPaymentMethodAndPlaceOrder` +Contact Us | Not applicable +Create company | Not applicable +Create user | `createCustomer` +Forgot password | Not applicable +Login | `generateCustomerToken` +Payflow Pro | `setPaymentMethodOnCart`, `setPaymentMethodAndPlaceOrder` +Send to Friend Form | `sendEmailToFriend` +Share Wishlist Form | Not applicable + +{:.ref-header} +Related topics + +[Construct a request]({{page.baseurl}}/get-started/gs-web-api-request.html) diff --git a/src/guides/v2.3/graphql/send-request.md b/src/guides/v2.3/graphql/send-request.md index bd2a043e0a0..13716c73592 100644 --- a/src/guides/v2.3/graphql/send-request.md +++ b/src/guides/v2.3/graphql/send-request.md @@ -7,11 +7,11 @@ Magento GraphQL supports the HTTP GET and POST methods. You can send a query as `http:///graphql?query=%7Bproducts(filter%3A%7Bsku%3A%7Beq%3A%2224-WB01%22%7D%7D)%7Bitems%7Bname%20sku%7D%7D%7D` -The previous example is equivalent to the following query. You could send the query as either a GET or POST request, +The previous example is equivalent to the following query. You could send the query as either a GET or POST request. **Request:** -```text +```graphql { products( filter: { sku: { eq: "24-WB01" } } @@ -26,7 +26,7 @@ The previous example is equivalent to the following query. You could send the qu **Response:** -```text +```json { "data": { "products": { @@ -52,8 +52,9 @@ Header name | Value | Description `Authorization` | `Bearer ` | A customer or admin token. [Authorization tokens]({{page.baseurl}}/graphql/authorization-tokens.html) describes how to generate tokens. `Content-Currency` | A valid currency code, such as `USD` | This header is required only if the currency is not the store view's default currency. `Content-Type` | `application/json` | Required for all requests. -`Preview-Version` | A timestamp (seconds since January 1, 1970). Use this header to query products, categories, price rules, and other entities that are scheduled to be in a campaign (staged content). Staging is supported in {{site.data.var.ee}} only. +`Preview-Version` | A timestamp (seconds since January 1, 1970). | Use this header to query products, categories, price rules, and other entities that are scheduled to be in a campaign (staged content). Staging is supported in {{site.data.var.ee}} only. `Store` | `` | The store view code on which to perform the request. The value can be `default` or the code that is defined when a store view is created. +`X-Captcha` | Shopper-entered CAPTCHA value | Required when a shopper enters a CAPTCHA value on the frontend, unless an integration token is provided. Forms requiring CAPTCHA values are configured at **Stores** > **Configuration** > **Customers** > **Customer Configuration** > **CAPTCHA** > **Forms**. ### Specify request headers in a GraphQL browser diff --git a/src/guides/v2.3/install-gde/system-requirements-tech.md b/src/guides/v2.3/install-gde/system-requirements-tech.md index dc2128870f5..dde2f596970 100644 --- a/src/guides/v2.3/install-gde/system-requirements-tech.md +++ b/src/guides/v2.3/install-gde/system-requirements-tech.md @@ -102,18 +102,7 @@ Mail Transfer Agent (MTA) or an SMTP server * [Varnish]({{page.baseurl}}/config-guide/varnish/config-varnish.html) version 6.x (tested with 6.3.1) * [Elasticsearch]({{page.baseurl}}/config-guide/elasticsearch/es-overview.html) - {{site.data.var.ee}} version 2.3.x supports the following Elasticsearch versions: - - * Elasticsearch 6.8.x - - Magento 2.3 supports [Elasticsearch PHP client][]{:target="_blank"} version 6.8. - - * Elasticsearch 7.x.x - - {:.bs-callout-warning} - Magento no longer provides support for Elasticsearch [2.x and 5.x][] as they are End of Life. - - Follow the instructions in [Change Elasticsearch Module][]. + {% include config/es-version-23.md %} * RabbitMQ 3.8.x (compatible with 2.0 and later) @@ -169,5 +158,4 @@ There is a known issue with `xdebug` that can affect Magento installations or ac [Varnish]: {{page.baseurl}}/config-guide/varnish/config-varnish.html [Elasticsearch]: {{page.baseurl}}/config-guide/elasticsearch/es-overview.html [Elasticsearch PHP client]: https://github.com/elastic/elasticsearch-php -[2.x and 5.x]: https://www.elastic.co/support/eol [RabbitMQ]: {{page.baseurl}}/config-guide/mq/rabbitmq-overview.html diff --git a/src/guides/v2.3/inventory/release-notes.md b/src/guides/v2.3/inventory/release-notes.md index 891cab311ed..4747423ac0b 100644 --- a/src/guides/v2.3/inventory/release-notes.md +++ b/src/guides/v2.3/inventory/release-notes.md @@ -20,6 +20,13 @@ The release notes include: - {:.fix}Fixes and improvements - {:.bug}Known issues +### v1.2.1 +{{site.data.var.im}} 1.2.1 (module version: `magento/inventory-metapackage = 1.2.1`) is supported with version 2.4.1 and compatible with version 2.4.0 of {{site.data.var.ce}}, {{site.data.var.ee}}, and {{site.data.var.ece}}. + +- {:.fix} Fixed known issue related to `inventory_cleanup_reservations` cron job, addressed issue related to In-Store Pickup functionality for bundle products, general improvements to stock calculation, bundle product support and backorders functionality. + +- {:.new} **Functional tests.** Introduced new functional tests to provide additional coverage for In-Store Pickup functionality. + ### v1.2.0 {{site.data.var.im}} 1.2.0 (module version: `magento/inventory-metapackage = 1.2.0`) is supported with version 2.4.0 of {{site.data.var.ce}}, {{site.data.var.ee}}, and {{site.data.var.ece}}. @@ -45,6 +52,13 @@ The release notes include: DELETE FROM inventory_reservation where reservation_id IN (result_of_the_first_query); ``` +### v1.1.6 +{{site.data.var.im}} 1.1.6 (module version: `inventory-composer-metapackage = 1.1.6`) is supported with version 2.3.6 and compatible with version 2.3.5, 2.3.4, 2.3.3, 2.3.2, 2.3.1, and 2.3.0 of {{site.data.var.ce}}, {{site.data.var.ee}}, and {{site.data.var.ece}}. + +- {:.new} **Asynchronous stock re-indexing.** Added the ability to asynchronously re-index stock and improved the performance of several critical scenarios. + +- {:.fix} Bug fixes to resolve issues related to backorders, credit memos, low stock report grid, fixes connected to "resolve inconsistencies" CLI tool and general improvements. + ### v1.1.5 {{site.data.var.im}} 1.1.5 (module version: `inventory-composer-metapackage = 1.1.5`) is supported with version 2.3.5 and compatible with version 2.3.4, 2.3.3, 2.3.2, 2.3.1, and 2.3.0 of {{site.data.var.ce}}, {{site.data.var.ee}}, and {{site.data.var.ece}}. diff --git a/src/guides/v2.3/release-notes/b2b-release-notes.md b/src/guides/v2.3/release-notes/b2b-release-notes.md index 4b9086f9874..886117073e3 100644 --- a/src/guides/v2.3/release-notes/b2b-release-notes.md +++ b/src/guides/v2.3/release-notes/b2b-release-notes.md @@ -3,7 +3,37 @@ group: release-notes title: B2B Release Notes --- -### B2B +## B2B + +The release notes for the B2B extension captures additions and bug fixes that Magento has added during a release cycle. + +### Magento 2.3.6 -- Magento B2B + + + +* An SQL error no longer occurs when a merchant assigns a category to a shared catalog in a deployment where B2B is installed. Previously, Magento threw this exception: `SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'THEN -2 END), IF(grant_catalog_category_view = 0, NULL, grant_catalog_category_v' at line 1` + + + +* Magento no longer displays a 404 page when a merchant uses the **Enter** button instead of clicking the **Save** button when creating a requisition list on the storefront. + + + +* When you create or update a B2B Company using the REST API (`http://magento.local/rest/V1/company/2`, where `2` represents the company ID), the response now includes the settings for `applicable_payment_method` or `available_payment_methods` as expected. + + + +* Magento now sends an email notification confirming that a customer has permission to exceed the designated credit limit when a merchant enables the **Allow To Exceed Credit Limit** setting. Previously, the notification email sent by Magento indicated that the customer did not have permission to exceed the limit. + + + +* Magento now provides an `addToCart` DataLayer event for Quick Order and Requisition lists pages. + + + +* Requisition lists now include all grouped products and quantities that have been added to the list. Previously, when a merchant navigated to a requisition list after adding products to it from a product detail page, Magento displayed this error: `1 product(s) require your attention - Options were updated. Please review available configurations`. [GitHub-59](https://github.com/magento/partners-magento2b2b/issues/59) + +### Magento 2.3.5 -- Magento B2B diff --git a/src/guides/v2.3/release-notes/bk-release-notes.md b/src/guides/v2.3/release-notes/bk-release-notes.md index d87bc6daa94..3c865af4a61 100644 --- a/src/guides/v2.3/release-notes/bk-release-notes.md +++ b/src/guides/v2.3/release-notes/bk-release-notes.md @@ -5,6 +5,9 @@ title: 2.3 Release Information ## Magento 2.3.x Release Notes +* [{{site.data.var.ce}} 2.3.6 Release Notes]({{page.baseurl}}/release-notes/open-source-2-3-6.html) +* [{{site.data.var.ee}} 2.3.6 Release Notes]({{page.baseurl}}/release-notes/commerce-2-3-6.html) + * [{{site.data.var.ce}} 2.3.5 Release Notes]({{page.baseurl}}/release-notes/release-notes-2-3-5-open-source.html) * [{{site.data.var.ee}} 2.3.5 Release Notes]({{page.baseurl}}/release-notes/release-notes-2-3-5-commerce.html) diff --git a/src/guides/v2.3/release-notes/commerce-2-3-6.md b/src/guides/v2.3/release-notes/commerce-2-3-6.md new file mode 100644 index 00000000000..cbcea65cb92 --- /dev/null +++ b/src/guides/v2.3/release-notes/commerce-2-3-6.md @@ -0,0 +1,841 @@ +--- +group: release-notes +title: Magento Commerce 2.3.6 Release Notes +--- + +Magento Commerce 2.3.6 offers significant platform upgrades, substantial security changes, and performance improvements. + +This release includes over 160 functional fixes to the core product and over 15 security enhancements. + +{:.bs-callout-info} + +Quarterly releases may contain backward-incompatible changes (BIC). Magento 2.3.6 contains minor backward-incompatible changes. To review minor backward-incompatible changes, see [BIC reference]({{page.baseurl}}/release-notes/backward-incompatible-changes/reference.html). (Major backward-incompatible issues are described in [BIC highlights]({{page.baseurl}}/release-notes/backward-incompatible-changes/index.html). Not all releases introduce major BICs.) + +{:.bs-callout-info} + +We are adding support for PHP 7.4.x in Magento 2.3.7, which is scheduled for release in Q2 2021. This support will introduce breaking changes to Magento 2.3.x deployments. How will this affect your store? See the [PHP 7.4 support for Magento 2.3.x release line](https://community.magento.com/t5/Magento-DevBlog/PHP-7-4-support-for-Magento-2-3-x-release-line/ba-p/458946) DevBlog post. + +## Other release information + +Although code for these features is bundled with quarterly releases of the Magento core code, several of these projects (for example, B2B, Page Builder, Inventory Management, and Progressive Web Applications (PWA) Studio) are also released independently. Bug fixes for these projects are documented in the separate, project-specific release information that is available in the documentation for each project. + +## Highlights + +Look for the following highlights in this release: + +### Substantial security enhancements + +This release includes the following security enhancements: + +#### Over 15 security enhancements that help close remote code execution (RCE) and cross-site scripting (XSS) vulnerabilities + +No confirmed attacks related to these issues have occurred to date. However, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. Most of these issues require that an attacker first obtains access to the Admin. As a result, we remind you to take all necessary steps to protect your Admin, including but not limited to these efforts: IP allowlisting, [two-factor authentication]({{page.baseurl}}/security/two-factor-authentication.html), use of a VPN, the use of a unique location rather than `/admin`, and good password hygiene. See [Security Updates Available for Magento](https://helpx.adobe.com/security/products/magento/apsb20-59.html) for a discussion of these fixed issues. + +#### Security enhancements and fixes to core code + +Additional security enhancements include: + +**CAPTCHA** protection has been added to the following product areas: + +* Place Order storefront page and REST and GraphQL endpoints + +* Payment-related REST and GraphQL endpoints. + +CAPTCHA protection for these additional pages is disabled by default. It can be enabled on the Admin in the same way that other pages covered by CAPTCHA are. This protection has been added as an anti-brute force mechanism to protect stores against carding attacks. See [CAPTCHA](https://docs.magento.com/user-guide/stores/security-captcha.html). + +{:.bs-callout-info} +Starting with the release of Magento Commerce 2.3.2, Magento will assign and publish indexed Common Vulnerabilities and Exposures (CVE) numbers with each security bug reported to us by external parties. This allows users of Magento Commerce to more easily identify unaddressed vulnerabilities in their deployment. You can learn more about CVE identifiers at [CVE](https://cve.mitre.org/). + +## Fixed issues + +We have fixed hundreds of issues in the Magento 2.3.6 core code. + +### Installation, upgrade, deployment + + + +* Magento now displays an informative error message when some themes are not deployed after running `setup:static-content:deploy`. Previously, when deployment completed successfully but not all packages were deployed, Magento did not display an error. When the `setup:static-content:deploy` command is executed with enabled parallel processing and each theme requires more time to be deployed then the specified maximum execution time, this command can finish successfully, although themes are not deployed. + + + +* The **Use default** checkbox for Klarna payments (**Stores** > **Configuration** > **Sales** > **Payment methods** > **Klarna**) now remain checked as expected when website scope changes. + + + +* Upgrade no longer results in the sudden failure of the Galera cluster. Previously, the Galera cluster exited abruptly after re-indexing immediately after upgrade. During Magento upgrade, index tables are altered and the engine is changed from MEMORY to InnoDB. At this point, the content of these tables becomes out-of-sync between the nodes of the Galera cluster. [GitHub-25334](https://github.com/magento/magento2/issues/25334) + + + +* `bin/magento setup:di:compile` no longer throws a fatal error. Previously, Magento threw an error the first time you ran this command, but the second execution resulted in successful compilation. + +### AdminGWS + + + +* Magento no longer throws an error when an administrator with restricted roles for specific websites tries to create a subcategory from the Admin. + + + +* Administrative users with limited role scope can now modify alt text, and Magento saves those values. If an administrative user is not permitted to modify alt text, then the alt text box is grayed out. + + + +* Administrators with restricted access to one website only in a multi-site deployment can now preview a Scheduled Update for that website. Previously, the staging preview used the default store by default, and if the user did not have access to the default store, Magento threw an exception. + +### Amazon Pay + +* Clicking **Return to standard checkout** just before completing checkout with Amazon Pay now returns the shopper to the checkout page that displays all payment methods available to the shopper. Previously, no payment methods were displayed. + +### Analytics + + + +* CSV files that are generated by `analytics_collect_data` are now properly escaped. Previously, these files were not generated with the correct escaping, which prevented the generation of Inventory reports. + + + +* Magento successfully generates advance reporting data files and sends them as expected to Inventory on deployments with split databases. Previously, Magento did not generate or send the `quotes.csv` file to Inventory, and as a result, Inventory did not generate the expected reports. + +### Backend + + + +* The Products in the Comparison List and the Recently Compared Products features now work as expected. Previously, when the comparison list was expanded, Magento did not display products, even though the section indicated that the list contained products. + +### Bundle products + + + +* Re-importing bundle products now works as expected. Previously, the second import did not change the `catalog_product_relation` table, and the storefront did not display the bundled products because parent-child product relations were not generated correctly. + + + +* Magento no longer sets prices for fixed-price bundle product child items in quotes. + +### Cache + + + +* `X-Magento-Tags` headers no longer exceed the size permitted by the HTTP specification. Previously, category pages that contain many products return an `X-Magento-Tag` header that resulted in a 503 error. + +### Cart and checkout + + + +* The **State/Province/Region** input box is now enabled as expected on **My account** > **Address Book** > **Add new address**. + + + +* Custom address attributes are now included as expected in the form displayed for Payment step of the checkout workflow. + + + +* The shipping method estimator now works as expected when custom address attributes are present on the shipping step of the checkout workflow. Previously, Magento displayed this error message: `{"message":"Error occurred during \"custom_attributes\" processing. A custom attribute is specified with a missing attribute code. Verify the code and try again."}` [GitHub-27505](https://github.com/magento/magento2/issues/27505) + + + +* Custom customer address attributes fields are now displayed as expected in the storefront checkout workflow. + + + +* Shoppers can now purchase a virtual gift card using PayPal Braintree without defining a shipment address. Previously, Magento threw an error. + + + +* Magento now displays the waiting/spinning icon while prices are updated on the cart. + + + +* Merchants can now enable **Apply to Shipping Amount** in the Action tab of **Marketing** > **Cart Price Rules** > **Add New Rule** when **Fixed amount discount for whole cart** is applied. [GitHub-24422](https://github.com/magento/magento2/issues/24422) + +### Catalog + + + +* Merchants with multiple websites can now use the REST API to create and update products while preserving image and image-role inheritance. Previously, when a merchant used the REST API to create and update products, and a product was updated for store view, the default image roles were loaded and saved for that store view. As a result, the store-view image roles stopped inheriting from the default scope after update. + + + +* Magento now successfully updates attributes labeled `Product Type`. Previously, because the `product_type` attribute is reserved in Magento core code, Magento displayed this message when you tried to update it: `An attribute with the same code (product_type) already exists.` + + + +* Problems with product sort order on the storefront have been resolved. Previously, when Magento indexed product prices, it occasionally set a configurable product’s `min_price` and `max_price` to 0 in the `catalog_product_index_price` table, which affected price sort order on the storefront. + + + +* Shoppers can now re-order an invoiced order of a product with customizable options as expected. Previously, Magento threw this error when a shopper tried to re-order: `{"0":"The product's required option(s) weren't entered. Make sure the options are entered and try again`. + + + +* Magento now displays all re-enabled products in the storefront as expected. Previously, when a product was disabled and then re-enabled, Magento did not display the product until the Varnish page cache was cleared or the store re-indexed because the page cache was not invalidated after re-enabling a product. + + + +* Magento now displays the Recently Compared Products widget only after at least one product has been deleted from a product comparison. Previously, this widget was displayed immediately after a shopper added a product for comparison. + + + +* You can now successfully save an image to a category from the Admin. Previously, after you saved the image, part of the URL was missing, and you couldn’t re-open the image. + + + +* The **Product in Websites** checkbox of the new product page is now enabled by default for restricted administrative users in multi-site deployments. Previously, the checkbox for the non-default website was not preselected, and if the administrator left the checkbox unselected, Magento displayed an error message. + + + +* The **Price** condition in Page Builder now works as expected for configurable products. + + + +* Saving a category now flushes only the block cache that is related to this category. Previously, Magento flushed cache for all category blocks. + + + +* Magento now correctly represents Arabic thousands grouping and Arabic decimal separator symbols. Previously, Arabic symbols were trimmed. [GitHub-26676](https://github.com/magento/magento2/issues/26676) + + + +* Consecutive asynchronous price updates no longer interfere with each other and correct status is assigned to each operation. Previously, if an asynchronous price update failed, all subsequent asynchronous price updates will fail until the corresponding queue consumer is restarted. + + + +* Changes introduced by an earlier bug fix that resulted in HTML errors on the product list page have been reverted. + +### Catalog Rule + + + +* Product and catalog caches now expire as scheduled. Previously, caches expired daily because `сron` ran the `catalogrule_apply_all` task once daily, which re-indexed all catalog rules and dependent indexers, and cleared the cache for all products and categories. + +### CMS content + + + +* Magento now throws an error when a merchant creates a CMS page with the same URL as the Company Structure page. Previously, Magento displayed the CMS page instead of the Company Structure page. + +### Configurable products + + + +* Admin users accounts created from an admin account with a restricted scope can now create a configurable product with attributes as expected. Previously, Magento threw this error: `Notice: Undefined index: value_index in 23develop/app/code/Magento/ConfigurableProduct/Helper/Product/Options/Factory.php on line 101`. + + + +* Magento no longer links a simple product to a configurable product when the API call to link these products fails. + + + +* Pagination problems with the Configurable Product Edit Current Variations list have been corrected. + +### Custom customer attributes + + + +* The labels for address fields in the checkout workflow and the address book have been edited for consistency. + + + +* Magento no longer throws an error when you include an empty customer attribute field in the **Forms to Use In** field while creating a Company account on the storefront. Previously, Magento threw this error: `PHP Fatal error: Uncaught TypeError: Argument 2 passed to Magento\Eav\Model\Attribute\Data\Text::validateLength() must be of the type string, null given`. + +### Customer + + + +* The **State/Province** fields are now populated as expected on the Edit Address page (**My Account** > **Address book**). + + + +* Customer group is no longer automatically changed for a customer who is assigned to a Company when you edit the customer on the Customer grid. + + + +* Magento no longer resets a customer’s customer group to the default when a customer saves their account information. + + + +* Saving a deleted customer from the Admin now generates an error message only. Previously, Magento displayed a blank page and generated a report that contained this string: `"0":"No such entity with customerId = 3","1":"#1 Magento\\Customer\\Model CustomerRegistry->retrieve() called at [app\/code\/Magento\/Customer\/Model\/ResourceModel\/CustomerRepository.php:340"`. + + + +* Magento now honors customer group settings when you create a new customer from the Admin in a multi-site deployment. + + + +* The validation logic associated with the **Date of Birth** field of the Customer Registration form no longer triggers a JavaScript error. + + + +* The Admin view of a customer cart now displays all the products that were added to the cart from multiple websites in a multi-website deployment. Previously, when a customer added a product to their cart from a non-default website, the product was not displayed in the Admin even when **Share customer account** was set to **Global**. + + + +* The **Invalid Form Key. Please refresh the page** text string on the login page is now translated as expected. + + + +* Magento now displays the **Credit memo** button after the partial refund of an order. Previously, Magento did not display this button after you created a partial refund, and you could not create a credit memo for the rest of the order. + + + +* The shopping cart that is accessed from the Admin customer details page now includes only products from the selected customer’s quote. Previously, this cart listed all items in the `quote_item` table. + + + +* Customer creation from the Admin now honors the default customer group setting as expected. + + + +* The `PHPSessionId` is now changed as expected after a customer logs out and then logs back in. + + + +* Data scripts are no longer re-run whenever you attempt to upgrade the database by running `bin/magento setup:upgrade`. Previously, upgrade scripts were re-run unnecessarily, which affected performance. [GitHub-19469](https://github.com/magento/magento2/issues/19469) + +### Customer segment + + + +* Administrators with the correct permissions can now access Advanced Reporting and Segment Reports. + + + +* We’ve improved the performance of editing and saving customer segments that contain large numbers of customers (more than three million). Previously, when you created or edited a customer segment that contained many customers, Magento threw a 500 error. + +### Directory + + + +* The Default State dropdown menu is now populated by data that is based on the allowed countries that have been assigned to the selected website when you configure a value for the **Default Tax Destination Calculation** field. Previously, this dropdown listed the countries that were assigned to the default website. + + + +* The format of the State/Province drop-down menu is now consistent across the Admin. + +### dotdigital + +* dotdigital now has a Content Security Policy whitelist for specific domains used by this module. + +* Contacts are no longer resubscribed when their `last_subscribed_at` value is `null`. + +* Deletion of automation enrollments and abandoned carts from their respective report grids now works as expected. + +* Handling of the API response dotdigital receives when processing resubscribes has been improved. + +* dotdigital now catches exceptions that are thrown by `unserialize()` to protect against unserializable data being stored for custom attributes. + +### Downloadable + + + +* Clicking on a downloadable product's **Sample** button from the Admin product page now downloads a sample as expected. Previously, when you clicked **Sample**, Magento displayed this error: `The product that was requested doesn't exist. Verify the product and try again`. + + + +* You can now use an import file to update downloadable products in bulk by SKU and description. Previously, validation errors occurred, and import failed. + + + +* Administrators with restricted permissions to Catalog can now create a downloadable product. Previously, these administrators could not create a downloadable product, and Magento threw an error. + +### Dynamic block (formerly banner) + + + +* Table title now matches the data table (as expected) when you create a dynamic block and add a related catalog price rule. + +### Email + + + +* Customers are no longer redirected away from the current website when they report a forgotten password in multi-site deployments where customer accounts are shared globally. Previously, customers were redirected to the website on which the account was created. + + + +* Order confirmation emails sent to customers now include the list of ordered items as expected. Previously, when you created an email template in the Admin by loading and saving the default template, emails generated from this template did not include the list of ordered items. [GitHub-26882](https://github.com/magento/magento2/issues/26882) + +### Frameworks + + + +* `sales_order_shipment_track_save_commit_after` is now triggered as expected when you use the REST API to create a shipment. + + + +* We have improved the performance of the `Magento\Framework\App\DeploymentConfig\Reader::load` function. Previously, when a request was made to Magento, this function was called repetitively, which resulted in `config.php` and `env.php config` files being loaded each time the method was called. + + + +* Magento no longer throws the following fatal error when Redis uses all allowed memory: `report.CRITICAL: OOM command not allowed when used memory > 'maxmemory'.` + +### General fixes + + + +* An expired persistent session is now renewed as expected when the shopper logs back in. + + + +* Merchants can now unassign products from categories as expected. Previously, Magento threw an error similar to this error: `Could not save product "4" with position 0 to category 3`. + + + +* MAP (minimum advertised price ) now works as expected for group products. + + + +* New CMS pages are now added as expected to a website’s store page hierarchy. + + + +* Magento no longer throws an exception when a shopper tries to unset the persistence cookie after beginning checkout and then navigating to the storefront home page. Previously, when the shopper clicked the **Not you?** link on the home page, Magento threw this exception: `The shipping address is missing. Set the address and try again`. [GitHub-24218](https://github.com/magento/magento2/issues/24218) + + + +* You can now use the `PUT /V1/products/:sku` endpoint to update links to YouTube videos. Previously, Magento displayed a thumbnail for the video, but the video player did not load when you clicked the **Play** button. [GitHub-23194](https://github.com/magento/magento2/issues/23194) + + + +* You can now use `app/etc/env.php` to change the message broker from MYSQL to AMQP. + +### Gift cards + + + +* Gift Card Accounts now capture order numbers as expected. Previously, the **More information** field in the History tab for the selected gift account did not display order IDs. + + + +* Using a comma as a decimal separator now works as expected. Previously, the comma separator ignored decimal values. + + + +* Gift cards are now displayed as expected on the mini cart. Previously, Magento rendered HTML objects as text. + +### Google Tag Manager + + + +* Magento no longer throws a JavaScript error during checkout when the **Cookie Restriction Mode** setting and Google Tag Manager are enabled. + +### GroupedProducts + + + +* Merchants can now successfully send email to a shopper that contains a credit memo for an order that includes a grouped product. Previously, Magento threw a fatal error when the merchant clicked **Send Email**. [GitHub-25617](https://github.com/magento/magento2/issues/25617) + + + +* The products query now returns all expected data for grouped products. Previously, `product_links` was an empty array. + +### Image + + + +* Magento now displays PNG images as expected after upload. + +### Import/export + + + +* When an imported product has `qty` set to 0 but `is_in_stock set` to 1 in the CSV file, the product is not listed on the category page, and the product details page lists it as out-of-stock. Previously, products with these values were visible on the storefront after import. + + + +* The `error_report.csv` file now downloads with content and is available inside the `var/import_history/` directory as expected. Previously, this file was not generated after import. + + + +* You can now hide product images on the storefront during import. + + + +* Scheduled imports now run as expected when the import CSV file contains a byte order mark (BOM). + + + +* Imported CSV files now capture related product information as expected. Previously, related product information was not consistently uploaded the first time the CSV file was imported. + + + +* Magento now successfully imports customer addresses that contains a region for a country that does not have defined regions. Previously, Magento threw this error: `Please enter a valid region`. + + + +* Magento now displays the customer list as expected after automatic re-indexing. Previously, although manually running `bin/magento index:reindex` worked, the customer grid did not display customer information after automatic re-indexing. + + + +* Magento no longer creates duplicate SKUs in the Admin when products are imported by CSV file. + + + +* Magento no longer throws an error during import when imported data includes a `swatch_image` store-view key has a value of `no_selection`. Previously, Magento threw this error: `Imported resource (image) could not be downloaded from external resource due to timeout or access permissions in row(s): 1`. [GitHub-25026](https://github.com/magento/magento2/issues/25026) + + + +* Deadlocks no longer occur when the import process executes a bulk insert and the re-index process simultaneously executes a large insert from select. Previously, Magento displayed this error: `PDOException: SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock`. [GitHub-8933](https://github.com/magento/magento2/issues/8933) + + + +* Customer address `region_id` is no longer assigned a `NULL` value when you import customer addresses using a CSV file (`entity type = "customer address"` and `import behavior = "add/update”`) from which certain field values have been deleted. + +### Klarna + +* Magento now correctly refunds a Klarna order when the order contains a product that has been deleted. Previously, Magento threw a fatal error. + +* Default configuration settings for Klarna remain set as expected when you change the configuration scope to a different website. Previously, changing scope resulted in clearing all Klarna settings. + +* The checkout page now opens as expected when a shopper’s cart contains a downloadable product. Previously, the checkout page was blank. + +* Fraud notification messages have been improved. + +### Layered navigation + + + +* Layered navigation, item count, and pagination are now correct when products are not assigned to a category and the **Display Out of Stock Products** setting is enabled. + +### Media storage + + + +* `var/resource_config.json` is no longer regenerated whenever an image is requested by `get.php`. Previously, this file was rewritten on each call to `get.php`. + +### Newsletter + + + +* Exporting the Newsletter Subscribers list using the `Excel XML` option now results in the export of all rows as expected. Previously, exported data included only the page pagination value, not all rows. + + + +* Magento no longer throws an error when a user subscribes to a newsletter and reCAPTCHA for the newsletter is disabled for the website scope. Previously, when **Use invisible ReCaptcha in newsletter** was set to the default (**yes**) in the default configuration scope but set to **no** in the Main Website scope, the storefront subscription attempt failed, and Magento displayed this error: `Incorrect ReCaptcha validation`. + + + +* Shoppers subscribing to a newsletter now receive only an email confirming their subscription. Previously, shoppers received two emails: a subscription confirmation and an unsubscribed notification. + +### Payment methods + + + +* Registered shoppers can now checkout successfully when their only defined payment method is Braintree. Previously, the **Place Order** button remained disabled after the shopper entered the correct credit card details unless the shopper had unchecked the **My billing and shipping address are the same** checkbox. + + + +* Magento now completes Payflow Pro payments successfully when the shopper’s name contains accented letters. Previously, payment did not complete, and Magento logged this error: `report.CRITICAL: String to be escaped was not valid UTF-8 or could not be converted:`. + + + +* Magento no longer saves credit card numbers when the **Save for later use** checkbox on the payment section of the checkout workflow is not selected. + + + +* Magento now displays a message that prompts you to enter mandatory credit card data when you click **Submit** for an Admin order without entering valid payment information. Previously, the Braintree card validator did not throw an error when payment input fields were invalid, and the page became inactive. + + + +* A shopper whose address book contains multiple addresses can now change shipping addresses during checkout when paying with Braintree. Previously, Magento displayed JavaScript code in the address field when the shopper selected a different address from the drop-down menu on the checkout workflow. + + + +* You can now successfully use PayPal Express to pay for an order when persistent checkout cart is enabled and the **Clear Persistence on Sign Out** setting is set to **no**. Previously, Magento redirected you to the Login page. + +### Product alert + + + +* Unsubscribe actions for product alerts now work as expected. Previously, when a customer clicked on the **Click here to stop alerts for this product** link, Magento displayed a 404 error. + + + +* Product stock alert unsubscribe now works when a user’s session expired. Previously, when you clicked on the **Click here to stop alerts for this product** link, Magento displayed a 404 error. + +### Return Merchandise Authorizations (RMA) + + + +* Magento now displays either an informative error message or all available products when an administrator with restricted permissions tries to create a return for products that are no longer in the assigned website scope. Previously, Magento displayed a blank page. + + + +* You can now delete tracking and shipping information for an RMA when JavaScript bundling is enabled. + +### Reviews + + + +* Magento no longer returns a 500 error when you try to open a Category page on the storefront when **Layout = Product – Full Width** has been set from the Design tab of the Category page. + +### Sales + + + +* Order update emails that are sent to customers now include the correct order status. Previously, if an order status changed from `processing` to another state, the order email did not reflect the status change. + + + +* The New Shipment email generated by `POST /V1/order/:orderId/ship` now contains the same shipping and customer information as shipments that are created manually from the Admin. Previously, this email did not contain the customer name, tracking information, products ordered, and other order information. + + + +* Magento no longer assigns a status of `Complete` after invoicing an order that requires zero payment. + + + +* Localized region names that are displayed on the storefront Order page are now correctly translated. Previously, the region name was not based on the specified locale unless it was edited in the Admin. + + + +* Email sent to customers that contain partial invoices now includes accurate item subtotals. Previously, the subtotal in this email contained was the total of the ordered quantity, not the total amount of the invoiced quantity. + + + +* `sales_clean_quotes` now efficiently deletes all expired quotes. Previously, `sales_clean_quotes` jobs did not complete due to memory issues, and Magento threw a fatal error. + + + +* Magento now assigns the correct Group ID when a new customer creates an order in multi-site deployments. Previously, Magento applied the settings from the default customer group. + + + +* Administrators with restricted permissions that include view permission for credit memos, invoices, and shipments can now view invoices and shipments from the Orders page as expected. Previously, when a restricted administrator tried to view an order, Magento displayed this error: `Something went wrong with processing the default view and we have restored the filter to its original state`. + + + +* Magento no longer displays an error when a customer adds a quantity of a product to their cart that exceeds half of the existing product stock but does not exceed the total stock. Previously, under these circumstances, Magento displayed this error: `The requested qty is not available`. [GitHub-24365](https://github.com/magento/magento2/issues/24365) + +### Sales Rule + + + +* Coupon codes that have been applied based on shipping method are no longer applied when a shopper changes shipping method. Previously, Magento did not clear coupon codes when shoppers switched shipping methods. + + + +* Coupon discounts are now calculated correctly when you add a bundle product to the cart after the coupon was applied. Previously, it was incorrectly calculated. + + + +* Shoppers cannot apply a coupon code more frequently than the **Uses Per Customer** setting permits. Previously, if a shopper had multiple browser windows open and placed multiple orders concurrently, each order received the discount, even though the **Uses Per Customer** setting had a value of **1**. + + + +* The order summary now displays the correct discount amount when a cart price rule has been applied. Previously, the rule did not correctly round amounts when calculating shipping discounts. + + + +* Magento now displays category trees as expected when you try to create or edit a Cart Price rule. Previously, selecting a category in the Condition section while creating or editing a rule resulted in JavaScript errors. + + + +* Magento now applies fixed-amount, whole-cart discounts correctly for orders being shipped to multiple addresses. Previously, this type of discount was applied multiple times when a customer checked out an order using Check Out with Multiple Addresses. [GitHub-25834](https://github.com/magento/magento2/issues/25834) + +### Search + + + +* Elasticsearch results now include the correct values for each store view’s attribute options. If a Dropdown or Multiple Select attribute has a different option value in the non-default store view than in the default store view, Elasticsearch now indexes that value or returns the product with that value in the results. Previously, Elasticsearch didn’t index that value or return the product with that value in the results. + + + +* Price sorting now works correctly for out-of-stock configurable products. + + + +* The performance of catalog search has improved. Disabling **Enable Search Suggestions** (**Stores** > **Configuration** > **Catalog** > **Catalog Search**) works as expected. Previously, Magento queried the MySQL search_query table instead of Elasticsearch for autocomplete search suggestions. [GitHub-25534](https://github.com/magento/magento2/issues/25534) + +### Sitemap + + + +* The sitemap generation process now uses custom URL rewrites as expected. Previously, the generated `sitemap.xml` did not include custom URLs. + + + +* Encoded values are now correctly escaped in `sitemap.xml`. Previously, when you included encoded characters in a product name or image title, the generated sitemap was invalid. + +### Staging + + + +* You can now access the CMS Preview page when editing a CMS page with a scheduled update and re-assigning it from the default store to another store. Previously, Magento threw a 404 error when you clicked on the preview link. + + + +* Magento no longer changes a product’s date values when an administrator edits other product features. Previously, Magento set the `news_from_date` value to the current date and removed the `news_to_date` value every time the product was saved. + + + +* Editing an existing schedule no longer results in a duplicated schedule. Previously, when you edited an existing schedule, Magento duplicated it, and when you tried to open the duplicate schedule, Magento threw an error. + + + +* Sending 0 with the `/rest//V1/products/special-price-information` special price endpoint now saves the price and returns the schedule as expected. + +### Store + + + +* The store-view switcher now works correctly when the store views have different base URLs. Users are now redirected to the corresponding page, category, or product page on the new store view. + + + +* You can now export `config.php` and default website code from one website to install and configure Magento on a second website in a multi website deployment. Previously, the default store and view disappeared after the export, and errors occurred on the storefront. + + + +* Magento installation now completes successfully, and stores are created as expected, when store configuration is pre-defined in `config.php`. + +### Swatches + + + +* You can now use the `POST /V1/products/attributes` to add a `text_swatch` type of product attribute. Previously, Magento did not add the option to the attribute and displayed an error. + + + +* Magento now displays tier prices as expected for configurable product variations. + +### Target Rule + + + +* Loading of product details pages has been optimized. Indices for database tables that optimize target rule conditions queries for many cases have been added. + + + +* Product rules now apply to out-of-stock products as expected. Previously, Magento did not display out-of-stock products in the related products list even when the .the rule was configured to display out-of-stock products. + + + +* The related product block that is displayed for a product on the storefront now displays the products that have met the criteria defined in the Related Product Rule. Previously, Magento did not display any related products. + +### Theme + + + +* Shoppers can now successfully change the number of orders per page in the order history multiple times. Previously, when a shopper changed this value more than once, Magento rendered the results page as expected for only the first value entered. + + + +* Themes that are added in User Agent Rules are now affected as expected when you run `bin/magento catalog:images:resize`. Previously, only themes that were assigned to stores were affected when `bin/magento catalog:images:resize` was run. + +### Translation and locales + + + +* Inline translation now works as expected on the storefront when Admin **Stores** > **Configuration** > **Advanced** > **Developer** > **Translate Inline** > **Enabled for Storefront** is set. + +### UI + + + +* Magento now preserves an attribute’s value when you move the attribute from one group to another. + +### URL rewrites + + + +* Moving a store view to a different website no longer resets URLs. Previously, Magento incorrectly regenerated CMS and product URL rewrites. + + + +* Magento no longer changes a product’s URL in all stores when a merchant changes a product URL for one store in a multi-site deployment. Previously, if a merchant changed a URL key for one store view, Magento changed the URL for all stores. + +### Vertex + +* Taxes are now calculated as expected on orders that contain both physical and virtual products. + +* Vertex now processes products with a price of 0 as expected. Previously, administrators could not create an order with a total of 0. + +* The checkout process now successfully progresses from shipping to payment when using Internet Explorer 11.x with Vertex. Previously, Magento threw a JavaScript error when the shopper tried to proceed from shipping to payment. + +* The process of submitting an invoice to Vertex has been been optimized, and performance has improved. + +* Tax details are now included as expected in the database. + +* Log rotation now works as expected in production mode. + +* Vertex now calculates taxes correctly when a default ZIP code is provided for tax calculation. + +* Updating the billing address with Vertex's recommendation no longer updates the fields on the shipping address. + +### Visual Merchandiser + + + +* You can now add products to a category when implementing Level 2 cache. + +### Web API framework + + + +* Invoices created using the REST API now include gift card information similar to the invoices that are created in the Admin. Previously, using POST `\{host}/rest/default/V1/order/:id/invoice` to invoice the order did not display the gift card code or gift card amount applied. + + + +* The `default_sort_by` attribute now takes `String` instead of `String[]`. + + + +* You can now use POST `http:///rest/V1/categories/` to create or update a category. Previously, Magento did not save the value if the `default_sort_by` value was set as an array. When the `default_sort_by` value was set as a string, Magento threw this error: `Error occurred during \"custom_attributes\" processing. Attribute \"default_sort_by\" has invalid value. The \"string\" value's type is invalid. The \"string[]\" type was expected. Verify and try again.` + + + +* Bulk order updates using `PUT /async/bulk/V1/orders/:id` now update the order status as expected. Previously, Magento threw this error: `report.ERROR: Property "AdditionalInformation" does not have accessor method "setAdditionalInformation" in class "Magento\Sales\Api\Data\OrderPaymentInterface".` + +### Website Restriction + + + +* Merchants can now create company users from the Company Users in My Account and Company Structure pages in deployments where **Access Restriction** is enabled and **Restriction Mode** is set to **Sales: Login Only**. Previously, Magento threw this error when a merchant tried to create a user: `Can not register new customer due to restrictions are enabled`. + + + +* Clicking the **Track shipping** button for an order from the Admin now results in tracking information being displayed in a pop-up window as expected. Previously, this link took the administrator to the Log in page. + + + +* Enabling Website Restriction no longer blocks Varnish ESI requests for customers logged in as guest. Previously, these guests could not access the home page main menu. + +### Wishlist + + + +* Administrators can now configure a configurable product that has been added by a customer to a wishlist from a non-default store. Previously, when the customer had also added the configurable product from a non-default store, Magento threw an error. + + + +* You can now use the wishlist search feature to find a product in a public wish list in deployments where support for multiple wishlists is enabled. Previously, after a customer used the wishlist search to find a product, selecting it, and clicking **Add to cart**, Magento did not add the product to the cart and displayed this error: `Invalid Form Key. Please refresh the page`. + + + +* The **Add to cart** button on the shared wishlist page now works as expected for anonymous, guest, and users who are not logged in. + + + +* You can now navigate and modify wishlists from the cart in deployments running Internet Explorer 11.x. Previously, you could not create, edit, or move a wishlist in this environment. + +## Known issues + +**Issue**: The new CAPTCHA feature for checkout does not work as expected on the Place Order page when using third-party payment providers. Merchants running Magento 2.3.6 or 2.4.1 who have enabled CAPTCHA protection on the Place Order storefront page will see this error when checking out using a third-party payment provider such as PayPal: `Please provide CAPTCHA code and try again`. A fix for this issue be available in the next few weeks, and will be included in our next quarterly patch (Q12021). Please contact Support for additional information. + +**Issue**: Merchants upgrading their stores from 2.3.5-p2 to 2.3.6 will note that two module versions downgrade. These messages reflect the incomplete delivery of two security fixes to the 2.3.x quarterly patches. These fixes for low severity issues are included in Magento 2.3.5-p2, 2.4.1, and 2.4.0-p1 but are missing from Magento 2.3.6. No hot fixes will be provided. These fixes will be merged along with the other security fixes in Magento 2.3.6-p1, which is scheduled for Q12021. + +**Issue**: Merchants cannot log in to dotdigital from the Admin when dotdigital is enabled. See the [It's impossible to login in the dotdigital via admin panel when dotdigital account is enabled](https://support.magento.com/hc/en-us/articles/360050092291) Knowledge Base article. + +### System requirements + +Our technology stack is built on PHP and MySQL. For more information, see [System Requirements]({{site.baseurl}}/system-requirements.html). + +### Installation and upgrade instructions + +You can install {{site.data.var.ee}} 2.3.6 using Composer. + +## Migration tool kits + +The Data Migration Tool helps transfer existing Magento 1.x store data to Magento 2.x. This command-line interface includes verification, progress tracking, logging, and testing functions. For installation instructions, see [Install the Data Migration Tool]({{page.baseurl}}/migration/migration-tool-install.html). Consider exploring or contributing to the [Magento Data Migration repository](https://github.com/magento/data-migration-tool). + +The [Code Migration Toolkit](https://github.com/magento/code-migration) helps transfer existing Magento 1.x store extensions and customizations to Magento 2.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts. diff --git a/src/guides/v2.3/release-notes/open-source-2-3-6.md b/src/guides/v2.3/release-notes/open-source-2-3-6.md new file mode 100644 index 00000000000..d942f350ce3 --- /dev/null +++ b/src/guides/v2.3/release-notes/open-source-2-3-6.md @@ -0,0 +1,702 @@ +--- +group: release-notes +title: Magento Open Source 2.3.6 Release Notes +--- + +Magento Open Source 2.3.6 offers significant platform upgrades, substantial security changes, and performance improvements. + +This release includes over 160 functional fixes to the core product and over 15 security enhancements + +{:.bs-callout-info} + +Quarterly releases may contain backward-incompatible changes (BIC). Magento 2.3.6 contains minor backward-incompatible changes. To review minor backward-incompatible changes, see [BIC reference]({{page.baseurl}}/release-notes/backward-incompatible-changes/reference.html). (Major backward-incompatible issues are described in [BIC highlights]({{page.baseurl}}/release-notes/backward-incompatible-changes/index.html). Not all releases introduce major BICs.) + +We are adding support for PHP 7.4.x in Magento 2.3.7, which is scheduled for release in Q2 2021. This support will introduce breaking changes to Magento 2.3.x deployments. How will this affect your store? See the [PHP 7.4 support for Magento 2.3.x release line](https://community.magento.com/t5/Magento-DevBlog/PHP-7-4-support-for-Magento-2-3-x-release-line/ba-p/458946) DevBlog post. + +## Highlights + +Look for the following highlights in this release: + +### Substantial security enhancements + +This release includes the following security enhancements: + +#### Over 15 security enhancements that help close remote code execution (RCE) and cross-site scripting (XSS) vulnerabilities + +No confirmed attacks related to these issues have occurred to date. However, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. Most of these issues require that an attacker first obtains access to the Admin. As a result, we remind you to take all necessary steps to protect your Admin, including but not limited to these efforts: IP allowlisting, [two-factor authentication]({{page.baseurl}}/security/two-factor-authentication.html), use of a VPN, the use of a unique location rather than `/admin`, and good password hygiene. See [Security Updates Available for Magento](https://helpx.adobe.com/security/products/magento/apsb20-59.html) for a discussion of these fixed issues. + +#### Security enhancements and fixes to core code + +This release includes over 15 security fixes and platform security improvements. Additional security enhancements include: + +**CAPTCHA** protection has been added to the following product areas: + +* Place Order storefront page and REST and GraphQL endpoints +* Payment-related REST and GraphQL endpoints. + + CAPTCHA protection for these additional pages is disabled by default. It can be enabled on the Admin in the same way that other pages covered by CAPTCHA are. This protection has been added as an anti-brute force mechanism to protect stores against carding attacks. See [CAPTCHA](https://docs.magento.com/user-guide/stores/security-captcha.html). + +{:.bs-callout-info} +Starting with the release of Magento Commerce 2.3.2, Magento will assign and publish indexed Common Vulnerabilities and Exposures (CVE) numbers with each security bug reported to us by external parties. This allows users of Magento Commerce to more easily identify unaddressed vulnerabilities in their deployment. + +## Fixed issues + +We have fixed hundreds of issues in the Magento 2.3.6 core code. + +### Installation, upgrade, deployment + + + +* Magento now displays an informative error message when some themes are not deployed after running `setup:static-content:deploy`. Previously, when deployment completed successfully but not all packages were deployed, Magento did not display an error. When the `setup:static-content:deploy` command is executed with enabled parallel processing and each theme requires more time to be deployed then the specified maximum execution time, this command can finish successfully, although themes are not deployed. + + + +* The **Use default** checkbox for Klarna payments (**Stores** > **Configuration** > **Sales** > **Payment methods** > **Klarna**) now remain checked as expected when website scope changes. + + + +* Upgrade no longer results in the sudden failure of the Galera cluster. Previously, the Galera cluster exited abruptly after re-indexing immediately after upgrade. During Magento upgrade, index tables are altered and the engine is changed from MEMORY to InnoDB. At this point, the content of these tables becomes out-of-sync between the nodes of the Galera cluster. [GitHub-25334](https://github.com/magento/magento2/issues/25334) + + + +* `bin/magento setup:di:compile` no longer throws a fatal error. Previously, Magento threw an error the first time you ran this command, but the second execution resulted in successful compilation. + +### Amazon Pay + +* Clicking **Return to standard checkout** just before completing checkout with Amazon Pay now returns the shopper to the checkout page that displays all payment methods available the shopper. Previously, no payment methods were displayed. + +### Analytics + + + +* CSV files that are generated by `analytics_collect_data` are now properly escaped. Previously, these files were not generated with the correct escaping, which prevented the generation of Inventory reports. + + + +* Magento successfully generates advance reporting data files and sends them as expected to Inventory on deployments with split databases. Previously, Magento did not generate or send the `quotes.csv` file to Inventory, and as a result, Inventory did not generate the expected reports. + +### Backend + + + +* The Products in the Comparison List and the Recently Compared Products features now work as expected. Previously, when the comparison list was expanded, Magento did not display products, even though the section indicated that the list contained products. + +### Bundle products + + + +* Re-importing bundle products now works as expected. Previously, the second import did not change the `catalog_product_relation` table, and the storefront did not display the bundled products because parent-child product relations were not generated correctly. + + + +* Magento no longer sets prices for fixed-price bundle product child items in quotes. + +### Cache + + + +* `X-Magento-Tags` headers no longer exceed the size permitted by the HTTP specification. Previously, category pages that contain many products return an `X-Magento-Tag` header that resulted in a 503 error. + +### Cart and checkout + + + +* The **State/Province/Region** input box is now enabled as expected on **My account** > **Address Book** > **Add new address**. + + + +* Custom address attributes are now included as expected in the form that is displayed for the Payment step of the checkout workflow. + + + +* The shipping method estimator now works as expected when custom address attributes are present on the shipping step of the checkout workflow. Previously, Magento displayed this error message:`{"message":"Error occurred during \"custom_attributes\" processing. A custom attribute is specified with a missing attribute code. Verify the code and try again."}` [GitHub-27505](https://github.com/magento/magento2/issues/27505) + + + +* Custom customer address attributes fields are now displayed as expected in the storefront checkout workflow. + + + +* Shoppers can now purchase a virtual gift card using PayPal Braintree without defining a shipment address. Previously, Magento threw an error. + + + +* Magento now displays the waiting/spinning icon while prices are updated on the cart. + + + +* Merchants can now enable **Apply to Shipping Amount** in the Action tab of **Marketing** > **Cart Price Rules** > **Add New Rule** when **Fixed amount discount for whole cart** is applied. [GitHub-24422](https://github.com/magento/magento2/issues/24422) + +### Catalog + + + +* Merchants with multiple websites can now use `POST /V1/products` to create and update products while preserving image and image-role inheritance. Previously, when a merchant used the REST API to create and update products, and a product was updated for store view, the default image roles were loaded and saved for that store view. As a result, the store-view image roles stopped inheriting from the default scope after update. + + + +* Magento now successfully updates attributes labeled `Product Type`. Previously, because the `product_type` attribute is reserved in Magento core code, Magento displayed this message when you tried to update it: `An attribute with the same code (product_type) already exists.` + + + +* Problems with product sort order on the storefront have been resolved. Previously, when Magento indexed product prices, it occasionally set a configurable product’s `min_price` and `max_price` to 0 in the `catalog_product_index_price` table, which affected price sort order on the storefront. + + + +* Shoppers can now re-order an invoiced order of a product with customizable options as expected. Previously, Magento threw this error when a shopper tried to re-order: `{"0":"The product's required option(s) weren't entered. Make sure the options are entered and try again`. + + + +* Magento now displays all re-enabled products in the storefront as expected. Previously, when a product was disabled and then re-enabled, Magento did not display the product until the Varnish page cache was cleared or the store re-indexed because the page cache was not invalidated after re-enabling a product. + + + +* Magento now displays the Recently Compared Products widget only after at least one product has been deleted from a product comparison. Previously, this widget was displayed immediately after a shopper added a product for comparison. + + + +* You can now successfully save an image to a category from the Admin. Previously, after you saved the image, part of the URL was missing, and you could not re-open the image. + + + +* The **Product in Websites** checkbox of the new product page is now enabled by default for restricted administrative users in multi-site deployments. Previously, the checkbox for the non-default website was not preselected, and if the administrator left the checkbox unselected, Magento displayed an error message. + + + +* The **Price** condition in Page Builder now works as expected for configurable products. + + + +* Saving a category now flushes only the block cache that is related to this category. Previously, Magento flushed cache for all category blocks. + + + +* Magento now correctly represents Arabic thousands grouping and Arabic decimal separator symbols. Previously, Arabic symbols were trimmed. [GitHub-26676](https://github.com/magento/magento2/issues/26676) + + + +* Consecutive asynchronous price updates no longer interfere with each other and correct status is assigned to each operation. Previously, if an asynchronous price update failed, all subsequent asynchronous price updates will fail until the corresponding queue consumer is restarted. + + + +* Changes introduced by an earlier bug fix that resulted in HTML errors on the product list page have been reverted. + +### Catalog Rule + + + +* Product and catalog caches now expire as scheduled. Previously, caches expired daily because `сron` ran the `catalogrule_apply_all` task once daily, which re-indexed all catalog rules and dependent indexers, and cleared the cache for all products and categories. + +### CMS content + + + +* Magento now throws an error when a merchant creates a CMS page with the same URL as the Company Structure page. Previously, Magento displayed the CMS page instead of the Company Structure page. + +### Configurable products + + + +* Admin users accounts created from an admin account with a restricted scope can now create a configurable product with attributes as expected. Previously, Magento threw this error: `Notice: Undefined index: value_index in 23develop/app/code/Magento/ConfigurableProduct/Helper/Product/Options/Factory.php on line 101`. + + + +* Magento no longer links a simple product to a configurable product when the API call to link these products fails. + + + +* Pagination problems with the Configurable Product Edit Current Variations list have been corrected. + +### Customer + + + +* The **State/Province** fields are now populated as expected on the Edit Address page (**My Account** > **Address book**). + + + +* Customer group is no longer automatically changed for a customer who is assigned to a Company when you edit the customer on the Customer grid. + + + +* Magento no longer resets a customer’s customer group to the default when a customer saves their account information. + + + +* Saving a deleted customer from the Admin now generates an error message only. Previously, Magento displayed a blank page and generated a report that contained this string: `"0":"No such entity with customerId = 3","1":"#1 Magento\\Customer\\Model CustomerRegistry->retrieve() called at [app\/code\/Magento\/Customer\/Model\/ResourceModel\/CustomerRepository.php:340"`. + + + +* Magento now honors customer group settings when you create a new customer from the Admin in a multi-site deployment. + + + +* The validation logic associated with the **Date of Birth** field of the Customer Registration form no longer triggers a JavaScript error. + + + +* The Admin view of a customer cart now displays all the products that were added to the cart from multiple websites in a multi-website deployment. Previously, when a customer added a product to their cart from a non-default website, the product was not displayed in the Admin even when **Share customer account** was set to **Global**. + + + +* The **Invalid Form Key. Please refresh the page** text string on the login page is now translated as expected. + + + +* Magento now displays the **Credit memo** button after the partial refund of an order. Previously, Magento did not display this button after you created a partial refund, and you could not create a credit memo for the rest of the order. + + + +* The shopping cart that is accessed from the Admin customer details page now includes only products from the selected customer’s quote. Previously, this cart listed all items in the `quote_item` table. + + + +* Customer creation from the Admin now honors the default customer group setting as expected. + + + +* The `PHPSessionId` is now changed as expected after a customer logs out and then logs back in. + + + +* Data scripts are no longer re-run whenever you attempt to upgrade the database by running `bin/magento setup:upgrade`. Previously, upgrade scripts were re-run unnecessarily, which affected performance. [GitHub-19469](https://github.com/magento/magento2/issues/19469) + +### Directory + + + +* The Default State dropdown menu is now populated by data that is based on the allowed countries that have been assigned to the selected website when you configure a value for the **Default Tax Destination Calculation** field. Previously, this dropdown listed the countries that were assigned to the default website. + + + +* The format of the State/Province drop-down menu is now consistent across the Admin. + +### dotdigital + +* dotdigital now has a Content Security Policy whitelist for specific domains used by this module. + +* Contacts are no longer resubscribed when their `last_subscribed_at` value is `null`. + +* Deletion of automation enrollments and abandoned carts from their respective report grids now works as expected. + +* Handling of the API response dotdigital receives when processing resubscribes has been improved. + +* dotdigital now catches exceptions that are thrown by `unserialize()` to protect against unserializable data being stored for custom attributes. + +### Downloadable + + + +* Clicking on a downloadable product's **Sample** button from the Admin product page now downloads a sample as expected. Previously, when you clicked **Sample**, Magento displayed this error: `The product that was requested doesn't exist. Verify the product and try again`. + + + +* You can now use an import file to update downloadable products in bulk by SKU and description. Previously, validation errors occurred, and import failed. + + + +* Administrators with restricted permissions to Catalog can now create a downloadable product. Previously, these administrators could not create a downloadable product, and Magento threw an error. + +### Email + + + +* Customers are no longer redirected away from the current website when they report a forgotten password in multi-site deployments where customer accounts are shared globally. Previously, customers were redirected to the website on which the account was created. + + + +* Order confirmation emails sent to customers now include the list of ordered items as expected. Previously, when you created an email template in the Admin by loading and saving the default template, emails generated from this template did not include the list of ordered items. [GitHub-26882](https://github.com/magento/magento2/issues/26882) + +### Frameworks + + + +* `sales_order_shipment_track_save_commit_after` is now triggered as expected when you use the REST API to create a shipment. + + + +* We have improved the performance of the `Magento\Framework\App\DeploymentConfig\Reader::load` function. Previously, when a request was made to Magento, this function was called repetitively, which resulted in `config.php` and `env.php config` files being loaded each time the method was called. + + + +* Magento no longer throws the following fatal error when Redis uses all allowed memory: `report.CRITICAL: OOM command not allowed when used memory > 'maxmemory'.` + +### General fixes + + + +* An expired persistent session is now renewed as expected when the shopper logs back in. + + + +* Merchants can now unassign products from categories as expected. Previously, Magento threw an error similar to this error: `Could not save product "4" with position 0 to category 3`. + + + +* MAP (minimum advertised price ) now works as expected for group products. + + + +* New CMS pages are now added as expected to a website’s store page hierarchy. + + + +* Magento no longer throws an exception when a shopper tries to unset the persistence cookie after beginning checkout and then navigating to the storefront home page. Previously, when the shopper clicked the **Not you?** link on the home page, Magento threw this exception: `The shipping address is missing. Set the address and try again`. [GitHub-24218](https://github.com/magento/magento2/issues/24218) + + + +* You can now use the `PUT /V1/products/:sku` endpoint to update links to YouTube videos. Previously, Magento displayed a thumbnail for the video, but the video player did not load when you clicked the **Play** button. [GitHub-23194](https://github.com/magento/magento2/issues/23194) + + + +* You can now use `app/etc/env.php` to change the message broker from MYSQL to AMQP. + +### GroupedProducts + + + +* Merchants can now successfully send email to a shopper that contains a credit memo for an order that includes a grouped product. Previously, Magento threw a fatal error when the merchant clicked **Send Email**. [GitHub-25617](https://github.com/magento/magento2/issues/25617) + + + +* The products query now returns all expected data for grouped products. Previously, `product_links` was an empty array. + +### Image + + + +* Magento now displays PNG images as expected after upload. + +### Import/export + + + +* When an imported product has `qty` set to 0 but `is_in_stock set` to 1 in the CSV file, the product is not listed on the category page, and the product details page lists it as out-of-stock. Previously, products with these values were visible on the storefront after import. + + + +* The `error_report.csv` file now downloads with content and is available inside the `var/import_history/` directory as expected. Previously, this file was not generated after import. + + + +* You can now hide product images on the storefront during import. + + + +* Imported CSV files now capture related product information as expected. Previously, related product information was not consistently uploaded the first time the CSV file was imported. + + + +* Magento now successfully imports customer addresses that contains a region for a country that does not have defined regions. Previously, Magento threw this error: `Please enter a valid region`. + + + +* Magento now displays the customer list as expected after automatic re-indexing. Previously, although manually running `bin/magento index:reindex` worked, the customer grid did not display customer information after automatic re-indexing. + + + +* Magento no longer creates duplicate SKUs in the Admin when products are imported by CSV file. + + + +* Magento no longer throws an error during import when imported data includes a `swatch_image` store-view key has a value of `no_selection`. Previously, Magento threw this error: `Imported resource (image) could not be downloaded from external resource due to timeout or access permissions in row(s): 1`. [GitHub-25026](https://github.com/magento/magento2/issues/25026) + + + +* Deadlocks no longer occur when the import process executes a bulk insert and the re-index process simultaneously executes a large insert from select. Previously, Magento displayed this error: `PDOException: SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock`. [GitHub-8933](https://github.com/magento/magento2/issues/8933) + + + +* Customer address `region_id` is no longer assigned a `NULL` value when you import customer addresses using a CSV file (`entity type = "customer address"` and `import behavior = "add/update”`) from which certain field values have been deleted. + +### Klarna + +* Magento now correctly refunds a Klarna order when the order contains a product that has been deleted. Previously, Magento threw a fatal error. + +* Default configuration settings for Klarna remain set as expected when you change the configuration scope to a different website. Previously, changing scope resulted in clearing all Klarna settings. + +* The checkout page now opens as expected when a shopper’s cart contains a downloadable product. Previously, the checkout page was blank. + +* Fraud notification messages have been improved. + +### Media storage + + + +* `var/resource_config.json` is no longer regenerated whenever an image is requested by `get.php`. Previously, this file was rewritten on each call to `get.php`. + +### Newsletter + + + +* Exporting the Newsletter Subscribers list using the `Excel XML` option now results in the export of all rows as expected. Previously, exported data included only the page pagination value, not all rows. + + + +* Magento no longer throws an error when a user subscribes to a newsletter and reCAPTCHA for the newsletter is disabled for the website scope. Previously, when **Use invisible ReCaptcha in newsletter** was set to the default (**yes**) in the default configuration scope but set to **no** in the Main Website scope, the storefront subscription attempt failed, and Magento displayed this error: `Incorrect ReCaptcha validation`. + + + +* Shoppers subscribing to a newsletter now receive only an email confirming their subscription. Previously, shoppers received two emails: a subscription confirmation and an unsubscribed notification. + +### Payment methods + + + +* Registered shoppers can now checkout successfully when their only defined payment method is Braintree. Previously, the **Place Order** button remained disabled after the shopper entered the correct credit card details unless the shopper had unchecked the **My billing and shipping address are the same** checkbox. + + + +* Magento now completes Payflow Pro payments successfully when the shopper’s name contains accented letters. Previously, payment did not complete, and Magento logged this error: `report.CRITICAL: String to be escaped was not valid UTF-8 or could not be converted:`. + + + +* Magento no longer saves credit card numbers when the **Save for later use** checkbox on the payment section of the checkout workflow is not selected. + + + +* Magento now displays a message that prompts you to enter mandatory credit card data when you click **Submit** for an Admin order without entering valid payment information. Previously, the Braintree card validator did not throw an error when payment input fields were invalid, and the page became inactive. + + + +* A shopper whose address book contains multiple addresses can now change shipping addresses during checkout when paying with Braintree. Previously, Magento displayed JavaScript code in the address field when the shopper selected a different address from the drop-down menu on the checkout workflow. + + + +* You can now successfully use PayPal Express to pay for an order when persistent checkout cart is enabled and the **Clear Persistence on Sign Out** setting is set to **no**. Previously, Magento redirected you to the Login page. + +### Product alert + + + +* Unsubscribe actions for product alerts now work as expected. Previously, when a customer clicked on the **Click here to stop alerts for this product** link, Magento displayed a 404 error. + + + +* Product stock alert unsubscribe now works when a user’s session expired. Previously, when you clicked on the **Click here to stop alerts for this product** link, Magento displayed a 404 error. + +### Reviews + + + +* Magento no longer returns a 500 error when you try to open a Category page on the storefront when **Layout = Product – Full Width** has been set from the Design tab of the Category page. + +### Sales + + + +* Order update emails that are sent to customers now include the correct order status. Previously, if an order status changed from `processing` to another state, the order email did not reflect the status change. + + + +* The New Shipment email generated by `POST /V1/order/:orderId/ship` now contains the same shipping and customer information as shipments that are created manually from the Admin. Previously, this email did not contain the customer name, tracking information, products ordered, and other order information. + + + +* Magento no longer assigns a status of `Complete` after invoicing an order that requires zero payment. + + + +* Localized region names that are displayed on the storefront Order page are now correctly translated. Previously, the region name was not based on the specified locale unless it was edited in the Admin. + + + +* Email sent to customers that contain partial invoices now includes accurate item subtotals. Previously, the subtotal in this email contained was the total of the ordered quantity, not the total amount of the invoiced quantity. + + + +* `sales_clean_quotes` now efficiently deletes all expired quotes. Previously, `sales_clean_quotes` jobs did not complete due to memory issues, and Magento threw a fatal error. + + + +* Magento now assigns the correct Group ID when a new customer creates an order in multi-site deployments. Previously, Magento applied the settings from the default customer group. + + + +* Administrators with restricted permissions that include view permission for credit memos, invoices, and shipments can now view invoices and shipments from the Orders page as expected. Previously, when a restricted administrator tried to view an order, Magento displayed this error: `Something went wrong with processing the default view and we have restored the filter to its original state`. + + + +* Magento no longer displays an error when a customer adds a quantity of a product to their cart that exceeds half of the existing product stock but does not exceed the total stock. Previously, under these circumstances, Magento displayed this error: `The requested qty is not available`. [GitHub-24365](https://github.com/magento/magento2/issues/24365) + +### Sales Rule + + + +* Coupon codes that have been applied based on shipping method are no longer applied when a shopper changes shipping method. Previously, Magento did not clear coupon codes when shoppers switched shipping methods. + + + +* Coupon discounts are now calculated correctly when you add a bundle product to the cart after the coupon was applied. Previously, it was incorrectly calculated. + + + +* Shoppers cannot apply a coupon code more frequently than the **Uses Per Customer** setting permits. Previously, if a shopper had multiple browser windows open and placed multiple orders concurrently, each order received the discount, even though the **Uses Per Customer** setting had a value of **1**. + + + +* The order summary now displays the correct discount amount when a cart price rule has been applied. Previously, the rule did not correctly round amounts when calculating shipping discounts. + + + +* Magento now displays category trees as expected when you try to create or edit a Cart Price rule. Previously, selecting a category in the Condition section while creating or editing a rule resulted in JavaScript errors. + + + +* Magento now applies fixed-amount, whole-cart discounts correctly for orders being shipped to multiple addresses. Previously, this type of discount was applied multiple times when a customer checked out an order using Check Out with Multiple Addresses. [GitHub-25834](https://github.com/magento/magento2/issues/25834) + +### Search + + + +* Elasticsearch results now include the correct values for each store view’s attribute options. If a Dropdown or Multiple Select attribute has a different option value in the non-default store view than in the default store view, Elasticsearch now indexes that value or returns the product with that value in the results. Previously, Elasticsearch did not index that value or return the product with that value in the results. + + + +* Price sorting now works correctly for out-of-stock configurable products. + + + +* The performance of catalog search has improved. Disabling **Enable Search Suggestions** (**Stores** > **Configuration** > **Catalog** > **Catalog Search**) works as expected. Previously, Magento queried the MySQL search_query table instead of Elasticsearch for autocomplete search suggestions. [GitHub-25534](https://github.com/magento/magento2/issues/25534) + +### Sitemap + + + +* The sitemap generation process now uses custom URL rewrites as expected. Previously, the generated `sitemap.xml` did not include custom URLs. + + + +* Encoded values are now correctly escaped in `sitemap.xml`. Previously, when you included encoded characters in a product name or image title, the generated sitemap was invalid. + +### Store + + + +* The store-view switcher now works correctly when the store views have different base URLs. Users are now redirected to the corresponding page, category, or product page on the new store view. + + + +* You can now export `config.php` and default website code from one website to install and configure Magento on a second website in a multi-website deployment. Previously, the default store and view disappeared after the export, and errors occurred on the storefront. + + + +* Magento installation now completes successfully, and stores are created as expected, when store configuration is pre-defined in `config.php`. + +### Swatches + + + +* You can now use `POST /V1/products/attributes` to add a `text_swatch` type of product attribute. Previously, Magento did not add the option to the attribute and displayed an error. + +### Target Rule + + + +* Loading of product details pages has been optimized. Indices for database tables that optimize target rule conditions queries for many cases have been added. + +### Theme + + + +* Shoppers can now successfully change the number of orders per page in the order history multiple times. Previously, when a shopper changed this value more than once, Magento rendered the results page as expected for only the first value entered. + + + +* Themes that are added in User Agent Rules are now affected as expected when you run `bin/magento catalog:images:resize`. Previously, only themes that were assigned to stores were affected when `bin/magento catalog:images:resize` was run. + +### Translation and locales + + + +* Inline translation now works as expected on the storefront when Admin **Stores** > **Configuration** > **Advanced** > **Developer** > **Translate Inline** > **Enabled for Storefront** is set. + +### UI + + + +* Magento now preserves an attribute’s value when you move the attribute from one group to another. + +### URL rewrites + + + +* Moving a store view to a different website no longer resets URLs. Previously, Magento incorrectly regenerated CMS and product URL rewrites. + + + +* Magento no longer changes a product’s URL in all stores when a merchant changes a product URL for one store in a multi-site deployment. Previously, if a merchant changed a URL key for one store view, Magento changed the URL for all stores. + +### Vertex + +* Taxes are now calculated as expected on orders that contain both physical and virtual products. + +* Vertex now processes products with a price of 0 as expected. Previously, administrators could not create an order with a total of 0. + +* The checkout process now successfully progresses from shipping to payment when using Internet Explorer 11.x with Vertex. Previously, Magento threw a JavaScript error when the shopper tried to proceed from shipping to payment. + +* The process of submitting an invoice to Vertex has been been optimized, and performance has improved. + +* Tax details are now included as expected in the database. + +* Log rotation now works as expected in production mode. + +* Vertex now calculates taxes correctly when a default ZIP code is provided for tax calculation. + +* Updating the billing address with Vertex's recommendation no longer updates the fields on the shipping address. + +### Visual Merchandiser + + + +* You can now add products to a category when implementing Level 2 cache. + +### Web API framework + + + +* Invoices created using the REST API now include gift card information similar to the invoices that are created in the Admin. Previously, using POST `/V1/order/:id/invoice` to invoice the order did not display the gift card code or gift card amount applied. + + + +* The `default_sort_by` attribute now takes `String` instead of `String[]`. + + + +* You can now use POST `http:///rest/V1/categories/` to create or update a category. Previously, Magento did not save the value if the `default_sort_by` value was set as an array. When the `default_sort_by` value was set as a string, Magento threw this error: `Error occurred during \"custom_attributes\" processing. Attribute \"default_sort_by\" has invalid value. The \"string\" value's type is invalid. The \"string[]\" type was expected. Verify and try again.` + + + +* Bulk order updates using `PUT /async/bulk/V1/orders/:id` now update the order status as expected. Previously, Magento threw this error: `report.ERROR: Property "AdditionalInformation" does not have accessor method "setAdditionalInformation" in class "Magento\Sales\Api\Data\OrderPaymentInterface".` + +### Wishlist + + + +* Administrators can now configure a configurable product that has been added by a customer to a wishlist from a non-default store. Previously, when the customer had also added the configurable product from a non-default store, Magento threw an error. + + + +* The **Add to cart** button on the shared wishlist page now works as expected for anonymous, guest, and users who are not logged in. + +## Known issues + +**Issue**: The new CAPTCHA feature for checkout does not work as expected on the Place Order page when using third-party payment providers. Merchants running Magento 2.3.6 or 2.4.1 who have enabled CAPTCHA protection on the Place Order storefront page will see this error when checking out using a third-party payment provider such as PayPal: `Please provide CAPTCHA code and try again`. A fix for this issue be available in the next few weeks, and will be included in our next quarterly patch (Q12021). Please contact Support for additional information. + +**Issue**: Merchants upgrading their stores from 2.3.5-p2 to 2.3.6 will note that two module versions downgrade. These messages reflect the incomplete delivery of two security fixes to the 2.3.x quarterly patches. These fixes for low severity issues are included in Magento 2.3.5-p2, 2.4.1, and 2.4.0-p1 but are missing from Magento 2.3.6. No hot fixes will be provided. These fixes will be merged along with the other security fixes in Magento 2.3.6-p1, which is scheduled for Q12021. + +**Issue**: Merchants cannot log in to dotdigital from the Admin when dotdigital is enabled. See the [It's impossible to login in the dotdigital via admin panel when dotdigital account is enabled](https://support.magento.com/hc/en-us/articles/360050092291) Knowledge Base article. + +### System requirements + +Our technology stack is built on PHP and MySQL. For more information, see [System Requirements]({{site.baseurl}}/system-requirements.html). + +### Installation and upgrade instructions + +You can install {{site.data.var.ce}} 2.3.6 using Composer. + +## Migration toolkits + +The Data Migration Tool helps transfer existing Magento 1.x store data to Magento 2.x. This command-line interface includes verification, progress tracking, logging, and testing functions. For installation instructions, see [Install the Data Migration Tool]({{page.baseurl}}/migration/migration-tool-install.html). Consider exploring or contributing to the [Magento Data Migration repository](https://github.com/magento/data-migration-tool). + +The [Code Migration Toolkit](https://github.com/magento/code-migration) helps transfer existing Magento 1.x store extensions and customizations to Magento 2.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts. diff --git a/src/guides/v2.3/rest/protected-endpoints.md b/src/guides/v2.3/rest/protected-endpoints.md new file mode 100644 index 00000000000..5f7154d1f47 --- /dev/null +++ b/src/guides/v2.3/rest/protected-endpoints.md @@ -0,0 +1,30 @@ +--- +group: rest-api +title: Protected endpoints +functional_areas: + - Integration +--- + +If CAPTCHA is enabled on pages requiring shopper input, then in most cases, the corresponding REST endpoints that send requests to the Magento server must include the shopper's CAPTCHA response. Supply the shopper's response in the HTTP `X-Captcha` header. The exception to this policy is that you do not send the CAPTCHA response if you specify an integration authorization token in the header of the REST endpoint. + +The following table lists the forms that can be configured to require CAPTCHA. Go to **Stores** > **Configuration** > **Customers** > **Customer Configuration** > **CAPTCHA** > **Forms** to enable or disable CAPTCHA on these forms. + +Form name | REST endpoint +--- | --- +Add Gift Card Code | `POST /V1/carts/mine/giftCards`
`POST /V1/carts/guest-carts/:cartId/giftCards` +Applying Coupon Code | `PUT /V1/carts/:cartId/coupons/:couponCode`
`PUT /V1/guest-carts/:cartId/coupons/:couponCode` +Change password | `PUT /V1/customers/me/password` +Checkout/Placing Order | `POST /V1/carts/mine/payment-information`
`POST /V1/carts/mine/set-payment-information`
`POST /V1/guest-carts/:cartId/payment-information`
`POST /V1/guest-carts/:cartId/set-payment-information` +Contact Us | Not applicable +Create company | `POST /V1/company` +Create user | `POST /V1/customers` +Forgot password | `POST /V1/customers/resetPassword`
`PUT /V1/customers/password` +Login | `POST /V1/integration/customer/token` +Payflow Pro | Not applicable +Send to Friend Form | Not applicable +Share Wishlist Form | Not applicable + +{:.ref-header} +Related topics + +[Construct a request]({{page.baseurl}}/get-started/gs-web-api-request.html diff --git a/src/guides/v2.4/comp-mgr/cli/cli-upgrade.md b/src/guides/v2.4/comp-mgr/cli/cli-upgrade.md index 0d2323ad704..6faa476fca2 100644 --- a/src/guides/v2.4/comp-mgr/cli/cli-upgrade.md +++ b/src/guides/v2.4/comp-mgr/cli/cli-upgrade.md @@ -148,16 +148,6 @@ composer require magento/product-community-edition=2.3.3-p1 --no-update composer update ``` -1. Clean the Magento cache. - - ```bash - bin/magento cache:clean - ``` - -## Clean up - -Manually clear caches and generated content. - 1. Clear the `var/` and `generated/` subdirectories: ```bash diff --git a/src/guides/v2.4/extension-dev-guide/build/module-file-structure.md b/src/guides/v2.4/extension-dev-guide/build/module-file-structure.md deleted file mode 120000 index 2429aa03f67..00000000000 --- a/src/guides/v2.4/extension-dev-guide/build/module-file-structure.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/extension-dev-guide/build/module-file-structure.md \ No newline at end of file diff --git a/src/guides/v2.4/extension-dev-guide/build/module-file-structure.md b/src/guides/v2.4/extension-dev-guide/build/module-file-structure.md new file mode 100644 index 00000000000..220e575ddeb --- /dev/null +++ b/src/guides/v2.4/extension-dev-guide/build/module-file-structure.md @@ -0,0 +1,105 @@ +--- +group: php-developer-guide +subgroup: 03_Build +title: Create your component file structure +--- + +In this section, we go over the different file structures for the component types. The Magento application looks for the files that make up a component *including configuration files* in particular places inside the component file structure. Follow the predefined file structures for the component type you are developing to ensure that it works as expected. + +{% include php-dev/component-root-2.3.md %} + +### Module file structure + +A typical file structure for a Magento 2 [module](https://glossary.magento.com/module) can look like the following: + +![Module File Structure](../images/pdg-config-file-structure.png){:width="300px"} + +#### Common directories +{:.no_toc} +Following are some common module directories: + +* `Block`: contains [PHP](https://glossary.magento.com/php) view classes as part of Model View Controller(MVC) vertical implementation of module logic. +* `Controller`: contains PHP controller classes as part of MVC vertical implementation of module logic. +* `etc`: contains configuration files; in particular, `module.xml`, which is required. +* `Model`: contains PHP model classes as part of MVC vertical implementation of module logic. +* `Setup`: contains classes for module database structure and data setup which are invoked when installing or upgrading. +* `ViewModel`: contains PHP model classes as part of a model-view-viewmodel (MVVM) implementation. It allows developers to offload features and business logic from block classes into separate classes that are easier to maintain, test, and reuse. + +#### Additional directories +{:.no_toc} +Additional folders can be added for configuration and other ancillary functions for items like [plugin-ins]({{ page.baseurl }}/extension-dev-guide/plugins.html), localization, and [layout](https://glossary.magento.com/layout) files. + +* `Api`: contains any PHP classes exposed to the [API](https://glossary.magento.com/api). +* `Console`: contains CLI commands. For more info, see [Add CLI commands]({{ page.baseurl }}/extension-dev-guide/cli-cmds/cli-add.html). +* `Cron`: contains cron job definitions. +* `CustomerData`: contains section files. +* `Helper`: contains aggregated functionality. +* `i18n`: contains localization files. +* `Observer`: contains files for executing commands from the listener. +* `Plugin`: contains any needed [plug-ins]({{ page.baseurl }}/extension-dev-guide/plugins.html). +* `UI`: contains data generation files. +* `view`: contains view files, including static view files, design templates, email templates, and layout files. + +### Theme file structure + +A typical [theme](https://glossary.magento.com/theme) file structure can look like the following: + +```tree +├── composer.json +├── etc +│   └── view.xml +├── i18n +│   └── en_US.csv +├── LICENSE_AFL.txt +├── LICENSE.txt +├── media +│   └── preview.jpg +├── registration.php +└── web + ├── css + │   ├── email.less + │   ├── print.less + │   ├── source + │   │   ├── _actions-toolbar.less + │   │   ├── _breadcrumbs.less + │   │   ├── _buttons.less + │   │   ├── components + │   │   │   └── _modals_extend.less + │   │   ├── _icons.less + │   │   ├── _layout.less + │   │   ├── _theme.less + │   │   ├── _tooltips.less + │   │   ├── _typography.less + │   │   └── _variables.less + │   ├── _styles.less + │   ├── styles-l.less + │   └── styles-m.less + ├── images + │   └── logo.svg + └── js + ├── navigation-menu.js + └── theme.js +``` + +#### Common directories +{:.no_toc} +Typical theme directories are: + +* `etc`: Contains configuration files such as the `view.xml` file which contains image configurations for all images and thumbnails. +* `i18n`: [Translation dictionaries]({{ page.baseurl }}/frontend-dev-guide/translations/xlate.html#m2devgde-xlate-dictionaries), if any. +* `media`: Theme preview images (screen capture of your theme) can be put in here. +* `web`: Optional directory that contains [static files](https://glossary.magento.com/static-files) organized into the following subdirectories: + + * `css/source`: Contains a theme's `less` configuration files that invoke mixins for global elements from the [Magento UI library]({{ page.baseurl }}/frontend-dev-guide/css-topics/theme-ui-lib.html), and the `theme.less` file that overrides the default variables values. + * `css/source/lib`: Contains view files that override the [UI library]({{ page.baseurl }}/frontend-dev-guide/css-topics/theme-ui-lib.html) files stored in `lib/web/css/source/lib`. + * `fonts`: The folder to place the different fonts for your theme. + * `images`: Static images folder. + * `js`: The folder for your JavaScript files. + +For more details on the theme folder structure, see [Magento theme structure]({{ page.baseurl }}/frontend-dev-guide/themes/theme-structure.html). + +{% include php-dev/lang-pack-file-struct.md %} + +**Next:** + +[Register your component]({{ page.baseurl }}/extension-dev-guide/build/component-registration.html) diff --git a/src/guides/v2.4/extension-dev-guide/message-queues/config-mq.md b/src/guides/v2.4/extension-dev-guide/message-queues/config-mq.md deleted file mode 120000 index 13af79f5272..00000000000 --- a/src/guides/v2.4/extension-dev-guide/message-queues/config-mq.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/extension-dev-guide/message-queues/config-mq.md \ No newline at end of file diff --git a/src/guides/v2.4/extension-dev-guide/message-queues/config-mq.md b/src/guides/v2.4/extension-dev-guide/message-queues/config-mq.md new file mode 100644 index 00000000000..3c4d8c0eedb --- /dev/null +++ b/src/guides/v2.4/extension-dev-guide/message-queues/config-mq.md @@ -0,0 +1,284 @@ +--- +group: php-developer-guide +title: Configure message queues +functional_areas: + - Configuration + - System + - Setup +--- + +The message queue topology is a {{site.data.var.ce}} feature. It can be included as part of {{site.data.var.ce}} installation, or you can add it to existing modules. + +### Overview + +Configuring the message queue topology involves creating and modifying the following configuration files in the `/etc` directory: + +* [`communication.xml`](#communicationxml) - Defines aspects of the message queue system that all communication types have in common. +* [`queue_consumer.xml`](#queueconsumerxml) - Defines the relationship between an existing queue and its consumer. +* [`queue_topology.xml`](#queuetopologyxml) - Defines the message routing rules and declares queues and exchanges. +* [`queue_publisher.xml`](#queuepublisherxml) - Defines the exchange where a topic is published. + +### Use Cases + +Depending on your needs, you may only need to create and configure `communication.xml` and one or two of these files. + +* If you only want to publish to an existing queue created by a 3rd party system, you will only need the `queue_publisher.xml` file. +* If you only want to consume from an existing queue, you will only need the `queue_consumer.xml` config file. +* In cases where you want to configure the local queue and publish to it for 3rd party systems to consume, you will need the `queue_publisher.xml` and `queue_topology.xml` files. +* When you want to configure the local queue and consume messages published by 3rd party system, you will need the `queue_topology.xml` and `queue_consumer.xml` files. + +### `communication.xml` {#communicationxml} + +The `/etc/communication.xml` file defines aspects of the message queue system that all communication types have in common. This release supports AMQP and database connections. + +### Sample `communication.xml` file +{:.no_toc} + +The following sample defines two synchronous topics. The first topic is for RPC calls. The second uses a custom service interface. + +```xml + + + + + + + + + +``` + +### topic element +{:.no_toc} +Topic configuration is flexible in that you can switch the transport layer for topics at deployment time. These values can be overwritten in the `env.php` file. + +The `name` parameter is required. The topic definition must include either a `request` or a `schema`. Use `schema` if you want to implement a custom service interface. Otherwise, specify `request`. If `request` is specified, then also specify `response` if the topic is synchronous. + +Parameter | Description +--- | --- +name | A string that uniquely identifies the topic. A topic name should be a series of strings that are separated by periods. The leftmost string should be the most general, and each string afterward should narrow the scope. For example, to describe actions for tending to pets, you might create names such as `cat.white.feed` and `dog.retriever.walk`. Wildcards are not supported in the `communication.xml` file. +request | Specifies the data type of the topic. +response | Specifies the format of the response. This parameter is required if you are defining a synchronous topic. Omit this parameter if you are defining an asynchronous topic. +schema | The interface that describes the structure of the message. The format must be `\Api\::`. + +### handler element +{:.no_toc} +The `handler` element specifies the class where the logic for handling messages exists and the method it executes. + +Parameter | Description +--- | --- +name | A string that uniquely defines the handler. The name can be derived from the topic name if the handler is specific to the topic. If the handler provides more generic capabilities, name the handler so that it describes those capabilities. +type | The class or interface that defines the handler. +method | The method this handler executes. +disabled | Determines whether this handler is disabled. The default value is `false`. + +### `queue_consumer.xml` {#queueconsumerxml} +The `queue_consumer.xml` file contains one or more `consumer` elements: + +#### Example `queue_consumer` file +{:.no_toc} + +```xml + + + + + + + +``` + +#### `consumer` element +{:.no_toc} + +| Attribute | Description | +| ----------------------------- | ----------- | +| name (required) | The name of the consumer. | +| queue (required) | Defines the queue name to send the message to. | +| handler | Specifies the class and method that processes the message. The value must be specified in the format `\Module\::`.| +| consumerInstance | The Magento class name that consumes the message | +| connection | For AMQP connections, the connection name must match the `connection` attribute in the `queue_topology.xml` file. Otherwise, the connection name must be `db`. | +| maxMessages | Specifies the maximum number of messages to consume.| +| maxIdleTime | Defines the maximum waiting time in seconds for a new message from the queue. If no message was handled within this period of time, the consumer exits. Default value: `null`| +| sleep | Specifies time in seconds to sleep before checking if a new message is available in the queue. Default value is `null` which equals to 1 second.| +| onlySpawnWhenMessageAvailable | Boolean value (`1` or `0` only) that identifies whether a consumer should be spawned only if there is available message in the related queue. Default value: `null`| + +{:.bs-callout-info} +The `maxIdleTime` and `sleep` attributes will be handled only by consumers that were fired with a defined `maxMessages` parameter. The `onlySpawnWhenMessageAvailable` attribute is only checked and validated by the `\Magento\MessageQueue\Model\Cron\ConsumersRunner` class that runs consumer processes with cron. + +It is possible to set `onlySpawnWhenMessageAvailable` globally by setting `queue/only_spawn_when_message_available` equal to `0` or `1` in `app/etc/env.php`. By default, the global value of `only_spawn_when_message_available` for all consumers is `1`. +The `onlySpawnWhenMessageAvailable` consumer attribute has higher priority than the global `queue/only_spawn_when_message_available` setting in `app/etc/env.php`. Therefore, it is possible to overwrite the global `only_spawn_when_message_available` value by setting `onlySpawnWhenMessageAvailable` equal to `0` or `1` for each consumer in `queue_consumer.xml`. + +The `onlySpawnWhenMessageAvailable` and `maxIdleTime` attributes may be combined if a specific consumer needs to run infrequently. The consumer will only spawn when it is needed, and it terminates itself if it is inactive for a certain period. +It is also possible to combine the global `queue/only_spawn_when_message_available` setting in `app/etc/env.php` with the `queue/consumers-wait-for-messages` setting. That means that the consumer will run only when there is an available message in the queue, and it will be terminated when there are no more messages to process. This combination of settings is recommended to save server resources such as CPU usage. + +The [`consumers-wait-for-messages`]({{page.baseurl}}/install-gde/install/cli/install-cli-subcommands-consumers.html) option works similar to `onlySpawnWhenMessageAvailable`. When it is set to `false`, the consumer processes all messages and exits if there are no available messages in the queue. +The problem is that every time the cron job `cron_consumers_runner` runs, it spawns a new consumer process, the consumer checks if messages are available, and it terminates itself if there are no messages. +Meanwhile, the `onlySpawnWhenMessageAvailable` attribute first checks if there are available messages, and it spawns a new consumer process only if there are messages. It means that it does not spawn unneeded processes which take up memory, live for a very short period, and then disappear. + +#### Consumer handlers + +A handler is a class and method that processes a message. Magento has two ways to define a handler for messages. + +* In the `` element of the module's `communication.xml` file +* In the `handler` attribute of the module's `queue_consumer.xml` file + +The following conditions determine how these handlers are processed: + +* If the consumer in `queue_consumer.xml` does not have a `consumerInstance` defined, then the system uses the default consumer: `Magento\Framework\MessageQueue\Consumer`. In this case, if the `` element contains the `handler` attribute, then it will be used, and the `` element in `communication.xml` will be ignored. +* If the consumer in `queue_consumer.xml` has a `consumerInstance` defined, then the specific consumer implementation defines how the `handler` is used. + +Magento provides these consumers out-of-the-box: + +| Class name | Handler in `communication.xml` will be executed? | Handler in `queue_consumer.xml` will be executed? | +| ---------------- | ----------- | ---------- | +| `Magento\Framework\MessageQueue\Consumer` | Only if not defined in `queue_consumer.xml` | Yes, if exists | +| `Magento\Framework\MessageQueue\BatchConsumer` | Only if not defined in `queue_consumer.xml` | Yes, if exists | +| `Magento\AsynchronousOperations\Model\MassConsumer` | Yes, if exists | Yes, if exists | + +### `queue_topology.xml` {#queuetopologyxml} + +The `queue_topology.xml` file defines the message routing rules and declares queues and exchanges. It contains the following elements: + +* `exchange` +* `exchange/binding` (optional) +* `exchange/arguments` (optional) +* `exchange/binding/arguments` (optional) + +#### Example `queue_topology.xml` file +{:.no_toc} + +```xml + + + + + + + value + + + + magento-log-exchange + + + + + + magento-log-exchange + + + +``` + +#### `exchange` element +{:.no_toc} + +| Attribute | Description | +| -------------- | ----------- | + name (required) | A unique ID for the exchange. + type (required) | Specifies the type of exchange. Must be `topic`. + connection (required) | For AMQP connections, a string that identifies the connection. For MySQL connections, the connection name must be `db`. + durable | Boolean value indicating whether the exchange is persistent. Non-durable exchanges are purged when the server restarts. The default is `true`. + autoDelete | Boolean value indicating whether the exchange is deleted when all queues have finished using it. The default is `false`. + internal | Boolean value. If set to true, the exchange may not be used directly by publishers, but only when bound to other exchanges. The default is `false`. + +#### `binding` element +{:.no_toc} + +The `binding` element is a subnode of the `exchange` element. + +| Attribute | Description | +| -------------- | ----------- | +| id (required) | A unique ID for this binding. | +| topic (required) | The name of a topic. You can specify an asterisk (*) or pound sign (#) as wildcards. These are described below the table.| +| destinationType (required) | Must be `queue`. | +| destination (required) | Identifies the name of a queue. | +| disabled | Determines whether this binding is disabled. The default value is `false`. | + +Example topic names that include wildcards: + +| Pattern | Description | Example matching topics | Example non-matching topics +| --- | --- | --- | --- +`*.*.*` | Matches any topic that contains exactly two periods. | `mytopic.createOrder.success`, `mytopic.updatePrice.item1` | `mytopic.createOrder`, `mytopic.createOrder.success.true` +`#`| Matches any topic name. | `mytopic`, `mytopic.createOrder.success`, `this.is.a.long.topic.name` | Not applicable +`mytopic.#` | Matches any topic name that begins with `mytopic` and has a period afterward. | `mytopic.success`, `mytopic.createOrder.error` | `new.mytopic.success`, +`*.Order.#` | There must be one string before __.Order__. There can be any number of strings (including 0) after that. | `mytopic.Order`, `mytopic.Order.Create`, `newtopic.Order.delete.success` | + +#### `arguments` element +{:.no_toc} + +The `arguments` element is an optional element that contains one or more `argument` elements. These arguments define key/value pairs that are passed to the broker for processing. + +Each `argument` definition must have the following parameters: + +| Attribute | Description | +| --------------- | ----------- | +| name | The parameter name | +| type | The data type of the value | + +The following illustrates an `arguments` block: + +```xml + + 1 + USPS + +``` + +### `queue_publisher.xml` {#queuepublisherxml} + +The `queue_publisher.xml` file defines which connection and exchange to use to publish messages for a specific topic. It contains the following elements: + +* [publisher](https://glossary.magento.com/publisher-subscriber-pattern) +* publisher/connection + +#### Example `queue_publisher.xml` file +{:.no_toc} + +```xml + + + + + + + + +``` + +#### `publisher` element +{:.no_toc} + +| Attribute | Description | +| -------------------- | ----------- | +| topic (required) | The name of the topic. | +| disabled | Determines whether this queue is disabled. The default value is `false`. | + +#### `connection` element +{:.no_toc} + +The `connection` element is a subnode of the `publisher` element. There must not be more than one enabled active connection to a publisher defined at a time. If you omit the `connection` element, the default connection of `amqp` and exchange `magento` will be used. + +| Attribute | Description | +| -------------------- | ----------- | +| name (required) | For AMQP connections, the connection name must match the `connection` attribute in the `queue_topology.xml` file. Otherwise, the connection name must be `db`. | +| exchange | The name of the exchange to publish to. The default system exchange name is `magento`. | +| disabled | Determines whether this queue is disabled. The default value is `false`. | + +{:.bs-callout-warning} +You cannot enable more than one `publisher` for each `topic`. + +### Updating `queue.xml` {#updatequeuexml} + +See [Migrate message queue configuration]({{page.baseurl}}/extension-dev-guide/message-queues/queue-migration.html) for information about upgrading from Magento 2.0 or 2.1. + +### Related Topics + +* [Message Queues Overview]({{page.baseurl}}/config-guide/mq/rabbitmq-overview.html) +* [Manage message queues with MySQL]({{page.baseurl}}/config-guide/mq/manage-message-queues.html) +* [Install RabbitMQ]({{page.baseurl}}/install-gde/prereq/install-rabbitmq.html) + + +[MySQL]: https://www.mysql.com/ +[RabbitMQ]: http://www.rabbitmq.com diff --git a/src/guides/v2.4/frontend-dev-guide/responsive-web-design/rwd_js.md b/src/guides/v2.4/frontend-dev-guide/responsive-web-design/rwd_js.md index d05feddd86a..9c91dd1d29a 100644 --- a/src/guides/v2.4/frontend-dev-guide/responsive-web-design/rwd_js.md +++ b/src/guides/v2.4/frontend-dev-guide/responsive-web-design/rwd_js.md @@ -16,9 +16,6 @@ The Blank and Luma themes use the following scripts to responsively relocate pag - [`menu.js`] - [`matchMedia.js`], used by `menu.js` -{:.bs-callout-info} -`responsive.js` no longer exists since 2.4 code-base update - The script files are located in the file system as follows: ```tree @@ -28,10 +25,6 @@ The script files are located in the file system as follows: ├── menu.js ``` -See one of the following sections for more information: - -- [menu.js](#fedg_rwd_js_nav) - ## menu.js {#fedg_rwd_js_nav} In a mobile view, on the 768px breakpoint, `menu.js` changes the navigation menu look and behavior the following way: diff --git a/src/guides/v2.4/graphql/images/klarna-payments-cart-updates.drawio b/src/guides/v2.4/graphql/images/klarna-payments-cart-updates.drawio new file mode 100644 index 00000000000..ff3e92364da --- /dev/null +++ b/src/guides/v2.4/graphql/images/klarna-payments-cart-updates.drawio @@ -0,0 +1 @@ +7V1bc+K4Ev41qdrzkJSvXB4JJonnxBAmMInzcsoYx5ibWTAB+9efryUZDJgMmQR2dpdszQa31S2p++uLZJlcqNXR8nbqTHpW2PWGF4rUXV6oxoWiyLJUwC+ixJxSUiVO8KdBVzRaEx6DxBPEtNk86HqzjYZRGA6jYLJJdMPx2HOjDZoznYaLzWav4XCz14njezuER9cZ7lKfgm7UE7PQpTX9zgv8XrSasLgzctLGgjDrOd1wkSGptQu1Og3DiH8aLavekJSX6oXz3ey5uxrY1BtHhzCYr8ZT+5tSXVRuPWfpz+Jvf75cCilvznAuJiwGG8WpBqbhfNz1SIh8oV4vekHkPU4cl+4uYHPQetFoKG6/huNIGFHWce0MA3+MCxeD9KbUIBgOq+EwnDLh6qtO/4E+i6bhwEvvjMOxJ6RlGvMf0Henns7Dm0beMkMSqrj1wpEXTWM0EXeLmmARuCyU+OVibWRZEsroZQysyYLoCGD5K9Fr3eODUP8HTKH8W02hadJvZgr132oKWf/dTFHMMUVhiG6vu8HbhkkKf84plF5jqtGl0HAFLYbea4RfTEES6e5yxkxB92R1slxz4pMvfrMeOtNtCqbAuk2pnwGFM3UFJmCQ61H45nSYHLo39TDG7HUYOVHmGlnWy1573SB7KZJhhkLzvnFGwZAMe+cN37wocJ0taBKIJt40gOUIlcaUZIz9ofewJl6v0pi0hVuBzq4z661U8BWQ1MobkFTSaJHBZKGs7mJy1fDLMVk6Y/JfjsmtMFnMg6S8C8kV35dDUj6gkPMBhcnhs1/V1MJkG2VrnlaUgnalb+hFTZWQzR9ajq9qxWPp5YCqao9e3tfzr2tL6KZ8oGaOlVjlvCLnY1FMlC/74piWF8eKB4YtzABLPO+AkDWb8HXfa7AkH9+upa4NtaqW3ws3O9XY3qorDUoargkB4B9WBPco6HZp8Ne9cBokaOykI5xh7MHYb4UTEaEE4buwcoZ0T3lBhLHNKu+G/axbilZDp+MNH8JZEAXhxhzS4d1vNVgNU8i5DqMoHImAf6gTKHucYC/YtR2wp6TNjH0srGt7sT7JRfpBKfnhie5BV11vOqN9iZ6H//936EzHDj48OPEIesSdgjMi0I47swn3FOjB96KMJ0z2+gH53Cbg89G5m/RSWLNa4x285vnXumiQ3vOc7US9hVmJ/XwhZr8en+Kuqu5G43QH6jTRWP95nvIAmkdxGU6jXuiHY2dYW1O3zJbBTN+LolhYyplHIUhrCfchi0y72IIJq9XUhOxOugVGwWIWzqfuugx7XNm4tF1x0cWDE6HRmFHgUFQfjrsV2qCj2Uy8MafcBKQ3NvzImcJJ9sj3lkH0TMKuJEVc2sR3VZA0cW0shSB2EWcuMqWjIb1XEZLG34XP1Bs6UfC2uVeYBw7Giuk6cabBJAxYfFhJfiBCpqDS1Y1ySlNLWaDtti/Jn2uvl7aAzEe8d3RXklpe/xS2Oi9clUrF9e1N5Qj0cJHvjVHPH+NKkIDJtiDmhStLfWJXTvodCuvN5YZc2F1v6KWccCUX3oHk5zYr89Ybn86oluNDeyFzrGg+HVNWdcb433zSdSLEE6jOmRI6wk6fqr5zBj1OBl2h/vAMKm+t/fTdjKqU0jYnyampp554haOcVzh/+xXOx/F/KW3hf3fn/KRLHuWAZxjngnIt/3etAdVieQtY8k+qup9y/KyuQ+GWz//h4g3F2s9EHbt8y1v5f50bHIDKd1GdgawIwpuQPYabufPp22rMM+g/2vIaRssM4qDiJd3QzytedtLP+0u7cXoMpJAOJnP91/vp/qXKruNsL1YOd5yfijq24xT2Fk+9Tf/ZV+HrecVRdRiQ4TIPs35V0h8PT5X/ZEotGtXBK4DssyyGUPjWTCA5D7B7SyEBC3SjX1/oRv46Irfa2l0gZE8IHL6a3P+QqrgqSbLPpXKWicVjPZVS9j+9/wCImM33rRTP9t9nf03Tt2PI7rZBOQcOR3tIqZ1r0l/a5JSuSqXNXU61JF/8rrucOXmxdFUuZHYKtQ1UKqXylaTKn90o1PTyttiDEubPE/1XpVQt79zIGf7/dPjrin6lldRtfKcwLUtfgf4iBXtlW/Jv5gD6AXvp58XYeTH2FYsxXdl8ZqLK8DNJLWhFrSCV1aL2i36mlq8yj7zK+kc6OfKSTc97JnN2r7N7HWev4xjupen6pnv9Tv5V2P/M81NbIvyJJn/EeV7QvrOg3TwJIKOuKhWk9U/OWVPplMvbgnIUfDyJw2Lk1KHTpeBxBsnek4aqmvPgWTspDPJ2Trdsc/QTI/r2M6BScVcteUdGjvY0vrB/L/AzZzC96Ws4HV2sDoakYVT6A3RKlUtnNIFkpUqT6nZJ49OwO6fDI4w0mQxjpuD5JBxnN5TPJ0q+8kTJyisOP1Gyu1u5en/iNIj9/Hs+v3J+RD6fH/nbnx/5ANr/qgMixQNOHJ/+jSGsAHa9viif9NxYcf+jz2P6fdoHNT4oITIpoodhMPYuU+2wu1T66ru9qJnownv60NuE56Dz+wadlUcfXCwXdnzttCHoKCXhLVssOax7580Jhiwakf7Y+zj4hNH3wu7sXOsdqdb7ABDTWk/JOaogq+VTRv0Dns4dPx9u7XcpOTVw8aS5sPyX5MLCOR39/dNRaY9b7E1HuyHgpOmolPd48jjvtJyT01+XnA6H5To5FbWSrpYkWS6U9bK0WzbJmnKl6LJWkMulkiqlO9UnCdHlLzlkt4Pb9D3mz5/UzLwIfd623oOxorYLqryzecc7qpmX6LdMM+s5E/oYjNiX5u11yY7IFtyZrx134DMFZr/hiv3kGCui/LebrlmXlZQqpRR87joRok2FXyo3szf/QrleAjxK9eGurrzE11rnaTl3Eylw7r5LrhG+3atdtRvrqhXrb+7IfbP6lYVVLSfdkRuYdy+Tl+dutaP6ZbNf8a1qReP/TP9lNJx1DCkwE7Q3iMdEXw93173ure+76ne9c9sum6PlpDNqR87tj8mL0pMaI+pF7nWMSHp57kn3T8P5y+2PedcIFw31+9C7a0b20xJttQJk9Nxxs9i9/aF1q/Lg5akO3hvJeSrP75+Y3EJnVJ6/tFJZ34e2Uo7t5++TjqJFYgwFVynPnKd9cupvndty3AgsmkXaRsL9uau8oJ2U9hGgXd+J5YU7Ko/d0Y/EVYZvnf5EsvvRhPoQ/Rbs5x9SJ4ki59mP7NFy2Bk1o85TefDSmsw76jfMbxGYt82yOZB8q1XDP9tvxhXtvm/KltHUrGTAaPWgsmxUtbjeqkgNo0nXsfV4bZkG7rUGxKPg8/K+70qNVnuJ+xsy6v0mk0+/W9WKbD1qcr1fkeuGy2jgl+uPkG80l9ZjRa0Hmop+lg3qu9+cW31zYbVc2TRc/b7vL3CtN6oVpV7VlEbLjet9tEsGc/SdWC1TNmsW4wNNsfq2wvkGWt2oxfVHxqc1Wr7fMCpo12a/aQ4Yw9IyzJSOfitxPfGXKb+VCP5HLYGNMMZaTr9tXFeWaz5XEXyEWBW8C4wD90U/rRrxLzG/mPhTGvSmMRqT0ZatAHqrajruMd466bVV2eCtJy7GXFPqLRt87QXGLEPvKnipX9lKbL2e1Bgf+JOG4SaQL/G2bblhtPV6lexKNHPJZZLtfMhtY9w+6G7WzvRPaTzSb+KrYc41xbwL/RZosCVww3Cig65xeei7b2tcFmgGzbGGOVrQIZNJ4xX4onumYtYWPuwd8z58H3NkON3iW3/uE5Z9gWnf94LrOuNLKoQ/kp9Y1VQ+zb0GXdsS+jQwVmAXNm4NSKbUgK0Jl/Uqs7sEuybQs4/xz2HzRb0/wDxs+b7fTBqtpmzF4KkSjmrAuLnCFT5L9Rbmb7iwmU02gu5tCXiGPNJ7RarHsG+/CT6B31Zbwzggv4kx1eADbcUK2BjB10ac4Hysv6TC+WCret9V4XuqwABsZS5hI4Yf4H7B/I5hp6lDlzqzC2HCaCo5fKSDDB/Dpsr4jCb5hQ7MYuzMr/W6MYgtHhO2+NrAnA/82RqXbwHLLsN1g/yOdNkS8jHfhmGiHXAM2/PYwXS5YWOiURzAvJR632exCdeQJ3ACe3Pb12BnC/4JPACTpsEyyILj1VJy6NRezaEn77SXU9wDN0n98foadGq3EO2WiAEJMLxLp/ZxDj1+p/3jdcGsIW5TNkzafpONpybGAxpsAH/fpbP2bg699k77ttCjKeXr0dyjF9Y+R4+Ilfvbp3qMYcs8PcZ79MLb7+oxbuTrPZXP9YiYmqvHZI9eWPscPSbWO+1TPWLuuXq09uiFtc/RI2j726d6RPxhvr8ZkwJNYvmL5YK2iEcU25uIOWZSpzyNPFyHHOa/CcWtAXKvRfkiht8n8Gn4PcUjV73v2wlkEx/iq7ZAW5HfOS/FLp47kYsQ56A7kS+t7H3qE3Isled0E7FggDjBYhL6rECui7GzdpDRZn1Q/YAYiFzX5HwtE3NqJpzPThAr0/inYp4ivrbZ3C3K1ZQvua5U1AYL5EXUB6QbG/1XENdR37DcZSEmW3HDGEDXbZnl1/5gwXJWjLzequgWq4nAl9iIgxXESDehcSNmUju5TuNGXMW8RC6iGIn8wmwBPRgmYvJA5f2ZlN9pXtQfdNzW6D7wT/0hb1Q02I7FfPSLXJT2RzHYV0mfjSqzhUL9NTkfYnR7zdeqZPkUYEKrc32u8ELzhgySSbF7Kxe5lIuWiB9bfKx2oPHHAjOEEcR/Ni7SM+aNPI/6gs275S6hd5niPedjYxZ8FcqDCWoJ6g96R74xKpT7SJ+oa9rAgs/4CDvCPgraQXfcPnvtKuwOvSCnMCwAG4SLQUJyUzsAo6j5qK6ykbtM5D/knZjZT6J8SNgGvlBD2TGvC4FdwiDpuU+51tesvr9M5UFfMr9XA6ZQK/dZvRizWs+guUJeQLWiyW0FG1iGLzdaFsuLsIHKbcx0AtvVFBozbEB80OVgzUf+9CjoLZ6fGV3Us1m6wAj8iOpt1o8u6gDSIeQ2tXTc0KcEnSQcA8Bl3+f9oE4CZhci1hBfDL9d8VEdznVJfBZyP6dD34mIQ5zeX9G5j/J6FPyWJvSNuq0pMNqkWCHzeolsZGFdwMeN+YBOumumtl3XPeTTBtVmKR/q56SpCD7m6w0Wx4jPVlmdn+qbcB6wcUB/VkJrIR7fyY4VviZgtRpqf7rmtkKMtUk/Wp2vYRbA1oLPAXPto4+kJmpDrAX7NYnWRNZjxh+pNgRe8HvJ/YVqprRWJD5XW61HUG/DZgtxD75jwgfYHDAO2IaNi9WosI/NfJPWZ6i/FpT7EE9JrwzHDBuPGnRQW99DDclxRniALdjaw1YIn/BrTYyd6j4xduJxZbY+Sn0hsSVRD2/yIf/Ah/iak62rUK8y3ZB+faqVNVGXQx7T9yqmIg8Le6PuxFpjlW8I94ipa10NEC8sPm/i6yOWCB0jpkBXtHah/prcRwJmM+jeRf/CXwLCtyWt+FrwKyPlI79kazCFxyBLYXhiuS3FOGHXj+k6zdmoibHeTG3gIv4gdrYsrrP+ADHDX7L2ho346AOjtszXYrRecQkLjA/jx1jY+lwnX2Z6IfkMszXyX9KZwmrwROTPPq333HUewnWDxSFaS9P6yEXsZHmI5LBxUX6hccGWS64z6q9JeWHR4PNRMjqja2BszUd4WPO5hAEun+mhqXMMDPjaCfGWt/MTWifXeV5YcGxn+SzOx9acFVmsKcAHnAPrtC6mmkDEZjF+X8M4Y+5X5DsUk2pCf9ZCrJGFH5Nt23wNjFiE/M8xx/yxuRD2ob0QiiOx6C/jW2QfFl/j1FcR62JmZ2ZX1Dr9ZspH2MngAeullV2hh9SPWexGXYJ2PBaRHIqFfB8AvggZ7lLUA9SeYo/YU2DjVmmO3Bdd0h+PhbSGbdkLth8EH+b7Nwzj0IMlsxjN16bgg7w1H2pIrIsFH8WztW9QnddW2V5OoCGeop7sD0S+tVkc4PizYQfk5hUf7esIPlZ32SImV7gMPq9kHatTOhsf1VHwwTSnom7idSL5EXylnYjYA6yaFKe4Pxg17n+sf9glof7Z3gbtF8CG9qLB+RRex3C/QeyRRX0VU460WA4kOnwtscR+iq1TDLS4X2I8psrqIrJHUlF4nLc4XlB3rvlq8FmWH2i+Mt93Su1oKqx+ecf+XkC7p+V5tyqrL0/DsXPXLJv95oLvqjL6yH6SJ527Qdkc13udsRW5yo/YebID864bOs/fh/fP9YX9VB8+PH7L7CmWlZfnb6PObVkFXXGe6xPafzSD65HztJw9PJp9tlOLf2ZQot1avs+LT1+0cV/YfCtBOfhbFwrH2sqX8x4IHbiVv7kN/xUb/Ls79/mb+7juRRH9VZ8KTV+5cbtj5Spww/FrQN+we+WiR+WGbfcrN0Sf0XZ/6AbO8JJdXtK3uN7I9M1bN+Kp6yV959yEHi5mH9oo774P/IEXUraOa8jK7isoeSeWj/cFC2fLn8ry29/Pk+/3J7W+nHd+4R9q/Qk+DC/fII/e8rhRSXUd+mtf3vR/C/CFiwwANt8LVY8DCbm4fZZZy3mD4aSAUA444n0GxPZfaDoeIJTi7pdCnjZCHPBq2hkQx4sQ2+XC7jt5x4LDc6X4Kv85S7TXQLlslv5bbD83c//43/HPdmrns51/p7OdH4a5vv09NOn1Cc515sJc2QvzT79lwP/kx9CJvBl/Z8eJ5uejm19wdPPjqCvpV9rulwG880fjjvZ6QS4ID/jqu2O/XaBv/SU9Vdbz3roo5Pjm0dRylD/Ms/oTPOsT12dHPZKjvgv2DxyxznFP5YQ4zFspHb8U0s+l0D+9FLra/BM+qlzOiblfVA7hcv3nxPm3Hq3/KLta+z8= \ No newline at end of file diff --git a/src/guides/v2.4/graphql/images/klarna-payments-cart-updates.svg b/src/guides/v2.4/graphql/images/klarna-payments-cart-updates.svg new file mode 100644 index 00000000000..aa0fff6a16b --- /dev/null +++ b/src/guides/v2.4/graphql/images/klarna-payments-cart-updates.svg @@ -0,0 +1,3 @@ + + +


7
7

PWA renders the Klarna Payments  widget

PWA renders the K...

Magento returns an updated cart object

Magento returns an u...
2
2

Client
(PWA)

Client...

Magento

Magento

Cart update

Cart update

Widget reloading

Widget reloading

Perform cart update (for example, add product, apply coupon)

Perform cart update (for...
1
1
3
3

Get all available payment methods

Get all available paym...
6
6

Magento returns all available payment methods

Magento returns all av...

Klarna
Payments

Klarna...
4
4

Get the latest status

Get the latest status

Klarna returns the latest status

Klarna returns the la...
5
5
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/src/guides/v2.4/graphql/images/klarna-payments.drawio b/src/guides/v2.4/graphql/images/klarna-payments.drawio new file mode 100644 index 00000000000..6c800a0b2b8 --- /dev/null +++ b/src/guides/v2.4/graphql/images/klarna-payments.drawio @@ -0,0 +1 @@ +7V1Zd9rIEv41PufeB3O0A48YiENuBCaG2PhljhCKEPuAMKBff6u6WyCJFpZjhO2kM5PYavWmqq+Wrt6u1Op0e7u0FkNzPnAmV4o02F6ptStFkeWSDj8wZUdTippME9ylN2CZDgn3XuCwRImlrr2Bs4pl9Ofzie8t4on2fDZzbD+WZi2X800826/5JN7qwnKdo4R725ocpz54A39IU0u6dEj/6njuMGxZltibqRVmZgmroTWYbyJJav1KrS7nc5/+Nt1WnQkSL6QLLfcl5e2+Y0tn5mcpcDtWn1fflm3r8dvdqFXubgKzdc1qebYma/bBrLP+LqTAcr6eDRysRL5SbzZDz3fuF5aNbzfAc0gb+tMJe/1rPvMZE2Udnq2J587gwYZOOkvM4E0m1flkviSVq790/A/SV/5yPnbCN7P5zGG1RTLTP5B+/OnhdzhL39lGkhgpbp351PGXO8iyTeCQ4dIo0cfNgcmyxIgxjDC4VGKJFgOWu6/6QHv4hZH/FaxQ/lZWaJr0wVih/q2skPV3ZMWqdPPTDJ7G/06vS235n6bf7VrXGk9DGRNo92bgPcd4Yvy7Rl16A9/qXzMSVyDHxPnlww9CIQmJd70ivMB3srrYHkrCby77SVroL5Mp8A2k2TD1LaiwljYDBXDkZjp/tvqkHny3dKCP0ee5b/mRZzCzTvTZGXjRR2YNIyn43V+sqTdBzn51Js+O79lWApuIooWz9IB1CMvaEuuYuRPn7pB4s7djUgK4DJ4DazXckyAHTJZCgxoBpVFWj0Epq1JOoFTLApR/OygT7oPBA6XMAaWWGyiLApR/OyjjmlKXsmrK/ECpC1D+5aDUyjFQKlpGUCq5gVIR5vtvB2VCUxazWm/9DJjkj/61l8eczsB17tnjfOkP5+58Zk3qh9SbA1akOC5Gju/vGEustT+HpEMN3+fzBcsXH3DC6LJaleDP/k0YA0N0rebrpX1gI4LSm7nwspTkGD7cWT5kmpEUkBHE12xQwQgdfs3CmdGULx7SjXTft5au46fU72w9/xErK0gKe+xhuYIhaey5tmUVkYdd5CECvZp0ClFI8ZN4WjoTy/ee48FCHjhIUfhcaxfJsJh7M38VqfkOEw4wVXQ1BlNNLUWBdpy/JL8tv15KAJn2OLV3BUktH/4YicaNQqlUPLyOE4ehh1Z5qo86v4/7ihhMkhURKdxz6g2CyTMWCcF0Qe4W2dXSPlrNdOlVNCDMU1e6rsRooMpyQT/SWLKhHWssLbcYWXpgZsE1oZms5P8m1nJmEcHy18sZyIbkDx00uJbvrHxSseWvVxHbuUi1nGi042qQH087tjdhgI6YefUGOQiWbVJhyVNvMCD6lmeN4zo4s41MRPUkKdS7e7WHTxOr70zu5ivP9+axCGLYxe+JDPuuHsPzNNwz21JVOUZimHYZJPLGGBeWUMWIOxQyJx6glySOR2GcMBpvI4uRh4CalgvUmxOvd7mxloODiIJ/uZjPVo6QzZxkcw/07LK5txNh8PQIleXSJUX17TEqRtW0sZfGA62WcagFX+AtVmngiQ6zVgs62fzL2yKckhM4NzW1qpZPQexoCih1qicEonYK7MP50gsgs7WXJgrNDvHsI1j9wbgcSfpOBGkvEZHP+EL+nBHorJ6bue/Pp2wYkRv4r6UXwa9wPKYw7ezg505liSFe6hAv1Vy/86hMLZYTwJJfGGe9WOKlkRYMpfjlXz2cguHTS1XlPKAKjUtOYpABlSdRHYEsU8JxyOYhZvZ6+bzvMwxwln5CakhapBOZPJcwRMfzXI7Mz+lgyyxcmWWEnYk8v7+cpgcPjgUnGT7ILjgvVpWz4Og8waF+zTAuP2kevc5zjqoTDxkXCU//bk3/uXuo/DfiamGvMrv/0eg0QSjI1oohmQfYVFeIwQKa0W+u9Bp/EMH1to5HB9FFO9lHj+lh56LEidsYnGFhMa84s85b2/RqEBGep40MBf/T+K9pelKHHIcJyhw4nGPa4d9FdSiZ436n+7Ab//pa/rc+GmZZ/7kaWgv81ZuSpbKpTn6fOfV0eHBj2WOXEDS6ro384TDPR7N5PKoiTVbCVClMgd8Hlg/mrkIflS+rZ/dKudkCmJTq3dem8rS70foP27UdSJ719Ydk1+bP39WBOtjpqrnTn+2p/WyOKhuzWg4GU9trfH1aPD0Oqn3VLTdGFdesVjT6t+E+TSerfk3yGgHkr2GZBrR19/VmOLh1XVv9ofdvu+XGdLvoT7u+dftz8aQMpdYUW5GH/ZovPT0Ope8Pk/XT7c/1oDbftNQfE+dr2+89bCGvZkAdQ3vWLg5uf2qDqjx+emhC2S+S9VBef38g9Rr9aXn91Anr+jHpKeVd7/HHoq9oPuuDYSvllfWQVk/zuX9b3rU8E78izCPB+7WtPEE+KWzDg3wjaydv7Gl5Zk9/BrYyee6PFlJv5C+wDdau0Xv8KfUD37ceXb833U7607bffyiPnzqLdV/9Bt+38Rq37XJjLLlmpw5/e257V9G+jxqyWWtrZjAmaU2vsm1VtV2zU5FatTY+78z7G7NRg3edMZZR4Pft95EttTrdLbyP1dEctUn9+LNTrcjmvSY3RxW5WbNJGpSXm/dQf629Ne8ratPTVGhn28K2R+21OWpszI4tN2q2/n3kbuBZb1UrSrOqKa2OvWuOIF8wXkPbgdlpyI26ScpBmmKOegotN9aatfqueU/Kaa2O67ZqFcjXJT/xG6APW7PWCNOh3cquGbjbsLwZsPL3WgA8gj7WOe124bmyPZSzFVYOEatC2Q30A96zdjp1LL+F79th+TAN6KaRNFJHVzY9oFtV0+EdKdtEunYqsbLNwIY+15Vmpwfluhvoswx0V6EstiubQU9vBnVSDsoHrZodQP0SzduVW7Wu3qwiXzGtsaV1Iu9cqLcL/XYh3Y7yGf8qrXv8ieXq8M11pfF17nYgDXgJuCE40SFdo/VB26OeRuuCtBp+Yx2+0QQakjqxvwxf+K6hNOobF/i9o224LnwjwWmi3OH3EWLZZZh2Xce7aZJyQQXxh/UHZjWsH7+9DrTuSdBmDfoK2AUed8ZYp9QCXiMum1XCdwn4GgCdXej/Gni+aY7G8B09+fuoHbQ6bdncQZkq4qgOGG/scQW/S80OfH/NBp71kEdA+54EeIb6kO4VqbkD/o7aUI7ht9PVoB9Qfxv6VAcZ6CqmR/oI5bqgJ2g50l5QoeWAV82RrYLsqQwDwKvGFnhE8AO43xC5I9hp60BLnfAFMVFrK5xySINIOYJNlZSrtVEudMAs9J3Itd6sjXcm1QmJcl3AnAv462m0fhOwbBNct1DukJYdVj98b6vWgHyAY+A91R2EljEeYxrqAfgupTlyiW6CZ6iP4QT4TXlfBz6bIJ+AB8Bko0YsyIbi1VQ46Zhf5aQHJ/LLIe4BN0Hz/uYG0jHfhuXbgg4IAMPH6Zh/x0nfnch/f2M06qC30RoGXbdN+lNn/YE04AHI+3E6yW9z0usn8ncZHRsSn46NFLqQ/Bw6gq5Mzx/ScQe85NFxl0IXmv+YjrsWn+5h/ZSOoFO5dAxS6ELyc+gYmCfyh3SEb+fS0UyhC8nPoSOkpecP6Qj6h8h+XCd5mkTsF7EFXaaPULe3Qec0gibaabDDTaiHyG+AemsMttdEe7EDuQ9ApkHuUR/Z6vdRL4C6sRzoV20DeZl9p2VRd1HbCbYI9BzQjtlLM/oe24R6TJXa9AbogjHoCaKToM0K1GtD30k+qKNL2kD/AXQg2Lo2LddpwDe1A1quF4CuDPWfCt/J9GuXfLuJthrtJaWVCr7BBuwi+AdImx60XwG9Dv4NsV0m6GRz16qNgdZdmdjX0XhDbNYO7HqnopvEJ4JyQQ/0YAV0pB1gv0FnYj65if0GvQrfxWwR6kiwL4QXQIdaA3TyWKXtNdC+43dhe0DjrobvAf/YHtiNiga8Izof2gVbFLaHOthVkZ6tKuGFgu21aTnQ0d1DuU4lWk4BTGhNSs89XvC7oQ6sE3V3whbZaIu2oD8S5YjvgP3fMcwgRkD/k34hneG7wc6Df0G+u2Nvge4y6ntajvSZlaugHQzAl8D2gO5gb2oVtH1IT/BruoAFl5RD7DD+KJAPaEf5k8pXxnegC9gUggXABuJiHGC9IR8Ao+DzoV/VA9vVAPsHdmdH+CehPURsA77Ah+rtqF8I2EUMIp1HaGtdzRy527A+oJdM39UBU+Arj4i/uCO+Xg2/Ferz0FdsUF4BD8yaK7c6JrGLwAOV8pjQBHhXV7DPwAMsB7QcH8qhPN2z9A61zySd+bPRdIYRkCP0t0k7OvMDkIZQb1sL+w30lIAmAcUA4HLk0nbATwLMbpiuwXI7kNt9OfTDKS2xnAm2n6YDvQOmh2j6aJ9OZZT6o1De1Bi9wW9rM4y2UVfI1F9CHpkwLqD9hu+BdKRdO+Ttwe9Bma6hbxaWA/85aCusHJH1FtFjWK6nEj8/pDfi3CP9APqZAY6FqH5HPlbomID4auD74zPlFejYHtJHa9IxzAawtaHfAN86gjaCOvMNYSw4qks4JjLvI/KIviHgBX5uqbygzxT6iljO1vbjEfC3gWcb9g5kpwEyQL4B+gG8If0iPirwp0dkE8dn4H9t0PaBPkW6EhwTbNxrQIP64R34kBRniAfgBRl79BTEJ8i1xvqOfh/rO5axZTI+CmUh6EnMH46XA/sDMkTHnGRcBf4qoQ3S10VfWWN+OdRH6L3XqWCHGb/B74Sxxt7eIO5Bpx5oNQZ9YdLvxnIj0CWMxqBTgFY4dsH22lRGPMIzoL0N7TN58RDfprQv1wG5qoXlUC7JGEyhOshUCJ6IbQsxjth1d/gc2mzwiWG8GfLABv0DurNjUpqNxqAz3C3JX+uBfnQBoz2ZjsVwvGIjFkg56D/0hYzPdZRlQhesn2C2jvKLNFOIDx4w+znC8Z59sEPw3CJ6CMfSOD6yQXcSO4T1kH6hfcF+AS+3lGbYXhvtwqZFv0eJ0AyfAWOHcoiHQzkbMUDrJ3Ro6xQDYzp2An1L87kBjpOb1C5sKLaj5Uxajow5KzIbU0A5wDlgHcfF6BMw3cz672rQzx2VK5Qd1El1Rj9zw8bITI6Rt106BgZdBPafYo7IY3vD+IOxENQjO9ZeRLaQP0S/7kJZBV23I3wmfAVfZ9QOyyF2IniA8dKer0CHUI6J7ga/BPJRXYT1oC6kcQCQRajD3jJ/APOj7mExBdJvFb+RyqKN9KO6EMewnd6GxINAhmn8hmAc6GDKREfTsSmUg/oO5cCHhHExK4f67CAb6Od1VRLL8TTQp+BPjsbM3vaIHqD46wEfwDbvy2Fch5UjfleP6eQKrYN+V3DQ1WE66R/6USCDoU0Fv4n6iShHICvdgOkewGoD9RSVh1qdyh9pH/gSYPsktoHxAuBhb9Oi5RTqx1C5Ad0jM/9qhzbSJDYQ00HWApPFU3o66kCTyiX0p6ESvwj5EVQUqudNihfwOw/l6iCzxD7g98o07hTysaEQ/+UE/x0Po6fl9aAqq08Pk5n1tV1ujNobGlUl6dPeg7zofx2XG7PmsD8zfVv5ubMeel7j62BuPf6YfH9sbnoPzcnd/bdITLGsPD1+m/ZvyyqkK9Zjc4Hxx4Z3M7Uetqu7+8aIRGrhb8MrYbSWxnnht/ME8otGfFGyknlix8grkp9hVl1E8kUkX0TyRSRfRPJFJF9E8kUkX0TyRSRfRPJFJF9E8kUkX0TyRSRfRPJFJF9E8kUkX0TyRST/74nkJ/aI8g7yu2QcX85wEFD+pxkUE/sUivoxWeSicUm6vP0kud/ZOi6rYu/4Z9o7flqmXlYLDO/XUkGSlJJelDXyr1rCQ9+PREDRCpJRUovG/t9jiUjLc34JyfnAj8ORPNYM/lkvBpYPAAa5spa4UXLeHyGwxekfbz79460gDredqwW9rGuaTP+NH891XeIdIaUpBU3SdL3E/r2kguedDXJxw5fcoKeXFS6dOAdWamc4OIJ7XqX++0eQnab0m+mlSklHQclIKyUvFJXex02QhZvwmdyE03KW2U0ocjwCngeQF9jTD7LN4ww+a+0TEFhI8398wNJMWPu3W/u3YnFv7Y9Vr8wZueamesN7GcT5Rp/8fKOSmhz9y+H5RaknHL1c5qUzjjSpUCzqJUOBEVLZ0MPDVSLVlWRJ1bSSgrnU+EdnPsXFUAqlsA5FKr6mjfMd78IXn3yPBxPnIolzkWLClhBXdX9E2etlSipokWOg9RdrzluSeGMAYYg+nSEyikmjUioWT0LxxRIvGCFdBbnQ5aKiyWqxrMpKsq6CFHn7e+JS1JXC3shBZcYr2shbcDIEGoQJEiboHCaIiFoc+uXi70pUwgCdrjZnIVIz3B4prM/xTR5SAW+RjF7loZbkq496lQfnqMlSoWxErsPQYigEGBYkVX7rbRhaGBc4VJsJ3C8L6Nngn+E0frERTWxEExvRxEY0sRFNbEQTG9HERjSxEU1sRBMb0cRGNLERTWxEExvRxEY0sRFNbEQTG9HERjSxEU1sRPtrNqIlFjzJilQoGaqhFTVDKqvFdz5eLudb2/64Wa33n3lNWSFhHF8lWOQALXWFxevKv7TeQtEy1PX6CWHNeE21OU8Ia/lOCItVFWJVRbpAGbiR8QwCpRbKqSssXmjkfOLFXSmfYb+0MEx/3HILXdELWklNrqcIl0WUpXOstijifX1Ksub3W3DBxT9v16+wLsK65GJdpJgwqPJ5rItaPmFdXmgkZ+uS71JyIV1CuqKXVZ8EvvZ70qXpely6TouXdlHxkjPsGRSrBcVqQbFaUKwWFKsFxWpBsVpQrBYUqwXFakGxWlCsFhSrBcVqQbFaUKwWFKsFxWpBsVpQrBYUqwXFasG/ZrWgEZ+W1jnns+e1PpAfyBfLMP6I9YGaZBS0+LF4eASycnqKKUOhF1YCJpfsRc5dfu2EV3IejVNV3ucopZ/EnushxIo4hPgzHUL8aq2vGPFlTkbxWOtf9ABihXdm+5sPIL53UJrpmcMLazd1iHRDj4fzASYt58/eANkkDiY+I2bPgE9V0l7Ep6wWjwF6jjOJ+W6JOAryj3BL1FKpkFB+pWK5cPo0yCyFXjyVWC+UjdRTiUslqSCd41TiUgEq2Z9KLKmvaSXvJTriUEixBO5i5xLHkV+WfvOQVTzn+8Sit6N6c5YhlTc6pg7KMC5KaY6SznOUGjOw4gAN6vhEXB6sNLPPs3SgHXbjC8EaSMmKYZIHvVRnhzEYmtFvrvQa33PieljHLlEoFPp5PBNNjvFfVvRCyZAOf+RjP0XihE/0vMInavqI8S0AAaXlEmcaSDcAXYE+swDJEUjCpbAq76ani8Ig/fait8CgEh0fCQScGMDE1YSucQDBu1MlN0Bwt12/HRB3ExyRKtJ8OcAgkwBEqt1IDB8MDiAuaii0DHH23G/J08tHp+xnU5znGOffjtXn1bdl23r8djdqlbubwGxdq7nchPVjPQtjTLSu/jJ8ZS8dy3foVVl3NEa1undWK6JgpenaT+paEYU65/VYezF4RWwqmyrPDaIab6vLBSYFxJzAZ5oTeCvaLzATwO9ihkBr3nZJ1/VCPH4gF7l7R2OXmCsFNRop4NzgnNuhOmr69EmeKkFcaf4HqIRSitSkSsd18r6Va6XAbjdnd5yXj6TjQ91vfmJwnMdtp/bEAxaEs4mSNRtc7acj/7HB+XMBZM5KuHh5uXivRrhSLmiR+851LT5Zs99sfPkLz/lXvGbY+5z/heda8gJvXsyjKIe5LuIq6+nh8jztYtgGZs6kUEgtrIWJN3OuQ+qQtxgX0I9b0SMag7YUb10Y5U9rlPcSnTnkbHBMbj5eO1/QeJc1vdmk3pIpB4s0bz1b3oRoo+O1PMJ25nZ7eHYghuGR/RrJ2Fqdcj5an9/pDBcg528Pk6ej6Dy6FOULWkP1fQJHJWGQPr9BevUc6DHYLxpGymU9qWm5QKY5Z4y3XgxgIIcDO2/2ay7MUV7m6PUTscp7GyOxcPSPWDjK25pivLRwNEuhlxaOJjehFBNhhN89y/qoopyXrhkfwisrJiecFU4sRw1ZdJn4jfJOE3qacMw+vWNmvN4xKxS14iFeX+RFDt4nWM8XDp7aOOeCDGmBa5hadAGTWHCRtwv3CsAeIgpFzsRqbOWUUeD4dLkp7HDP9LuasmJyGq4scUxZKN6XMWTpUcBcDVlRGLLPb8iUFMlINWSyWjjMOcO/H2fWmS8c6SvzzxKSoAsJMSRhoW1LrsgVVuysViw7WkMrphb0yJzysdf1njPIRoabhXJfdFVMziCX5FKBI9UXtmk80lzApunCpn1+m6amCEf6NO7nMmnpyyvOYtJWzmxwiLEv4ntNpKXz79pZkRMeMHO4/kpYvHwsXnYs8y2eztva8Y4m7wPsf+GYvLL+AUze+6wmRp9ImLzPbvKy7zD4pMO4fBcPx03e0lkt5rOVE9q4vWkURi4fI/f63WAf28ilB+Tesus37mrhXsbf3j/MdjyKrcPpENtP3EZAFV4eGUVRcj73fCjK50wJejrbfi3n28G0P9iNbJ21raUvYHViAiF+BaNR5ixPVHKCGX8N8csOefIGtwjL+BexneOKt+O72/jXu8Hz0PcXKwLRL/C/PZgpBQ/GBL88PDSlYEOL4NnihW/KF0xfoQGHXybXz1AfNKx8wfVKX/rL+WblLP/ZQLn55lpWSoUFGsHEWh01DgyF4xrWDfzvPICRi/GVLEX52FXTOYA5xxEGXMDIPL0kEPOREJMc32qc3fMXxQx3FkZg5iNhJnEnvHLsUl8WMbxoyJ+PmNXc9qzJNXm8VlVIkXHo+4UNQSNwSYLjDCDQjCQIjs9VuygINOGcfHS1cbT/tHi8UCgvzHC3mcsZJlX/QMy8s+KIn7NVlDTOtqu8YMA/ik+g4PIoMI6UgfTeOJAzrH//A4HwmUxIYoOEcbmxCh8xYqzy0RGTPBT+vREjxiqXNzbhHu4TR3vmBYJ7pV61pGuv1dz0aoPNcrj+MrlOP8Eyz9l7MXn/qSbvXw3z4zPxlPB0nQvs8eYCPTyG6bxT8ZXV+OqwmgzAj4JA93eLc0be4zIgvVQqxGce9ru1L7Grmw895V2UrNjo8rcpWf65MRe9m+2dzhtWBNb/cKwnLqcyXjhh97Kgz2Xb8WFpO7gVG2sZW+rHVrMLD+MdPAz95XsIype8blDn+RcJFFz+SE+Nt8M4vGnrIkeYKTy65G+LysIWfSZbdFqkMq9Mv9zwlo/19J2HbzBBdw+Vq/Aar4P12Q93Dwty8bvJnV/CIOVzlll2PO7Xmse18bEuvug9JCeOLXozPsNtEOGFzM5//gtPA28JWnOCJBFb/t7XZQJ3iLvxIZw7+2hHpL/TySSScBw+k+PwejE4OlBO5yxVO5PbAI/LOeJr/+4W8DE05wMHc/wf \ No newline at end of file diff --git a/src/guides/v2.4/graphql/images/klarna-payments.svg b/src/guides/v2.4/graphql/images/klarna-payments.svg new file mode 100644 index 00000000000..655536190fd --- /dev/null +++ b/src/guides/v2.4/graphql/images/klarna-payments.svg @@ -0,0 +1,3 @@ + + +





Klarna returns the latest status

Klarna returns the la...

Magento forwards the response

Magento forwards...
4
4

Client
(PWA)

Client...

Magento

Magento
13
13

Magento returns an updated cart object

Magento returns an upd...
11
11

Klarna returns the authorization_token

Klarna returns th...
12
12

Set the payment method providing the authorization_token

Set the payment method...

Initialization

Initialization

Widget rendering

Widget rendering

Authorization

Authorization

Place order

Place order

Run the
createKlarnaPaymentsSession mutation

Run the...
1
1
3
3

Klarna returns the client_token and payment_categories

Klarna returns the cli...
5
5

Get all available payment methods

Get all available paym...
8
8

Magento returns the updated info

Magento returns the up...
14
14

Run the placeOrder mutation

Run the placeOrde...
17
17

Magento creates an order

Magento creates an ord...
15
15

Magento sends the place order request to Klarna

Magento sends the plac...
16
16

Klarna sends the response to Magento

Klarna sends the respo...

Klarna
Payments

Klarna...

Set payment
method on cart

Set payment...
6
6

Ask Klarna for updates

Ask Klarna for updates
7
7
2
2

Magento forwards the request

Magento forward...
9
9

PWA renders the Klarna Payments widget

PWA renders the K...

PWA sends authorize() directly to Klarna

PWA sends authorize()...
10
10
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/src/guides/v2.4/graphql/images/reset-password-email.png b/src/guides/v2.4/graphql/images/reset-password-email.png new file mode 100644 index 00000000000..9bc66ff8be5 Binary files /dev/null and b/src/guides/v2.4/graphql/images/reset-password-email.png differ diff --git a/src/guides/v2.4/graphql/interfaces/bundle-product.md b/src/guides/v2.4/graphql/interfaces/bundle-product.md index ddfcff87c46..62056f4e4bd 100644 --- a/src/guides/v2.4/graphql/interfaces/bundle-product.md +++ b/src/guides/v2.4/graphql/interfaces/bundle-product.md @@ -56,6 +56,7 @@ Attribute | Type | Description `product` | [ProductInterface]({{page.baseurl}}/graphql/interfaces/product-interface.html) | Contains details about this product option `qty` | Float | Deprecated. Use `quantity` instead `quantity` | Float | Indicates the quantity of this specific bundle item +`uid` | ID! | A string that encodes option details ## Sample Query @@ -87,6 +88,7 @@ The following query returns information about bundle product `24-WG080`, which i sku options { id + uid quantity position is_default @@ -117,7 +119,7 @@ The following query returns information about bundle product `24-WG080`, which i "items": [ { "sku": "24-WG080", - "__typename": "bundle", + "__typename": "BundleProduct", "id": 46, "name": "Sprite Yoga Companion Kit", "dynamic_sku": true, @@ -136,6 +138,7 @@ The following query returns information about bundle product `24-WG080`, which i "options": [ { "id": 1, + "uid": "YnVuZGxlLzEvMS8x", "quantity": 1, "position": 1, "is_default": true, @@ -147,11 +150,12 @@ The following query returns information about bundle product `24-WG080`, which i "id": 26, "name": "Sprite Stasis Ball 55 cm", "sku": "24-WG081-blue", - "__typename": "simple" + "__typename": "SimpleProduct" } }, { "id": 2, + "uid": "YnVuZGxlLzEvMi8x", "quantity": 1, "position": 2, "is_default": false, @@ -163,11 +167,12 @@ The following query returns information about bundle product `24-WG080`, which i "id": 29, "name": "Sprite Stasis Ball 65 cm", "sku": "24-WG082-blue", - "__typename": "simple" + "__typename": "SimpleProduct" } }, { "id": 3, + "uid": "YnVuZGxlLzEvMy8x", "quantity": 1, "position": 3, "is_default": false, @@ -179,7 +184,7 @@ The following query returns information about bundle product `24-WG080`, which i "id": 32, "name": "Sprite Stasis Ball 75 cm", "sku": "24-WG083-blue", - "__typename": "simple" + "__typename": "SimpleProduct" } } ] @@ -194,6 +199,7 @@ The following query returns information about bundle product `24-WG080`, which i "options": [ { "id": 4, + "uid": "YnVuZGxlLzIvNC8x", "quantity": 1, "position": 1, "is_default": true, @@ -205,7 +211,7 @@ The following query returns information about bundle product `24-WG080`, which i "id": 21, "name": "Sprite Foam Yoga Brick", "sku": "24-WG084", - "__typename": "simple" + "__typename": "SimpleProduct" } } ] @@ -220,6 +226,7 @@ The following query returns information about bundle product `24-WG080`, which i "options": [ { "id": 5, + "uid": "YnVuZGxlLzMvNS8x", "quantity": 1, "position": 1, "is_default": true, @@ -231,11 +238,12 @@ The following query returns information about bundle product `24-WG080`, which i "id": 33, "name": "Sprite Yoga Strap 6 foot", "sku": "24-WG085", - "__typename": "simple" + "__typename": "SimpleProduct" } }, { "id": 6, + "uid": "YnVuZGxlLzMvNi8x", "quantity": 1, "position": 2, "is_default": false, @@ -247,11 +255,12 @@ The following query returns information about bundle product `24-WG080`, which i "id": 34, "name": "Sprite Yoga Strap 8 foot", "sku": "24-WG086", - "__typename": "simple" + "__typename": "SimpleProduct" } }, { "id": 7, + "uid": "YnVuZGxlLzMvNy8x", "quantity": 1, "position": 3, "is_default": false, @@ -263,7 +272,7 @@ The following query returns information about bundle product `24-WG080`, which i "id": 35, "name": "Sprite Yoga Strap 10 foot", "sku": "24-WG087", - "__typename": "simple" + "__typename": "SimpleProduct" } } ] @@ -278,6 +287,7 @@ The following query returns information about bundle product `24-WG080`, which i "options": [ { "id": 8, + "uid": "YnVuZGxlLzQvOC8x", "quantity": 1, "position": 1, "is_default": true, @@ -289,7 +299,7 @@ The following query returns information about bundle product `24-WG080`, which i "id": 22, "name": "Sprite Foam Roller", "sku": "24-WG088", - "__typename": "simple" + "__typename": "SimpleProduct" } } ] diff --git a/src/guides/v2.4/graphql/interfaces/configurable-product.md b/src/guides/v2.4/graphql/interfaces/configurable-product.md index e12001cb866..7440f1f9442 100644 --- a/src/guides/v2.4/graphql/interfaces/configurable-product.md +++ b/src/guides/v2.4/graphql/interfaces/configurable-product.md @@ -39,6 +39,7 @@ Field | Type | Description --- | --- | --- `code` | String | The ID assigned to the attribute `label` | String | A string that describes the configurable attribute option +`uid` | ID! | A string that encodes option details `value_index` | Int | A unique index number assigned to the configurable product option ### ConfigurableProductOptions {#configProdOptions} @@ -156,6 +157,7 @@ The following `products` query returns `ConfigurableProduct` information about t } } attributes { + uid label code value_index @@ -181,7 +183,7 @@ The following `products` query returns `ConfigurableProduct` information about t "attribute_set_id": 9, "name": "Mona Pullover Hoodlie", "sku": "WH01", - "__typename": "configurable", + "__typename": "ConfigurableProduct", "price_range": { "minimum_price": { "regular_price": { @@ -192,10 +194,10 @@ The following `products` query returns `ConfigurableProduct` information about t }, "categories": [ { - "id": 2 + "id": 8 }, { - "id": 8 + "id": 21 }, { "id": 24 @@ -230,30 +232,30 @@ The following `products` query returns `ConfigurableProduct` information about t }, { "id": 146, - "attribute_id_v2": 160, + "attribute_id_v2": 144, "label": "Size", "position": 0, "use_default": false, "attribute_code": "size", "values": [ { - "value_index": 176, + "value_index": 166, "label": "XS" }, { - "value_index": 177, + "value_index": 167, "label": "S" }, { - "value_index": 178, + "value_index": 168, "label": "M" }, { - "value_index": 179, + "value_index": 169, "label": "L" }, { - "value_index": 180, + "value_index": 170, "label": "XL" } ], @@ -279,14 +281,16 @@ The following `products` query returns `ConfigurableProduct` information about t }, "attributes": [ { + "uid": "Y29uZmlndXJhYmxlLzkzLzUz", "label": "Green", "code": "color", "value_index": 53 }, { + "uid": "Y29uZmlndXJhYmxlLzE0NC8xNjY=", "label": "XS", "code": "size", - "value_index": 176 + "value_index": 166 } ] }, @@ -308,14 +312,16 @@ The following `products` query returns `ConfigurableProduct` information about t }, "attributes": [ { + "uid": "Y29uZmlndXJhYmxlLzkzLzU2", "label": "Orange", "code": "color", "value_index": 56 }, { + "uid": "Y29uZmlndXJhYmxlLzE0NC8xNjY=", "label": "XS", "code": "size", - "value_index": 176 + "value_index": 166 } ] }, @@ -337,14 +343,16 @@ The following `products` query returns `ConfigurableProduct` information about t }, "attributes": [ { + "uid": "Y29uZmlndXJhYmxlLzkzLzU3", "label": "Purple", "code": "color", "value_index": 57 }, { + "uid": "Y29uZmlndXJhYmxlLzE0NC8xNjY=", "label": "XS", "code": "size", - "value_index": 176 + "value_index": 166 } ] }, @@ -366,14 +374,16 @@ The following `products` query returns `ConfigurableProduct` information about t }, "attributes": [ { + "uid": "Y29uZmlndXJhYmxlLzkzLzUz", "label": "Green", "code": "color", "value_index": 53 }, { + "uid": "Y29uZmlndXJhYmxlLzE0NC8xNjc=", "label": "S", "code": "size", - "value_index": 177 + "value_index": 167 } ] }, @@ -395,14 +405,16 @@ The following `products` query returns `ConfigurableProduct` information about t }, "attributes": [ { + "uid": "Y29uZmlndXJhYmxlLzkzLzU2", "label": "Orange", "code": "color", "value_index": 56 }, { + "uid": "Y29uZmlndXJhYmxlLzE0NC8xNjc=", "label": "S", "code": "size", - "value_index": 177 + "value_index": 167 } ] }, @@ -424,14 +436,16 @@ The following `products` query returns `ConfigurableProduct` information about t }, "attributes": [ { + "uid": "Y29uZmlndXJhYmxlLzkzLzU3", "label": "Purple", "code": "color", "value_index": 57 }, { + "uid": "Y29uZmlndXJhYmxlLzE0NC8xNjc=", "label": "S", "code": "size", - "value_index": 177 + "value_index": 167 } ] }, @@ -453,14 +467,16 @@ The following `products` query returns `ConfigurableProduct` information about t }, "attributes": [ { + "uid": "Y29uZmlndXJhYmxlLzkzLzUz", "label": "Green", "code": "color", "value_index": 53 }, { + "uid": "Y29uZmlndXJhYmxlLzE0NC8xNjg=", "label": "M", "code": "size", - "value_index": 178 + "value_index": 168 } ] }, @@ -482,14 +498,16 @@ The following `products` query returns `ConfigurableProduct` information about t }, "attributes": [ { + "uid": "Y29uZmlndXJhYmxlLzkzLzU2", "label": "Orange", "code": "color", "value_index": 56 }, { + "uid": "Y29uZmlndXJhYmxlLzE0NC8xNjg=", "label": "M", "code": "size", - "value_index": 178 + "value_index": 168 } ] }, @@ -511,14 +529,16 @@ The following `products` query returns `ConfigurableProduct` information about t }, "attributes": [ { + "uid": "Y29uZmlndXJhYmxlLzkzLzU3", "label": "Purple", "code": "color", "value_index": 57 }, { + "uid": "Y29uZmlndXJhYmxlLzE0NC8xNjg=", "label": "M", "code": "size", - "value_index": 178 + "value_index": 168 } ] }, @@ -540,14 +560,16 @@ The following `products` query returns `ConfigurableProduct` information about t }, "attributes": [ { + "uid": "Y29uZmlndXJhYmxlLzkzLzUz", "label": "Green", "code": "color", "value_index": 53 }, { + "uid": "Y29uZmlndXJhYmxlLzE0NC8xNjk=", "label": "L", "code": "size", - "value_index": 179 + "value_index": 169 } ] }, @@ -569,14 +591,16 @@ The following `products` query returns `ConfigurableProduct` information about t }, "attributes": [ { + "uid": "Y29uZmlndXJhYmxlLzkzLzU2", "label": "Orange", "code": "color", "value_index": 56 }, { + "uid": "Y29uZmlndXJhYmxlLzE0NC8xNjk=", "label": "L", "code": "size", - "value_index": 179 + "value_index": 169 } ] }, @@ -598,14 +622,16 @@ The following `products` query returns `ConfigurableProduct` information about t }, "attributes": [ { + "uid": "Y29uZmlndXJhYmxlLzkzLzU3", "label": "Purple", "code": "color", "value_index": 57 }, { + "uid": "Y29uZmlndXJhYmxlLzE0NC8xNjk=", "label": "L", "code": "size", - "value_index": 179 + "value_index": 169 } ] }, @@ -627,14 +653,16 @@ The following `products` query returns `ConfigurableProduct` information about t }, "attributes": [ { + "uid": "Y29uZmlndXJhYmxlLzkzLzUz", "label": "Green", "code": "color", "value_index": 53 }, { + "uid": "Y29uZmlndXJhYmxlLzE0NC8xNzA=", "label": "XL", "code": "size", - "value_index": 180 + "value_index": 170 } ] }, @@ -656,14 +684,16 @@ The following `products` query returns `ConfigurableProduct` information about t }, "attributes": [ { + "uid": "Y29uZmlndXJhYmxlLzkzLzU2", "label": "Orange", "code": "color", "value_index": 56 }, { + "uid": "Y29uZmlndXJhYmxlLzE0NC8xNzA=", "label": "XL", "code": "size", - "value_index": 180 + "value_index": 170 } ] }, @@ -685,14 +715,16 @@ The following `products` query returns `ConfigurableProduct` information about t }, "attributes": [ { + "uid": "Y29uZmlndXJhYmxlLzkzLzU3", "label": "Purple", "code": "color", "value_index": 57 }, { + "uid": "Y29uZmlndXJhYmxlLzE0NC8xNzA=", "label": "XL", "code": "size", - "value_index": 180 + "value_index": 170 } ] } diff --git a/src/guides/v2.4/graphql/interfaces/credit-memo-item-interface.md b/src/guides/v2.4/graphql/interfaces/credit-memo-item-interface.md new file mode 100644 index 00000000000..e9d93a38065 --- /dev/null +++ b/src/guides/v2.4/graphql/interfaces/credit-memo-item-interface.md @@ -0,0 +1,148 @@ +--- +group: graphql +title: CreditMemoItemInterface attributes and implementations +--- + +`CreditMemoItemInterface` provides details about items in a customer's order history that were refunded. It has the following implementations: + +* [`BundleCreditMemoItem`](#BundleCreditMemoItem) +* [`CreditMemoItem`](#CreditMemoItem) +* [`DownloadableCreditMemoItem`](#DownloadableCreditMemoItem) +* [`GiftCardCreditMemoItem`](#GiftCardCreditMemoItem) + +## Attributes + +The `CreditMemoItemInterface` describes a specific credit memo. + +{% include graphql/credit-memo-item-interface.md %} + +## Implementations + +### BundleCreditMemoItem attributes {#BundleCreditMemoItem} + +The `BundleCreditMemoItem` object defines the following attribute: + +Attribute | Data type | Description +--- | --- | --- +`bundle_options` | [[ItemSelectedBundleOption]](#ItemSelectedBundleOption) | A list of bundle options that are assigned to the bundle product + +{% include graphql/item-selected-bundle-option.md %} + +### CreditMemoItem attributes {#CreditMemoItem} + +The `CreditMemoItem` object does not introduce any additional attributes to `CreditMemoItemInterface`. + +### DownloadableCreditMemoItem attributes {#DownloadableCreditMemoItem} + +The `DownloadableCreditMemoItem` object defines the following attribute: + +Attribute | Data type | Description +--- | --- | --- +`downloadable_links` | [[DownloadableItemsLinks]](#DownloadableItemsLinks) | A list of downloadable links that were refunded from the downloadable product + +{% include graphql/downloadable-items-links.md %} + +### GiftCardCreditMemoItem attributes {#GiftCardCreditMemoItem} + +The `GiftCardCreditMemoItem` object defines the following attribute: + +Attribute | Data type | Description +--- | --- | --- +`gift_card` | [GiftCardItem](#GiftCardItem) | Selected gift card properties for an order item + +{% include graphql/gift-card-item.md %} + +## Example usage + +The following query returns items that were refunded in order ID `000000005`. The `BundleOrderItem` and `DownloadableOrderItem` fragments can contain item-specific information, but the only refunded item is a configurable product. + +**Request:** + +```graphql +{ + customer { + firstname + lastname + email + orders( + filter: { + number: { + match: "000000005" + } + }) { + items { + id + credit_memos { + id + items { + id + product_sku + product_name + order_item { + product_type + } + quantity_refunded + ... on BundleCreditMemoItem { + bundle_options { + id + values { + id + product_name + product_sku + quantity + price { + value + currency + } + } + } + } + ... on DownloadableCreditMemoItem { + downloadable_links { + uid + title + } + } + } + } + } + } + } +} +``` +**Response:** + +```json +{ + "data": { + "customer": { + "firstname": "Roni", + "lastname": "Costello", + "email": "roni_cost@example.com", + "orders": { + "items": [ + { + "id": "NQ==", + "credit_memos": [ + { + "id": "Mg==", + "items": [ + { + "id": "Mg==", + "product_sku": "WS12-XS-Orange", + "product_name": "Radiant Tee", + "order_item": { + "product_type": "configurable" + }, + "quantity_refunded": 1 + } + ] + } + ] + } + ] + } + } + } +} +``` diff --git a/src/guides/v2.4/graphql/interfaces/customizable-option-interface.md b/src/guides/v2.4/graphql/interfaces/customizable-option-interface.md index 6a3b63dd552..5f360a898b4 100644 --- a/src/guides/v2.4/graphql/interfaces/customizable-option-interface.md +++ b/src/guides/v2.4/graphql/interfaces/customizable-option-interface.md @@ -49,6 +49,7 @@ Attribute | Type | Description `price_type` | PriceTypeEnum | FIXED, PERCENT, or DYNAMIC `price` | Float | The price assigned to this option `sku` | String | The Stock Keeping Unit for this option +`uid` | ID! | A string that encodes option details ## CustomizableCheckboxOption object @@ -60,7 +61,7 @@ Attribute | Type | Description ### CustomizableCheckboxValue object -`CustomizableCheckboxValue` defines the attributes of a product whose page contains a customized set of checkbox values. +`CustomizableCheckboxValue` defines the attributes of a product whose page contains a customized set of checkbox values. Attribute | Type | Description --- | --- | --- @@ -70,6 +71,7 @@ Attribute | Type | Description `sku` | String | The Stock Keeping Unit for this option `sort_order` | Int | The order in which the option is displayed `title` | String | The display name for this option +`uid` | ID! | A string that encodes option details ## CustomizableDateOption object @@ -89,6 +91,7 @@ Attribute | Type | Description `price` | Float | The price assigned to this option `price_type` | PriceTypeEnum | FIXED, PERCENT, or DYNAMIC `sku` | String | The Stock Keeping Unit for this option +`uid` | ID! | A string that encodes option details ## CustomizableDropDownOption object @@ -110,6 +113,7 @@ Attribute | Type | Description `sku` | String | The Stock Keeping Unit for this option `sort_order` | Int | The order in which the option is displayed `title` | String | The display name for this option +`uid` | ID! | A string that encodes option details ## CustomizableFieldOption object @@ -130,6 +134,7 @@ Attribute | Type | Description `price_type` | PriceTypeEnum | FIXED, PERCENT, or DYNAMIC `price` | Float | The price of the custom value `sku` | String | The Stock Keeping Unit for this option +`uid` | ID! | A string that encodes option details ## CustomizableFileOption object @@ -158,6 +163,7 @@ Attribute | Type | Description `price_type` | PriceTypeEnum | FIXED, PERCENT, or DYNAMIC `price` | Float | The price assigned to this option `sku` | String | The Stock Keeping Unit for this option +`uid` | ID! | A string that encodes option details ## CustomizableMultipleOption object @@ -179,6 +185,7 @@ Attribute | Type | Description `sku` | String | The Stock Keeping Unit for this option `sort_order` | Int | The order in which the option is displayed `title` | String | The display name for this option +`uid` | ID! | A string that encodes option details ## CustomizableRadioOption object @@ -200,6 +207,7 @@ Attribute | Type | Description `sku` | String | The Stock Keeping Unit for this option `sort_order` | Int | The order in which the option is displayed `title` | String | The display name for this option## CustomizableRadioOption object +`uid` | ID! | A string that encodes option details `CustomizableRadioOption` contains information about a set of radio buttons that are defined as part of a customizable option. diff --git a/src/guides/v2.4/graphql/interfaces/downloadable-product.md b/src/guides/v2.4/graphql/interfaces/downloadable-product.md index 2ff58a6807c..895761934cd 100644 --- a/src/guides/v2.4/graphql/interfaces/downloadable-product.md +++ b/src/guides/v2.4/graphql/interfaces/downloadable-product.md @@ -47,6 +47,7 @@ Attribute | Type | Description `sample_url` | String | The URL to the downloadable sample `sort_order` | Int | A number indicating the sort order `title` | String | The display name of the link +`uid` | ID! | A string that encodes option details ## Example usage @@ -83,11 +84,11 @@ The following query returns information about downloadable product `240-LV04`, w ... on DownloadableProduct { links_title links_purchased_separately - downloadable_product_links { sample_url sort_order title + uid price } downloadable_product_samples { @@ -112,7 +113,7 @@ The following query returns information about downloadable product `240-LV04`, w "id": 47, "name": "Beginner's Yoga", "sku": "240-LV04", - "__typename": "downloadable", + "__typename": "DownloadableProduct", "price_range": { "minimum_price": { "regular_price": { @@ -125,9 +126,10 @@ The following query returns information about downloadable product `240-LV04`, w "links_purchased_separately": 0, "downloadable_product_links": [ { - "sample_url": null, + "sample_url": "http://example.com/downloadable/download/linkSample/link_id/1/", "sort_order": 1, "title": "Beginner's Yoga", + "uid": "ZG93bmxvYWRhYmxlLzE=", "price": 6 } ], @@ -135,17 +137,17 @@ The following query returns information about downloadable product `240-LV04`, w { "title": "Trailer #1", "sort_order": 1, - "sample_url": "/l/u/luma_background_-_model_against_fence_4_sec_.mp4" + "sample_url": "http://example.com/downloadable/download/sample/sample_id/1/" }, { "title": "Trailer #2", "sort_order": 1, - "sample_url": "/l/u/luma_background_-_model_against_fence_4_sec_.mp4" + "sample_url": "http://example.com/downloadable/download/sample/sample_id/2/" }, { "title": "Trailer #3", "sort_order": 1, - "sample_url": "/l/u/luma_background_-_model_against_fence_4_sec_.mp4" + "sample_url": "http://example.com/downloadable/download/sample/sample_id/3/" } ] } diff --git a/src/guides/v2.4/graphql/interfaces/gift-card-product.md b/src/guides/v2.4/graphql/interfaces/gift-card-product.md index 6319df4e007..3b4b2479933 100644 --- a/src/guides/v2.4/graphql/interfaces/gift-card-product.md +++ b/src/guides/v2.4/graphql/interfaces/gift-card-product.md @@ -23,6 +23,7 @@ Attribute | Type | Description `allow_message` | Boolean | Indicates whether the customer can provide a message to accompany the gift card `allow_open_amount` | Boolean | Indicates whether customers have the ability to set the value of the gift card `giftcard_amounts` | [`GiftCardAmounts`] | An array that contains information about the values and ID of a gift card +`gift_card_options` | [CustomizableOptionInterface!]! | An array of gift card options `giftcard_type` | `GiftCardTypeEnum` | Either VIRTUAL, PHYSICAL, or COMBINED `is_redeemable` | Boolean | Indicates whether the customer can redeem the value on the card for cash `lifetime` | Int | The number of days after purchase until the gift card expires. A null value means there is no limit @@ -37,6 +38,7 @@ The `GiftCardAmounts` object contains the following attributes: Attribute | Type | Description --- | --- | --- `attribute_id` | Int | An internal attribute ID +`uid` | String | A string that encodes option details `value_id` | Int | An ID that is assigned to each unique gift card amount `value` | Float | The value of the gift card `website_value` | Float |The value of the gift card diff --git a/src/guides/v2.4/graphql/interfaces/invoice-item-interface.md b/src/guides/v2.4/graphql/interfaces/invoice-item-interface.md new file mode 100644 index 00000000000..cf577fbae07 --- /dev/null +++ b/src/guides/v2.4/graphql/interfaces/invoice-item-interface.md @@ -0,0 +1,224 @@ +--- +group: graphql +title: InvoiceItemInterface attributes and implementations +--- + +`InvoiceItemInterface` provides details about items in a customer's order history that were invoiced. It has the following implementations: + +* [`BundleInvoiceItem`](#BundleInvoiceItem) +* [`DownloadableInvoiceItem`](#DownloadableInvoiceItem) +* [`GiftCardInvoiceItem`](#GiftCardInvoiceItem) +* [`InvoiceItem`](#InvoiceItem) + +## Attributes + +The `InvoiceItemInterface` describes a specific invoice. + +{% include graphql/invoice-item-interface.md %} + +## Implementations + +### BundleInvoiceItem attributes {#BundleInvoiceItem} + +The `BundleInvoiceItem` object defines the following attribute: + +Attribute | Data type | Description +--- | --- | --- +`bundle_options` | [[ItemSelectedBundleOption]](#ItemSelectedBundleOption) | A list of bundle options that are assigned to the bundle product + +{% include graphql/item-selected-bundle-option.md %} + +### DownloadableInvoiceItem attributes {#DownloadableInvoiceItem} + +The `DownloadableInvoiceItem` object defines the following attribute: + +Attribute | Data type | Description +--- | --- | --- +`downloadable_links` | [[DownloadableItemsLinks]](#DownloadableItemsLinks) | A list of downloadable links from the invoiced downloadable product + +{% include graphql/downloadable-items-links.md %} + +### GiftCardInvoiceItem attributes {#GiftCardInvoiceItem} + +The `GiftCardInvoiceItem` object defines the following attribute: + +Attribute | Data type | Description +--- | --- | --- +`gift_card` | [GiftCardItem](#GiftCardItem) | Selected gift card properties for an invoiced item + +{% include graphql/gift-card-item.md %} + +### InvoiceItem attributes {#InvoiceItem} + +The `InvoiceItem` object does not introduce any additional attributes to `InvoiceItemInterface`. + +## Example usage + +The following query returns invoice details about order ID `000000005`. The `BundleOrderItem` and `DownloadableOrderItem` fragments return item-specific information. + +**Request:** + +```graphql +{ + customer { + firstname + lastname + email + orders( + filter: { + number: { + match: "000000005" + } + }) { + items { + id + invoices { + id + items { + id + product_sku + product_name + quantity_invoiced + ... on BundleInvoiceItem { + bundle_options { + id + values { + id + product_name + product_sku + quantity + price { + value + currency + } + } + } + } + ... on DownloadableInvoiceItem { + id + downloadable_links { + uid + title + } + } + } + } + } + } + } +} + +``` +**Response:** + +```json +{ + "data": { + "customer": { + "firstname": "Roni", + "lastname": "Costello", + "email": "roni_cost@example.com", + "orders": { + "items": [ + { + "id": "NQ==", + "invoices": [ + { + "id": "NA==", + "items": [ + { + "id": "OQ==", + "product_sku": "240-LV06", + "product_name": "Yoga Adventure", + "quantity_invoiced": 1, + "downloadable_links": [ + { + "uid": "ZG93bmxvYWRhYmxlLzM=", + "title": "Yoga Adventure" + } + ] + }, + { + "id": "MTA=", + "product_sku": "24-WG080-24-WG082-blue-24-WG084-24-WG087-24-WG088", + "product_name": "Sprite Yoga Companion Kit", + "quantity_invoiced": 1, + "bundle_options": [ + { + "id": "Mg==", + "values": [ + { + "id": "MTg=", + "product_name": "Sprite Foam Yoga Brick", + "product_sku": "24-WG084", + "quantity": 1, + "price": { + "value": 5, + "currency": "USD" + } + } + ] + }, + { + "id": "NA==", + "values": [ + { + "id": "MjA=", + "product_name": "Sprite Foam Roller", + "product_sku": "24-WG088", + "quantity": 1, + "price": { + "value": 19, + "currency": "USD" + } + } + ] + }, + { + "id": "MQ==", + "values": [ + { + "id": "MTc=", + "product_name": "Sprite Stasis Ball 65 cm", + "product_sku": "24-WG082-blue", + "quantity": 1, + "price": { + "value": 27, + "currency": "USD" + } + } + ] + }, + { + "id": "Mw==", + "values": [ + { + "id": "MTk=", + "product_name": "Sprite Yoga Strap 10 foot", + "product_sku": "24-WG087", + "quantity": 1, + "price": { + "value": 21, + "currency": "USD" + } + } + ] + } + ] + }, + { + "id": "MTU=", + "product_sku": "WS12-XS-Orange", + "product_name": "Radiant Tee", + "quantity_invoiced": 1 + } + ] + } + ] + } + ] + } + } + } +} +``` diff --git a/src/guides/v2.4/graphql/interfaces/order-item-interface.md b/src/guides/v2.4/graphql/interfaces/order-item-interface.md new file mode 100644 index 00000000000..da31bf1c77c --- /dev/null +++ b/src/guides/v2.4/graphql/interfaces/order-item-interface.md @@ -0,0 +1,234 @@ +--- +group: graphql +title: OrderItemInterface attributes and implementations +--- + +`OrderItemInterface` provides details about items in a customer's order history. It has the following implementations: + +* [`OrderItem`](#OrderItem) +* [`BundleOrderItem`](#BundleOrderItem) +* [`DownloadableOrderItem`](#DownloadableOrderItem) +* [`GiftCardOrderItem`](#GiftCardOrderItem) + +## Attributes + +{% include graphql/order-item-interface.md %} + +## Implementations + +### OrderItem attributes {#OrderItem} + +The `OrderItem` object does not introduce any additional attributes to `OrderItemInterface`. + +### BundleOrderItem attributes {#BundleOrderItem} + +The `BundleOrderItem` object defines the following attribute: + +Attribute | Data type | Description +--- | --- | --- +`bundle_options` | [[ItemSelectedBundleOption]](#ItemSelectedBundleOption) | A list of bundle options that are assigned to the bundle product + +{% include graphql/item-selected-bundle-option.md %} + +### DownloadableOrderItem attributes {#DownloadableOrderItem} + +The `DownloadableOrderItem` object defines the following attribute: + +Attribute | Data type | Description +--- | --- | --- +`downloadable_links` | [[DownloadableItemsLinks]](#DownloadableItemsLinks) | A list of downloadable links that were ordered from the downloadable product + +{% include graphql/downloadable-items-links.md %} + +### GiftCardOrderItem attributes {#GiftCardOrderItem} + +The `GiftCardOrderItem` object defines the following attribute: + +Attribute | Data type | Description +--- | --- | --- +`gift_card` | [GiftCardItem](#GiftCardItem) | Selected gift card properties for an order item + +{% include graphql/gift-card-item.md %} + +## Example usage + +The following query returns details about order ID `000000005`. The `BundleOrderItem` and `DownloadableOrderItem` fragments return item-specific information. + +**Request:** + +```graphql +{ + customer { + firstname + lastname + email + orders( + filter: { + number: { + eq: "000000005" + } + }) { + items { + id + items { + id + product_name + product_sku + product_type + quantity_ordered + quantity_invoiced + quantity_shipped + quantity_refunded + ...on BundleOrderItem { + bundle_options { + id + label + values { + id + product_name + product_sku + quantity + price { + value + currency + } + } + } + } + ...on DownloadableOrderItem { + downloadable_links { + uid + title + } + } + } + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "customer": { + "firstname": "Roni", + "lastname": "Costello", + "email": "roni_cost@example.com", + "orders": { + "items": [ + { + "id": "NQ==", + "items": [ + { + "id": "MTU=", + "product_name": "Yoga Adventure", + "product_sku": "240-LV06", + "product_type": "downloadable", + "quantity_ordered": 1, + "quantity_invoiced": 1, + "quantity_shipped": 0, + "quantity_refunded": 0, + "downloadable_links": [ + { + "uid": "ZG93bmxvYWRhYmxlLzM=", + "title": "Yoga Adventure" + } + ] + }, + { + "id": "MTY=", + "product_name": "Sprite Yoga Companion Kit", + "product_sku": "24-WG080-24-WG082-blue-24-WG084-24-WG087-24-WG088", + "product_type": "bundle", + "quantity_ordered": 1, + "quantity_invoiced": 1, + "quantity_shipped": 1, + "quantity_refunded": 0, + "bundle_options": [ + { + "id": "Mg==", + "label": "Sprite Foam Yoga Brick", + "values": [ + { + "id": "MTg=", + "product_name": "Sprite Foam Yoga Brick", + "product_sku": "24-WG084", + "quantity": 1, + "price": { + "value": 5, + "currency": "USD" + } + } + ] + }, + { + "id": "NA==", + "label": "Sprite Foam Roller", + "values": [ + { + "id": "MjA=", + "product_name": "Sprite Foam Roller", + "product_sku": "24-WG088", + "quantity": 1, + "price": { + "value": 19, + "currency": "USD" + } + } + ] + }, + { + "id": "MQ==", + "label": "Sprite Stasis Ball", + "values": [ + { + "id": "MTc=", + "product_name": "Sprite Stasis Ball 65 cm", + "product_sku": "24-WG082-blue", + "quantity": 1, + "price": { + "value": 27, + "currency": "USD" + } + } + ] + }, + { + "id": "Mw==", + "label": "Sprite Yoga Strap", + "values": [ + { + "id": "MTk=", + "product_name": "Sprite Yoga Strap 10 foot", + "product_sku": "24-WG087", + "quantity": 1, + "price": { + "value": 21, + "currency": "USD" + } + } + ] + } + ] + }, + { + "id": "MjE=", + "product_name": "Radiant Tee", + "product_sku": "WS12-XS-Orange", + "product_type": "configurable", + "quantity_ordered": 1, + "quantity_invoiced": 1, + "quantity_shipped": 1, + "quantity_refunded": 1 + } + ] + } + ] + } + } + } +} +``` diff --git a/src/guides/v2.4/graphql/interfaces/product-interface.md b/src/guides/v2.4/graphql/interfaces/product-interface.md index f9cd8c4c00d..dd885643331 100644 --- a/src/guides/v2.4/graphql/interfaces/product-interface.md +++ b/src/guides/v2.4/graphql/interfaces/product-interface.md @@ -50,7 +50,10 @@ Attribute | Data type | Description `price_range` | [PriceRange!](#PriceRange) | A `PriceRange` object, indicating the range of prices for the product `price_tiers` | [TierPrice] | An array of `TierPrice` objects `product_links` | [ProductLinksInterface] | An array of [ProductLinks](#ProductLinks) objects +`rating_summary` | Float! | The average of all the ratings given to the product `related_products` | [ProductInterface] | An array of related products +`review_count` | Int! | The total count of all the reviews given to the product +`reviews(pageSize: Int = 20 currentPage: Int = 1)` | [ProductReviews!](#ProductReviews) | The list of reviews of the product `short_description` | ComplexTextValue | An object that contains a short description of the product. Its use depends on the store's theme. The object can include simple HTML tags `sku` | String | A number or code assigned to a product to identify the product, options, price, and manufacturer `small_image` | [ProductImage](#ProductImage) | An object that contains the URL and label for the small image used on catalog pages @@ -157,6 +160,19 @@ Attribute | Data Type | Description `code` | PriceAdjustmentCodesEnum | One of `tax`, `weee`, or `weee_tax`. `description` | PriceAdjustmentDescriptionEnum | Indicates whether the entity described by the code attribute is included or excluded from the adjustment. +#### ProductReviews object {#ProductReviews} + +`ProductReviews` contains an array of reviews written about the product. + +Attribute | Data Type | Description +--- | --- | --- +`items` | [ProductReview]! | An array of product reviews +`page_info` | [SearchResultPageInfo!]({{page.baseurl}}/graphql/queries/products.html#SearchResultPageInfo) | Metadata for pagination rendering + +#### ProductReview object {#ProductReview} + +{% include graphql/product-review.md %} + #### ProductLinks object {#ProductLinks} `ProductLinks` contains information about linked products, including the link type and product type of each item. diff --git a/src/guides/v2.4/graphql/interfaces/shipment-item-interface.md b/src/guides/v2.4/graphql/interfaces/shipment-item-interface.md new file mode 100644 index 00000000000..3c18ed987b3 --- /dev/null +++ b/src/guides/v2.4/graphql/interfaces/shipment-item-interface.md @@ -0,0 +1,191 @@ +--- +group: graphql +title: ShipmentItemInterface attributes and implementations +--- + +`ShipmentItemInterface` provides details about items in a customer's order history that were shipped. It has the following implementations: + +* [`BundleShipmentItem`](#BundleShipmentItem) +* [`GiftCardShipmentItem`](#GiftCardShipmentItem) +* [`ShipmentItem`](#ShipmentItem) + +## Attributes + +The `ShipmentItemInterface` describes a specific shipmemt. + +{% include graphql/shipment-item-interface.md %} + +## Implementations + +### BundleShipmentItem attributes {#BundleShipmentItem} + +The `BundleShipmentItem` object defines the following attribute: + +Attribute | Data type | Description +--- | --- | --- +`bundle_options` | [[ItemSelectedBundleOption]](#ItemSelectedBundleOption) | A list of bundle options that are assigned to the bundle product + +{% include graphql/item-selected-bundle-option.md %} + +### GiftCardShipmentItem attributes {#GiftCardShipmentItem} + +The `GiftCardShipmentItem` object defines the following attribute: + +Attribute | Data type | Description +--- | --- | --- +`gift_card` | [GiftCardItem](#GiftCardItem) | Selected properties for a shipped gift card + +{% include graphql/gift-card-item.md %} + +### ShipmentItem attributes {#ShipmentItem} + +The `ShipmentItem` object does not introduce any additional attributes to `ShipmentItemInterface`. + +## Example usage + +The following query returns shipping details about order ID `000000005`. The `BundleOrderItem` fragment returns item-specific information. The order also included a downloadable product, but downloadable products are not shipped. + +**Request:** + +```graphql +{ + customer { + firstname + lastname + email + orders( + filter: { + number: { + match: "000000005" + } + }) { + items { + id + shipments { + id + items { + id + product_sku + product_name + ... on BundleShipmentItem { + bundle_options { + id + values { + id + product_name + product_sku + quantity + price { + value + currency + } + } + } + } + } + } + } + } + } +} + +``` +**Response:** + +```json +{ + "data": { + "customer": { + "firstname": "Roni", + "lastname": "Costello", + "email": "roni_cost@example.com", + "orders": { + "items": [ + { + "id": "NQ==", + "shipments": [ + { + "id": "MDAwMDAwMDA0", + "items": [ + { + "id": "Ng==", + "product_sku": "24-WG080-24-WG082-blue-24-WG084-24-WG087-24-WG088", + "product_name": "Sprite Yoga Companion Kit", + "bundle_options": [ + { + "id": "Mg==", + "values": [ + { + "id": "MTg=", + "product_name": "Sprite Foam Yoga Brick", + "product_sku": "24-WG084", + "quantity": 1, + "price": { + "value": 5, + "currency": "USD" + } + } + ] + }, + { + "id": "NA==", + "values": [ + { + "id": "MjA=", + "product_name": "Sprite Foam Roller", + "product_sku": "24-WG088", + "quantity": 1, + "price": { + "value": 19, + "currency": "USD" + } + } + ] + }, + { + "id": "MQ==", + "values": [ + { + "id": "MTc=", + "product_name": "Sprite Stasis Ball 65 cm", + "product_sku": "24-WG082-blue", + "quantity": 1, + "price": { + "value": 27, + "currency": "USD" + } + } + ] + }, + { + "id": "Mw==", + "values": [ + { + "id": "MTk=", + "product_name": "Sprite Yoga Strap 10 foot", + "product_sku": "24-WG087", + "quantity": 1, + "price": { + "value": 21, + "currency": "USD" + } + } + ] + } + ] + }, + { + "id": "Nw==", + "product_sku": "WS12-XS-Orange", + "product_name": "Radiant Tee" + } + ] + } + ] + } + ] + } + } + } +} +``` diff --git a/src/guides/v2.4/graphql/mutations/add-bundle-products.md b/src/guides/v2.4/graphql/mutations/add-bundle-products.md deleted file mode 120000 index a9899c6c8a9..00000000000 --- a/src/guides/v2.4/graphql/mutations/add-bundle-products.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/mutations/add-bundle-products.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/mutations/add-bundle-products.md b/src/guides/v2.4/graphql/mutations/add-bundle-products.md new file mode 100644 index 00000000000..c459d940d20 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/add-bundle-products.md @@ -0,0 +1,251 @@ +--- +group: graphql +title: addBundleProductsToCart mutation +contributor_name: Atwix +contributor_link: https://www.atwix.com/ +--- + +{:.bs-callout-warning} +Magento recommends using the [addProductsToCart mutation]({{page.baseurl}}/graphql/mutations/add-products-to-cart.html) to add any type of product to the cart. + +Use the `addBundleProductsToCart` mutation to add bundle products to a specific cart. + +## Syntax + +`mutation: {addBundleProductsToCart(input: AddBundleProductsToCartInput): {AddBundleProductsToCartOutput}}` + +## Example usage + +The following example uses a bundle product "Sprite Yoga Companion Kit" from Magento sample data. +The SKU of this product is: **24-WG080** + +This example adds one bundle product with following children to the specified shopping cart: + +- Sprite Stasis Ball 65 cm (x1) +- Sprite Foam Yoga Brick (x2) +- Sprite Yoga Strap 10 foot (x1) +- Sprite Foam Roller (x1) + +The `cart_id` used in this example was [generated]({{ page.baseurl }}/graphql/mutations/create-empty-cart.html) by creating an empty cart. + +**Request:** + +```graphql +mutation { + addBundleProductsToCart( + input: { + cart_id: "wARFaDnHva0tgzuforUYR4rvXincj5eu" + cart_items: [ + { + data: { + sku: "24-WG080" + quantity: 1 + } + bundle_options: [ + { + id: 1 + quantity: 1 + value: [ + "2" + ] + }, + { + id: 2 + quantity: 2 + value: [ + "4" + ] + }, + { + id: 3 + quantity: 1 + value: [ + "7" + ] + }, + { + id: 4 + quantity: 1 + value: [ + "8" + ] + } + ] + }, + ] + }) { + cart { + items { + id + quantity + product { + sku + } + ... on BundleCartItem { + bundle_options { + id + label + type + values { + id + label + price + quantity + } + } + } + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "addBundleProductsToCart": { + "cart": { + "items": [ + { + "id": "7", + "quantity": 1, + "product": { + "sku": "24-WG080" + }, + "bundle_options": [ + { + "id": 1, + "label": "Sprite Stasis Ball", + "type": "radio", + "values": [ + { + "id": 2, + "label": "Sprite Stasis Ball 65 cm", + "price": 27, + "quantity": 1 + } + ] + }, + { + "id": 2, + "label": "Sprite Foam Yoga Brick", + "type": "radio", + "values": [ + { + "id": 4, + "label": "Sprite Foam Yoga Brick", + "price": 5, + "quantity": 2 + } + ] + }, + { + "id": 3, + "label": "Sprite Yoga Strap", + "type": "radio", + "values": [ + { + "id": 7, + "label": "Sprite Yoga Strap 10 foot", + "price": 21, + "quantity": 1 + } + ] + }, + { + "id": 4, + "label": "Sprite Foam Roller", + "type": "radio", + "values": [ + { + "id": 8, + "label": "Sprite Foam Roller", + "price": 19, + "quantity": 1 + } + ] + } + ] + } + ] + } + } + } +} +``` + +## Input attributes + +The top-level `AddBundleProductsToCartInput` object is listed first. All interfaces and child objects are listed in alphabetical order. + +### AddBundleProductsToCartInput object + +The `AddBundleProductsToCartInput` object contains the following attributes: + +Attribute | Type | Description +--- | --- | --- +`cart_id` | String! | The unique ID that identifies the customer's cart +`cart_items` | [[BundleProductCartItemInput!]!](#bundleProductCartItemInput) | An array of bundle items to add to the cart + +### BundleProductCartItemInput object {#bundleProductCartItemInput} + +The `BundleProductCartItemInput` object contains the following attributes: + +Attribute | Type | Description +--- | --- | --- +`bundle_options` | [[BundleOptionInput!]!](#bundleOptionInput) | An object that contains an array of options of the bundle product with the chosen value and quantity of each option +`customizable_options` | [[CustomizableOptionInput!]](#customOptionInput) | An object that contains the ID and value of the product +`data` | [CartItemInput!](#cartItemInput) | An object that contains the quantity and SKU of the bundle product + +### BundleOptionInput object {#bundleOptionInput} + +The `BundleOptionInput` object contains the following attributes: + +Attribute | Type | Description +--- | --- | --- +`id` | Int! | ID of the option +`quantity` | Float! | The number of a specific child item to add to the cart +`value` | [String!]! | An array with the chosen value of the option + +### CartItemInput object {#cartItemInput} + +The `CartItemInput` object contains the following attributes: + +Attribute | Type | Description +--- | --- | --- +`quantity` | Float! | The number of items to add to the cart +`sku` | String! | The SKU of the product + +### CustomizableOptionInput object {#customOptionInput} + +The `CustomizableOptionInput` object must contain the following attributes: + +{% include graphql/customizable-option-input.md %} + +## Output attributes + +The `AddBundleProductsToCartOutput` object contains the `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + +{% include graphql/cart-object-24.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. + +## Errors + +Error | Description +--- | --- +`Could not find a product with SKU "XXX"` | A simple product with the SKU specified in the `data.sku` argument does not exist. +`Could not find a cart with ID "XXX"` | The specified `cart_id` value does not exist in the `quote_id_mask` database table. +`Required parameter "cart_id" is missing` | The `cart_id` argument is omitted or contains an empty value. + +## Related topics + +- [Bundle product data types]({{page.baseurl}}/graphql/interfaces/bundle-product.html) diff --git a/src/guides/v2.4/graphql/mutations/add-configurable-products.md b/src/guides/v2.4/graphql/mutations/add-configurable-products.md deleted file mode 120000 index d1afdbe6764..00000000000 --- a/src/guides/v2.4/graphql/mutations/add-configurable-products.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/mutations/add-configurable-products.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/mutations/add-configurable-products.md b/src/guides/v2.4/graphql/mutations/add-configurable-products.md new file mode 100644 index 00000000000..0c83d8a6bf1 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/add-configurable-products.md @@ -0,0 +1,151 @@ +--- +group: graphql +title: addConfigurableProductsToCart mutation +--- + +{:.bs-callout-warning} +Magento recommends using the [addProductsToCart mutation]({{page.baseurl}}/graphql/mutations/add-products-to-cart.html) to add any type of product to the cart. + +Use the `addConfigurableProductsToCart` mutation to add configurable products to a specific cart. + +## Syntax + +`mutation: {addConfigurableProductsToCart(input: AddConfigurableProductsToCartInput) {AddConfigurableProductsToCartOutput}}` + +## Example usage + +The following example adds two black Teton Pullover Hoodies size extra-small to the specified shopping cart. The `cart_id` used in this example was [generated]({{ page.baseurl }}/graphql/mutations/create-empty-cart.html) by creating an empty cart. + +**Request:** + +```graphql +mutation { + addConfigurableProductsToCart( + input: { + cart_id: "4JQaNVJokOpFxrykGVvYrjhiNv9qt31C" + cart_items: [ + { + parent_sku: "MH02" + data: { + quantity: 2 + sku: "MH02-XS-Black" + } + } + ] + } + ) { + cart { + items { + id + quantity + product { + name + sku + } + ... on ConfigurableCartItem { + configurable_options { + option_label + } + } + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "addConfigurableProductsToCart": { + "cart": { + "items": [ + { + "id": "5", + "quantity": 2, + "product": { + "name": "Teton Pullover Hoodie", + "sku": "MH02" + }, + "configurable_options": [ + { + "option_label": "Color" + }, + { + "option_label": "Size" + } + ] + } + ] + } + } + } +} +``` + +## Input attributes + +### AddConfigurableProductsToCartInput object + +The `AddConfigurableProductsToCartInput` object contains the following attributes: + +Attribute | Type | Description +--- | --- | --- +`cart_id` | String! | The unique ID that identifies the customer's cart +`cart_items` | [[ConfigurableProductCartItemInput]](#configProdCartItemInput) | An array of configurable items to add to the cart + +### ConfigurableProductCartItemInput object {#configProdCartItemInput} + +The `ConfigurableProductCartItemInput` object contains the following attributes: + +Attribute | Type | Description +--- | --- | --- +`customizable_options` | [CustomizableOptionInput](#customOptionInput) | An object that contains the ID and value of the product +`data` | [CartItemInput!](#cartItemInput) | An object that contains the quantity and SKU of the configurable product +`parent_sku` | String | The SKU of the simple product's parent configurable product. If you do not specify this attribute, Magento treats the product being added to the cart as a simple product +`variant_sku` | String | Deprecated. Use `CartItemInput.sku` instead. The SKU of the simple product + +### CustomizableOptionInput object {#customOptionInput} + +The `CustomizableOptionInput` object contains the following attributes: + +Attribute | Type | Description +--- | --- | --- +`id` | Int | The ID of the customizable option +`value` | String | The value of the customizable option. For example, if color was the customizable option, a possible value could be `black` + +### CartItemInput object {#cartItemInput} + +The `CartItemInput` object must contain the following attributes: + +{% include graphql/cart-item-input.md %} + +## Output attributes + +The `AddConfigurableProductsToCartOutput` object contains the `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + +{% include graphql/cart-object-24.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. + +## Errors + +Error | Description +--- | --- +`Could not add the product with SKU configurable to the shopping cart: The product that was requested doesn't exist. Verify the product and try again.` | The simple product with the SKU specified in the `data`.`sku` attribute does not exist. +`Could not find a product with SKU "XXX"` | The configurable product with SKU specified in the `parent_sku` argument does not exist. +`Could not find specified product.` | The simple product specified in the `data`.`sku` argument is not assigned to the configurable product provided in the `parent_sku` attribute. +`Required parameter "cart_id" is missing` | The `cart_id` argument was omitted or contains an empty value. +`Required parameter "email" is missing` | The `email` argument was omitted or contains an empty value. +`The requested qty is not available` | The requested quantity specified `data`.`quantity` is not available. + +## Related topics + +- [Configurable product data types]({{page.baseurl}}/graphql/interfaces/configurable-product.html) diff --git a/src/guides/v2.4/graphql/mutations/add-downloadable-products.md b/src/guides/v2.4/graphql/mutations/add-downloadable-products.md deleted file mode 120000 index 1ff93b594f8..00000000000 --- a/src/guides/v2.4/graphql/mutations/add-downloadable-products.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/mutations/add-downloadable-products.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/mutations/add-downloadable-products.md b/src/guides/v2.4/graphql/mutations/add-downloadable-products.md new file mode 100644 index 00000000000..fae34653084 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/add-downloadable-products.md @@ -0,0 +1,266 @@ +--- +group: graphql +title: addDownloadableProductsToCart mutation +contributor_name: Atwix +contributor_link: https://www.atwix.com/ +--- + +{:.bs-callout-warning} +Magento recommends using the [addProductsToCart mutation]({{page.baseurl}}/graphql/mutations/add-products-to-cart.html) to add any type of product to the cart. + +A downloadable product can be anything that you can deliver as a file, such as an eBook, music, video, software application, or an update. To add a downloadable product to a cart, you must provide the cart ID, the SKU, and the quantity. In some cases, you must include the IDs for downloadable product links. You can also optionally specify customizable options. + +## Syntax + +```graphql +mutation: { + addDownloadableProductsToCart( + input: AddDownloadableProductsToCartInput + ): { + AddDownloadableProductsToCartOutput + } +} +``` + +## Example usage + +The following examples show how to add a downloadable product to a shopping cart , depending on whether the **Links can be purchased separately** option is selected on the **Downloadable Information** section of the product page. + +### Add a downloadable product to a cart with `Links can be purchased separately` enabled + +The following example shows how to add a downloadable product in which the **Links can be purchased separately** option is enabled. The payload includes custom downloadable links `Episode 2` and `Episode 3`. + +**Request:** + +```graphql +mutation { + addDownloadableProductsToCart( + input: { + cart_id: "gMV2BFQuNGiQmTnepQlMGko7Xc4P3X1w" + cart_items: { + data: { + sku: "240-LV09" + quantity: 1 + } + downloadable_product_links: [ + { + link_id: 7 # Episode 2 + } + { + link_id: 8 # Episode 3 + } + ] + } + } + ) { + cart { + items { + product { + sku + } + quantity + ... on DownloadableCartItem { + links { + title + price + } + samples { + title + sample_url + } + } + } + } + } +} +``` + +**Response:** + +```text +{ + "data": { + "addDownloadableProductsToCart": { + "cart": { + "items": [ + { + "product": { + "sku": "240-LV09" + }, + "quantity": 1, + "links": [ + { + "title": "Episode 2", + "price": 9 + }, + { + "title": "Episode 3", + "price": 9 + } + ], + "samples": [ + { + "title": "Trailer #1", + "sample_url": "https:///downloadable/download/sample/sample_id/16/" + }, + { + "title": "Trailer #2", + "sample_url": "https:///downloadable/download/sample/sample_id/17/" + }, + { + "title": "Trailer #3", + "sample_url": "https:///downloadable/download/sample/sample_id/18/" + } + ] + } + ] + } + } + } +} +``` + +### Add a downloadable product to a cart with disabled `Links can be purchased separately` + +The following example shows how to add a downloadable product in which the **Links can be purchased separately** option is disabled. All downloadable links are added to the cart automatically. + +**Request:** + +```graphql +mutation { + addDownloadableProductsToCart( + input: { + cart_id: "gMV2BFQuNGiQmTnepQlMGko7Xc4P3X1w" + cart_items: { + data: { + sku: "240-LV07" + quantity: 1 + } + } + } + ) { + cart { + items { + product { + sku + } + quantity + ... on DownloadableCartItem { + links { + title + price + } + samples { + title + sample_url + } + } + } + } + } +} +``` + +**Response:** + +```text +{ + "data": { + "addDownloadableProductsToCart": { + "cart": { + "items": [ + { + "product": { + "sku": "240-LV07" + }, + "quantity": 2, + "links": [ + { + "title": "Solo Power Circuit", + "price": 14 + } + ], + "samples": [ + { + "title": "Trailer #1", + "sample_url": "https:///downloadable/download/sample/sample_id/10/" + }, + { + "title": "Trailer #2", + "sample_url": "https:///downloadable/download/sample/sample_id/11/" + }, + { + "title": "Trailer #3", + "sample_url": "https:///downloadable/download/sample/sample_id/12/" + } + ] + } + ] + } + } + } +} +``` + +## Input attributes + +The top-level `AddDownloadableProductsToCartInput` object is listed first. All child objects are listed in alphabetical order. + +### AddDownloadableProductsToCartInput object {#AddDownloadableProductsToCartInput} + +The `AddDownloadableProductsToCartInput` object must contain the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`cart_id` | String! | The unique ID that identifies the customer's cart +`cart_items` | [[DownloadableProductCartItemInput!]!](#DownloadableProductCartItemInput) | Contains the cart item IDs and quantity of each item + +### CartItemInput object {#CartItemInputVirtual} + +The `CartItemInput` object must contain the following attributes: + +{% include graphql/cart-item-input.md %} + +### CustomizableOptionInput object {#CustomizableOptionInputVirtual} + +The `CustomizableOptionInput` object must contain the following attributes: + +{% include graphql/customizable-option-input.md %} + +### DownloadableProductCartItemInput object {#DownloadableProductCartItemInput} + +The `DownloadableProductCartItemInput` object can contain the following attribute: + +Attribute | Data Type | Description +--- | --- | --- +`customizable_options` |[[CustomizableOptionInput!]](#CustomizableOptionInputVirtual) | An array that defines customizable options for the product +`data` | [CartItemInput!](#CartItemInputVirtual) | Required. An object containing the `sku` and `quantity` of the product +`downloadable_product_links` | [[DownloadableProductLinksInput!]](#DownloadableProductLinksInput) | An object containing the `link_id` of the downloadable product link + +### DownloadableProductLinksInput object {#DownloadableProductLinksInput} + +If specified, the `DownloadableProductLinksInput` object must contain the following attribute. + +Attribute | Data Type | Description +--- | --- | --- +`link_id` | Int! | A unique ID (`downloadable_link`.`link_id`) of the downloadable product link + +## Output attributes + +The `AddDownloadableProductsToCartOutput` object contains the `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + +{% include graphql/cart-object-24.md %} + +## Errors + +Error | Description +--- | --- +`Required parameter "cart_id" is missing` | The mutation does not contain a `cart_id` argument. +`Required parameter "cart_items" is missing` | The `cart_items` argument is empty or is not of type `array`. +`Please specify product link(s).` | You tried to add a downloadable product in which the `Links can be purchased separately` option is enabled, but you did not specify individual product links. diff --git a/src/guides/v2.4/graphql/mutations/add-products-to-cart.md b/src/guides/v2.4/graphql/mutations/add-products-to-cart.md new file mode 100644 index 00000000000..ea7aa9f92d1 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/add-products-to-cart.md @@ -0,0 +1,371 @@ +--- +group: graphql +title: addProductsToCart mutation +contributor_name: Atwix +contributor_link: https://www.atwix.com/ +--- + +The `addProductsToCart` mutation adds any type of product to the shopping cart. It streamlines the process of adding products by allowing you to specify multiple product types in a single call. Magento recommends using this mutation to add products to the cart instead of the single-purpose mutations, such as `addSimpleProductsToCart` and `addConfigurableProductsToCart`. + +You must specify the Cart ID along with the list of SKU and quantity pairs as parameters to add the products to the shopping cart. + +The `CartItemInput` object now contains the `selected_options` and `enter_options` attributes. A selected option is predefined, and the shopper chooses from a set of possible values. Entered options generally contain text the shopper types, but other possibilities exist. + +Selected options can be used in the following product types: + +* Customizable options such those presented in drop-down menu, radio buttons, and checkboxes + +* Bundle products + +* Configurable products + +* Downloadable products + +* Gift cards (amount) + +* Grouped products + +Entered options can be used in the following product types: + +* Customizable options such as those presented in a text field, text area, or file + +* Gift cards (custom amounts, sender and recipient fields, messages) + +Use the `uid` attribute to reference selected or entered options. For entered options, the `uid` represents an option value, while for entered options, the `uid` represents an option. Each `uid` is unique across different options in a set. + +## Syntax + +```graphql +mutation { + addProductsToCart( + cartId: String! + cartItems: [CartItemInput!]! + ) { + AddProductsToCartOutput + } +} +``` + +## Example usage + +These examples show the minimal payload for adding products, including those with customizable options. + +### Add a product to a cart + +The following example adds a simple product to a cart. + +**Request:** + +```graphql +mutation { + addProductsToCart( + cartId: "8k0Q4MpH2IGahWrTRtqM61YV2MtLPApz" + cartItems: [ + { + quantity: 1 + sku: "24-MB04" + } + ] + ) { + cart { + items { + id + product { + name + sku + } + quantity + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "addProductsToCart": { + "cart": { + "items": [ + { + "id": "346", + "product": { + "name": "Strive Shoulder Pack", + "sku": "24-MB04" + }, + "quantity": 1 + } + ] + } + } + } +} +``` + +### Add a configurable product to a cart + +The following examples show two ways to add the same configurable product (`WSH12`, a pair of shorts) to the cart. + +#### Specify a parent and a child SKU + +In this example, the configurable product SKU is the `parent_sku` attribute, while the simple product variant is the `sku` attribute. + +**Request:** + +```graphql +mutation { + addProductsToCart( + cartId: "8k0Q4MpH2IGahWrTRtqM61YV2MtLPApz" + cartItems: [ + { + quantity: 1 + parent_sku: "WSH12" + sku: "WSH12-28-Green" + } + ] + ) { + cart { + items { + id + product { + name + sku + } + quantity + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "addProductsToCart": { + "cart": { + "items": [ + { + "id": "24", + "product": { + "name": "Erika Running Short", + "sku": "WSH12" + }, + "quantity": 1 + }, + { + "id": "26", + "product": { + "name": "Erika Running Short-28-Green", + "sku": "WSH12-28-Green" + }, + "quantity": 1 + } + ] + } + } + } +} +``` + +#### Specify the SKU with selected options + +In this example, the mutation specifies the size and color as selected options. The first option specifies the color, while the second option specifies the size. + +**Request:** + +```graphql +mutation { + addProductsToCart( + cartId: "HbpLADRmSo5h2dCdF85O5wCaVnrworKL" + cartItems: [ + { + quantity: 1 + sku: "WSH12" + selected_options: ["Y29uZmlndXJhYmxlLzkzLzUz","Y29uZmlndXJhYmxlLzE0NC8xNzE="] + } + ] + ) { + cart { + items { + id + product { + name + sku + } + ... on ConfigurableCartItem { + configurable_options { + id + option_label + value_id + value_label + } + } + quantity + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "addProductsToCart": { + "cart": { + "items": [ + { + "id": "24", + "product": { + "name": "Erika Running Short", + "sku": "WSH12" + }, + "configurable_options": [ + { + "id": 93, + "option_label": "Color", + "value_id": 53, + "value_label": "Green" + }, + { + "id": 144, + "option_label": "Size", + "value_id": 171, + "value_label": "28" + } + ], + "quantity": 2 + } + ] + } + } + } +} +``` + +### Add a product with entered options + +The following example adds a simple product with a customizable option to the cart. The customizable option allows the shopper to specify a message for engraving. + +**Request:** + +```graphql +mutation { + addProductsToCart( + cartId: "8k0Q4MpH2IGahWrTRtqM61YV2MtLPApz" + cartItems: [ + { + quantity: 1 + sku: "24-WG03" + entered_options: [{ + uid: "Y3VzdG9tLW9wdGlvbi81Mg==" + value: "Congrats, Julie!" + }] + } + ] + ) { + cart { + items { + id + product { + name + sku + } + ... on SimpleCartItem { + customizable_options { + id + label + values { + id + value + } + } + } + quantity + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "addProductsToCart": { + "cart": { + "items": [ + { + "id": "350", + "product": { + "name": "Clamber Watch", + "sku": "24-WG03" + }, + "customizable_options": [ + { + "id": 52, + "label": "Congrats, Julie!", + "values": [ + { + "id": 1184, + "value": "" + } + ] + } + ], + "quantity": 1 + } + ] + } + } + } +} +``` + +## Input attributes + +The `addProductsToCart` mutation must contain the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`cartId` | String! | The unique ID that identifies the customer's cart +`cartItems` | [[CartItemInput!]!](#CartItemInput) | Contains the cart item IDs and quantity of each item + +### CartItemInput object {#CartItemInput} + +The `CartItemInput` object must contain the following attributes: + +{% include graphql/cart-item-input.md %} + +### EnteredOptionInput object {#EnteredOptionInput} + +{% include graphql/entered-option-input.md %} + +## Output attributes + +The `AddProductsToCartOutput` object contains the `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + +{% include graphql/cart-object.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. + +## Errors + +Code | Error | Description +--- | --- | --- +`PRODUCT_NOT_FOUND` | `Could not find a product with SKU "XXX"` | A product with the SKU specified in the argument `data`.`sku` does not exist. +`NOT_SALABLE` | `Product that you are trying to add is not available.` | A requested product is not available +`INSUFFICIENT_STOCK` | `This product is out of stock` | A requested product is out of stock +`UNDEFINED` | `UNDEFINED` | An error message is not matched with any code diff --git a/src/guides/v2.4/graphql/mutations/add-products-to-wishlist.md b/src/guides/v2.4/graphql/mutations/add-products-to-wishlist.md new file mode 100644 index 00000000000..bc10a882c92 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/add-products-to-wishlist.md @@ -0,0 +1,226 @@ +--- +group: graphql +title: addProductsToWishlist mutation +--- + +The `addProductsToWishlist` mutation adds one or more products to the specified wish list. This mutation supports all product types. + +This mutation requires a valid [customer authentication token]({{page.baseurl}}/graphql/mutations/generate-customer-token.html). + +In {{site.data.var.ce}}, customers can have only one wish list. In {{site.data.var.ee}}, customers can have multiple wish lists. + +{:.bs-callout-tip} +To determine whether wish lists are enabled, specify the `magento_wishlist_general_is_enabled` attribute in the [`storeConfig` query]({{page.baseurl}}/graphql/queries/store-config.html). + +## Syntax + +`mutation: addProductsToWishlist(wishlistId: ID!, wishlistItems: [WishlistItemInput!]!): AddProductsToWishlistOutput` + +## Example usage + +The following example adds a simple product (`24-MB01`), a configurable product (`WJ01-M-Red`), and a bundle product (`24-WG080`) to the customer's wish list. The SKU `WG-09` is invalid, and error information is returned in the `user_errors` object. + +{:.bs-callout-info} +In Magento 2.4.1, the `addProductsToWishlist` mutation does not return `selected_options` or `entered_options` objects. Support for these objects will be provided in a future release. + +To determine the value of the `wishlistId` attribute, run the `customer` query and check the value of `wishlist.id` in the response. + +**Request:** + +``` graphql +mutation { + addProductsToWishlist( + wishlistId: 1 + wishlistItems: [ + { + sku: "24-MB01" + quantity: 1 + } + { + sku: "WG-09" + quantity: 1 + } + { + parent_sku: "WJ01" + sku: "WJ01-M-Red" + quantity: 1 + } + { + sku: "24-WG080" + quantity: 1 + selected_options: [ + "YnVuZGxlLzEvMS8x" + "YnVuZGxlLzIvNC8x" + "YnVuZGxlLzMvNy8x" + "YnVuZGxlLzQvOC8x" + ] + } + ]){ + wishlist { + id + items_count + items { + id + qty + product { + name + sku + id + price_range { + minimum_price { + regular_price { + currency + value + } + } + maximum_price { + regular_price { + currency + value + } + } + } + } + } + } + user_errors { + code + message + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "addProductsToWishlist": { + "wishlist": { + "id": "1", + "items_count": 3, + "items": [ + { + "id": 16, + "qty": 1, + "product": { + "name": "Joust Duffle Bag", + "sku": "24-MB01", + "id": 1, + "price_range": { + "minimum_price": { + "regular_price": { + "currency": "USD", + "value": 34 + } + }, + "maximum_price": { + "regular_price": { + "currency": "USD", + "value": 34 + } + } + } + } + }, + { + "id": 17, + "qty": 1, + "product": { + "name": "Stellar Solar Jacket", + "sku": "WJ01", + "id": 1226, + "price_range": { + "minimum_price": { + "regular_price": { + "currency": "USD", + "value": 75 + } + }, + "maximum_price": { + "regular_price": { + "currency": "USD", + "value": 75 + } + } + } + } + }, + { + "id": 18, + "qty": 1, + "product": { + "name": "Sprite Yoga Companion Kit", + "sku": "24-WG080", + "id": 46, + "price_range": { + "minimum_price": { + "regular_price": { + "currency": "USD", + "value": 61 + } + }, + "maximum_price": { + "regular_price": { + "currency": "USD", + "value": 77 + } + } + } + } + } + ] + }, + "user_errors": [ + { + "code": "PRODUCT_NOT_FOUND", + "message": "Could not find a product with SKU \"WG-09\"" + } + ] + } + } +} +``` + +## Input attributes + +The `addProductsToWishlist` mutation requires the following input. + +Attribute | Data Type | Description +--- | --- | --- +`wishlistId` | ID! | The ID of the customer's wish list +`wishlistItems`| [[WishlistItemInput(#WishlistItemInput)]!]! | An array containing each product to be added to the wish list + +### WishlistItemInput attributes {#WishlistItemInput} + +The `WishlistItemInput` object defines each item to add to the wish list. + +Attribute | Data Type | Description +--- | --- | --- +`entered_options`| [EnteredOptionInput!] | An array of options that the customer entered +`parent_sku` | String | For complex product types, the SKU of the parent product +`quantity` | Float! | The amount or number of items to add +`selected_options` | [ID] | An array of strings corresponding to options the customer selected +`sku` | String! | The SKU of the product to add. For complex product types, specify the child product SKU + +### EnteredOptionInput attributes {#EnteredOptionInput} + +{% include graphql/entered-option-input.md %} + +## Output attributes + +The `AddProductsToWishlistOutput` object contains the customer's wish list and error message information. + +Attribute | Data Type | Description +--- | --- | --- +`user_errors` | [[WishListUserInputError!](#WishListUserInputError)] | An array of errors encountered while adding products to a wish list +`wishlist` | [Wishlist!](#Wishlist) | Contains the wish list with all items that were successfully added + +### Wishlist attributes {#Wishlist} + +{% include graphql/wishlist.md %} + +### WishListUserInputError attributes {#WishListUserInputError} + +{% include graphql/wishlist-user-input-errors.md %} diff --git a/src/guides/v2.4/graphql/mutations/add-simple-products.md b/src/guides/v2.4/graphql/mutations/add-simple-products.md deleted file mode 120000 index 0d00c94ea6a..00000000000 --- a/src/guides/v2.4/graphql/mutations/add-simple-products.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/mutations/add-simple-products.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/mutations/add-simple-products.md b/src/guides/v2.4/graphql/mutations/add-simple-products.md new file mode 100644 index 00000000000..694513b452f --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/add-simple-products.md @@ -0,0 +1,285 @@ +--- +group: graphql +title: addSimpleProductsToCart mutation +redirect from: + - /guides/v2.3/graphql/reference/quote-add-simple-products.html +--- + +{:.bs-callout-warning} +Magento recommends using the [addProductsToCart mutation]({{page.baseurl}}/graphql/mutations/add-products-to-cart.html) to add any type of product to the cart. + +The `addSimpleProductsToCart` mutation allows you to add any number of simple and group products to the cart at the same time. + +Simple products are physical products that do not have variations, such as color, size, or price. Group products are a set of simple standalone products that are assigned a unique SKU and are presented as a group. Each product in the group is purchased as a separate item. + +To add a simple or grouped product to a cart, you must provide the cart ID, the SKU, and the quantity. You can also optionally provide customizable options. + +## Syntax + +`mutation: {addSimpleProductsToCart(input: AddSimpleProductsToCartInput): {AddSimpleProductsToCartOutput}}` + +## Example usage + +These examples show the minimal payload and a payload that includes customizable options. + +### Add a simple product to a cart + +The following example adds a simple product to a cart. The response contains the entire contents of the customer's cart. + +**Request:** + +```graphql +mutation { + addSimpleProductsToCart( + input: { + cart_id: "IeTUiU0oCXjm0uRqGCOuhQ2AuQatogjG" + cart_items: [ + { + data: { + quantity: 1 + sku: "24-MB04" + } + } + ] + } + ) { + cart { + items { + id + product { + name + sku + } + quantity + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "addSimpleProductsToCart": { + "cart": { + "items": [ + { + "id": "13", + "product": { + "name": "Strive Shoulder Pack", + "sku": "24-MB04" + }, + "quantity": 1 + } + ] + } + } + } +} +``` + +### Add a simple product with customizable options to a cart + +If a product has a customizable option, you can specify the option's value in the `addSimpleProductsToCart` request. + +**Request:** + +```graphql +mutation { + addSimpleProductsToCart (input: { + cart_id: "IeTUiU0oCXjm0uRqGCOuhQ2AuQatogjG", + cart_items: { + data: { + sku: "simple" + quantity: 1 + }, + customizable_options: [ + { + id: 121 + value_string: "field value" + } + ] + } + }) { + cart { + items { + product { + name + } + quantity + ... on SimpleCartItem { + customizable_options { + label + values { + value + } + } + } + } + } + } +} +``` + +**Response:** + +```text +{ + "data": { + "addSimpleProductsToCart": { + "cart": { + "items": [ + { + "product": { + "name": "simple" + }, + "quantity": 1, + "customizable_options": [ + { + "label": "Field Option", + "values": [ + { + "value": "field value" + } + ] + } + ] + } + ] + } + } + } +} +``` +### Add a grouped product to a cart + +The following example adds a grouped product (`Workout-Kit`) to a cart. The grouped product contains three simple products. + +**Request:** + +```graphql +mutation { + addSimpleProductsToCart( + input: { + cart_id: "IeTUiU0oCXjm0uRqGCOuhQ2AuQatogjG" + cart_items: [ + { + data: { + quantity: 1 + sku: "Workout-Kit" + } + } + ] + } + ) { + cart { + items { + id + product { + name + sku + } + quantity + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "addSimpleProductsToCart": { + "cart": { + "items": [ + { + "id": "5", + "product": { + "name": "Go-Get'r Pushup Grips", + "sku": "24-UG05" + }, + "quantity": 1 + }, + { + "id": "6", + "product": { + "name": "Dual Handle Cardio Ball", + "sku": "24-UG07" + }, + "quantity": 1 + }, + { + "id": "7", + "product": { + "name": "Harmony Lumaflex™ Strength Band Kit ", + "sku": "24-UG03" + }, + "quantity": 1 + } + ] + } + } + } +} +``` + +## Input attributes + +The top-level `AddSimpleProductsToCartInput` object is listed first. All child objects are listed in alphabetical order. + +### AddSimpleProductsToCartInput object {#AddSimpleProductsToCartInput} + +The `AddSimpleProductsToCartInput` object must contain the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`cart_id` | String! | The unique ID that identifies the customer's cart +`cart_items` | [SimpleProductCartItemInput!](#SimpleProductCartItemInput) | Contains the cart item IDs and quantity of each item + +### CartItemInput object {#CartItemInputSimple} + +The `CartItemInput` object must contain the following attributes: + +{% include graphql/cart-item-input.md %} + +### CustomizableOptionInput object {#CustomizableOptionInputSimple} + +The `CustomizableOptionInput` object must contain the following attributes: + +{% include graphql/customizable-option-input.md %} + +### SimpleProductCartItemInput object {#SimpleProductCartItemInput} + +The `SimpleProductCartItemInput` object must contain the following attributes: + +`customizable_options` |[[CustomizableOptionInputSimple]](#CustomizableOptionInputSimple) | An array that defines customizable options for the product +`data` | [CartItemInput!](#CartItemInputSimple) | An object containing the `sku` and `quantity` of the product. + +## Output attributes + +The `AddSimpleProductsToCartOutput` object contains the `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + +{% include graphql/cart-object-24.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. + +## Errors + +Error | Description +--- | --- +`Could not find a cart with ID "XXX"` | The specified `cart_id` value does not exist in the `quote_id_mask` table. +`Could not find a product with SKU "YYY"` | A simple product with the SKU specified in the `data`.`sku` argument does not exist. +`Required parameter "cart_id" is missing` | The `cart_id` argument was omitted or contains an empty value. +`Required parameter "cart_items" is missing` | The `cart_items` argument was omitted or contains an empty value. +`The current user cannot perform operations on cart XXX` | An unauthorized user (guest) tried to add the product into a customer's cart, or an authorized user (customer) tried to add the product into the cart of another customer. +`The product's required option(s) weren't entered. Make sure the options are entered and try again.` | A simple product has customizable options that were not specified in the mutation, but are required for adding the product into the cart. diff --git a/src/guides/v2.4/graphql/mutations/add-virtual-products.md b/src/guides/v2.4/graphql/mutations/add-virtual-products.md deleted file mode 120000 index 4826bedf292..00000000000 --- a/src/guides/v2.4/graphql/mutations/add-virtual-products.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/mutations/add-virtual-products.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/mutations/add-virtual-products.md b/src/guides/v2.4/graphql/mutations/add-virtual-products.md new file mode 100644 index 00000000000..0d3205e412a --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/add-virtual-products.md @@ -0,0 +1,143 @@ +--- +group: graphql +title: addVirtualProductsToCart mutation +redirect from: + - /guides/v2.3/graphql/reference/quote-add-virtual-products.html +--- + +{:.bs-callout-warning} +Magento recommends using the [addProductsToCart mutation]({{page.baseurl}}/graphql/mutations/add-products-to-cart.html) to add any type of product to the cart. + +A virtual product represents a saleable item that is not physical, such as a membership, service, warranty, or subscription. Virtual products do not need to be shipped or downloaded, nor do they require stock management. + +The `addVirtualProductsToCart` mutation allows you to add multiple virtual products to the cart at the same time, but you cannot add other product types with this mutation. To add a virtual product to a cart, you must provide the cart ID, the SKU, and the quantity. You can also optionally provide customizable options. + +## Syntax + +`mutation: {addVirtualProductsToCart(input: AddVirtualProductsToCartInput): {AddVirtualProductsToCartOutput}}` + +## Example usage + +The Luma sample data does not include any virtual products. The following example requires that you create a virtual product with the `sku` value of `Membership-Gold` with a price of $49.99. + +**Request:** + +```text + +mutation { + addVirtualProductsToCart( + input: { + cart_id: "IeTUiU0oCXjm0uRqGCOuhQ2AuQatogjG", + cart_items: [ + { + data: { + quantity: 1 + sku: "Membership-Gold" + } + } + ] + } + ) { + cart { + items { + product { + name + } + quantity + } + prices { + grand_total { + value + currency + } + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "addVirtualProductsToCart": { + "cart": { + "items": [ + { + "product": { + "name": "Gold Membership" + }, + "quantity": 1 + } + ], + "prices": { + "grand_total": { + "value": 49.99, + "currency": "USD" + } + } + } + } + } +} +``` + +## Input attributes + +The top-level `AddVirtualProductsToCartInput` object is listed first. All child objects are listed in alphabetical order. + +### AddVirtualProductsToCartInput object {#AddVirtualProductsToCartInput} + +The `AddVirtualProductsToCartInput` object must contain the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`cart_id` | String! | The unique ID that identifies the customer's cart +`cart_items` | [VirtualProductCartItemInput!](#VirtualProductCartItemInput) | Contains the cart item IDs and quantity of each item + +### CartItemInput object {#CartItemInputVirtual} + +The `CartItemInput` object must contain the following attributes: + +{% include graphql/cart-item-input.md %} + +### CustomizableOptionInput object {#CustomizableOptionInputVirtual} + +The `CustomizableOptionInput` object must contain the following attributes: + +{% include graphql/customizable-option-input.md %} + +### VirtualProductCartItemInput object {#VirtualProductCartItemInput} + +The `VirtualProductCartItemInput` object must contain the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`customizable_options` |[[CustomizableOptionInput]](#CustomizableOptionInputVirtual) | An array that defines customizable options for the product +`data` | [CartItemInput!](#CartItemInputVirtual) | An object containing the `sku` and `quantity` of the product + +## Output attributes + +The `AddVirtualProductsToCartOutput` object contains the `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + +{% include graphql/cart-object-24.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. + +## Errors + +Error | Description +--- | --- +`Could not find a cart with ID "XXX"` | The specified `cart_id` value does not exist in the `quote_id_mask` table. +`Could not find a product with SKU "YYY"` | A virtual product with the SKU specified in the `data`.`sku` argument does not exist. +`Required parameter "cart_id" is missing` | The `cart_id` argument was omitted or contains an empty value. +`Required parameter "cart_items" is missing` | The `cart_items` argument was omitted or contains an empty value. +`The current user cannot perform operations on cart XXX` | An unauthorized user (guest) tried to add the product into a customer's cart, or an authorized user (customer) tried to add the product into the cart of another customer. +`The product's required option(s) weren't entered. Make sure the options are entered and try again.` | A virtual product has customizable options that were not specified in the mutation, but are required for adding the product into the cart. diff --git a/src/guides/v2.4/graphql/mutations/apply-coupon.md b/src/guides/v2.4/graphql/mutations/apply-coupon.md deleted file mode 120000 index 0d003d12747..00000000000 --- a/src/guides/v2.4/graphql/mutations/apply-coupon.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/mutations/apply-coupon.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/mutations/apply-coupon.md b/src/guides/v2.4/graphql/mutations/apply-coupon.md new file mode 100644 index 00000000000..2046341d69e --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/apply-coupon.md @@ -0,0 +1,127 @@ +--- +group: graphql +title: applyCouponToCart mutation +redirect from: + - /guides/v2.3/graphql/reference/quote-apply-coupon.html +--- + +The `applyCouponToCart` mutation applies a pre-defined coupon code to the specified cart. Valid coupon codes are defined in cart price rules. + +## Syntax + +`mutation: {applyCouponToCart(input: ApplyCouponToCartInput) {ApplyCouponToCartOutput}}` + +## Example usage + +The following example applies the coupon code `H2O` to the cart. For this coupon to be valid, the Affirm Water Bottle (`sku`: 24-UG06) must be in the cart. + +**Request:** + +``` text +mutation { + applyCouponToCart( + input: { + cart_id: "IeTUiU0oCXjm0uRqGCOuhQ2AuQatogjG", + coupon_code: "H20" + } + ) { + cart { + items { + product { + name + } + quantity + } + applied_coupons { + code + } + prices { + grand_total{ + value + currency + } + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "applyCouponToCart": { + "cart": { + "items": [ + { + "product": { + "name": "Gold Membership" + }, + "quantity": 2 + }, + { + "product": { + "name": "Strive Shoulder Pack" + }, + "quantity": 1 + }, + { + "product": { + "name": "Affirm Water Bottle " + }, + "quantity": 1 + } + ], + "applied_coupons": { + "code": "H20" + }, + "prices": { + "grand_total": { + "value": 134.08, + "currency": "USD" + } + } + } + } + } +} +``` + +## Input attributes + +The `applyCouponToCart` mutation requires the `cart_id` and `coupon_code`. + +### ApplyCouponToCartInput object {#ApplyCouponToCartInput} + +The `ApplyCouponToCartInput` object must contain the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`cart_id` | String! | The unique ID that identifies the customer's cart +`coupon_code` | String! | A valid coupon code + +## Output attributes + +The `ApplyCouponToCartOutput` object contains the `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + +{% include graphql/cart-object-24.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. + +## Errors + +Error | Description +--- | --- +`A coupon is already applied to the cart. Please remove it to apply another` | The value specified in the `coupon_code` argument has already applied to cart. Use [removeCouponFromCart]({{page.baseurl}}/graphql/mutations/remove-coupon.html) to remove the current coupon and to apply another. +`Cart does not contain products.` | The coupon cannot be applied to an empty cart. +`Could not find a cart with ID "XXX"` | The specified `cart_id` value does not exist in the `quote_id_mask` table. +`Required parameter "coupon_code" is missing` | The required `coupon_code` argument contains an empty value. +`The coupon code isn't valid. Verify the code and try again.` | The entered coupon code is not applicable. Check the existing shopping cart price rules for details. +`The current user cannot perform operations on cart XXX` | An unauthorized user (guest) tried to add the product into a customer's cart, or an authorized user (customer) tried to add the product into the cart of another customer. diff --git a/src/guides/v2.4/graphql/mutations/apply-giftcard.md b/src/guides/v2.4/graphql/mutations/apply-giftcard.md deleted file mode 120000 index b2727e92933..00000000000 --- a/src/guides/v2.4/graphql/mutations/apply-giftcard.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/mutations/apply-giftcard.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/mutations/apply-giftcard.md b/src/guides/v2.4/graphql/mutations/apply-giftcard.md new file mode 100644 index 00000000000..8ff210823ce --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/apply-giftcard.md @@ -0,0 +1,99 @@ +--- +group: graphql +title: applyGiftCardToCart mutation +ee_only: True +redirect from: + - /guides/v2.3/graphql/reference/quote-apply-giftcard.html +--- + +The `applyGiftCardToCart` mutation applies a pre-defined gift card code to the specified cart. + +## Syntax + + `mutation: applyGiftCardToCart(input: ApplyGiftCardToCartInput): ApplyGiftCardToCartOutput` + +## Example usage + +The following example adds a gift card with the code `0330CEIVTLB4` to the cart. The gift card has a value of $20. + +**Request:** + +```graphql +mutation { + applyGiftCardToCart( + input: { + cart_id: "lY8PnKhlHBGc4WS5v0Y3dWjxiA5PvvgY" + gift_card_code: "0330CEIVTLB4" + } + ) { + cart { + applied_gift_cards { + applied_balance { + value + currency + } + code + current_balance { + value + currency + } + expiration_date + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "applyGiftCardToCart": { + "cart": { + "applied_gift_cards": [ + { + "applied_balance": { + "value": 20, + "currency": "USD" + }, + "code": "0330CEIVTLB4", + "current_balance": { + "value": 20, + "currency": "USD" + }, + "expiration_date": null + } + ] + } + } + } +} +``` + +## Input attributes + +The `applyGiftCardToCart` mutation requires the `cart_id` and `gift_card_code`. + +### ApplyGiftCardToCartInput object {#ApplyGiftCardToCartInput} + +The `ApplyGiftCardToCartInput` object must contain the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`cart_id` | String! | The unique ID that identifies the customer's cart +`gift_card_code` | String! | The gift card code + +## Output attributes + +The `ApplyGiftCardToCartOutput` object contains the `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + + {% include graphql/cart-object-24.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. \ No newline at end of file diff --git a/src/guides/v2.4/graphql/mutations/apply-reward-points.md b/src/guides/v2.4/graphql/mutations/apply-reward-points.md new file mode 100644 index 00000000000..1ff31ea9160 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/apply-reward-points.md @@ -0,0 +1,136 @@ +--- +group: graphql +title: applyRewardPointsToCart mutation +ee_only: True +--- + +The `applyRewardPointsToCart` mutation applies reward points to the customer's cart. You cannot specify a quantity of reward points. If the reward points balance is less than the cart total, Magento applies the entire reward points balance. Otherwise, Magento applies as many reward points needed to bring the total to 0. Fractional reward points are discarded. + +Use the [`removeRewardPointsFromCart` mutation]({{page.baseurl}}/graphql/mutations/remove-reward-points.html) to undo the results of the `applyRewardPointsToCart` mutation. + +## Syntax + +`mutation: applyRewardPointsToCart(cartId: ID!): ApplyRewardPointsToCartOutput` + +## Example usage + +The following example applies $5 to the cart. In this example, the exchange rate is defined as 25 reward points equals $5. + +**Request:** + +```graphql +mutation { + applyRewardPointsToCart(cartId: "8k0Q4MpH2IGahWrTRtqM61YV2MtLPApz") + { + cart { + items { + quantity + product { + sku + name + price_range { + maximum_price { + final_price { + currency + value + } + } + } + } + } + applied_reward_points { + money { + currency + value + } + points + } + prices { + grand_total { + currency + value + } + applied_taxes { + amount { + currency + value + } + } + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "applyRewardPointsToCart": { + "cart": { + "items": [ + { + "quantity": 1, + "product": { + "sku": "WJ04", + "name": "Ingrid Running Jacket", + "price_range": { + "maximum_price": { + "final_price": { + "currency": "USD", + "value": 84 + } + } + } + } + } + ], + "applied_reward_points": { + "money": { + "currency": "USD", + "value": 5 + }, + "points": 25 + }, + "prices": { + "grand_total": { + "currency": "USD", + "value": 90.93 + }, + "applied_taxes": [ + { + "amount": { + "currency": "USD", + "value": 6.93 + } + } + ] + } + } + } + } +} +``` + +## Input attributes + +The `applyRewardPointsToCart` mutation requires the `cart_id` attribute. + +Attribute | Data Type | Description +--- | --- | --- +`cart_id` | String! | The unique ID that identifies the customer's cart + +## Output attributes + +The `ApplyRewardPointsToCartOutput` object contains the `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + + {% include graphql/cart-object-24.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. diff --git a/src/guides/v2.4/graphql/mutations/apply-store-credit.md b/src/guides/v2.4/graphql/mutations/apply-store-credit.md deleted file mode 120000 index 3a81c086bf1..00000000000 --- a/src/guides/v2.4/graphql/mutations/apply-store-credit.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/mutations/apply-store-credit.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/mutations/apply-store-credit.md b/src/guides/v2.4/graphql/mutations/apply-store-credit.md new file mode 100644 index 00000000000..9566edf262c --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/apply-store-credit.md @@ -0,0 +1,104 @@ +--- +group: graphql +title: applyStoreCreditToCart mutation +ee_only: true +--- + +The `applyStoreCreditToCart` mutation applies store credit to the specified cart. Store credit must be enabled on the store to run this mutation. + +Store credit is an amount that the merchant applies to a customer account as a result of a refund or similar transaction. If gift cards are enabled for a store, then a customer receives store credit when redeeming a gift card. No matter how the customer obtains store credit, these funds can be used to pay for purchases. + +The amount returned in the `current_balance` indicates how much store credit at the time you run the `applyStoreCreditToCart` mutation. This amount is not decreased until you place the order. + +{:.bs-callout-info} +If the amount of available store credit equals or exceeds the grand total of the quote, set the payment method to `free` in the `setPaymentMethodOnCart` mutation. + +## Syntax + +`mutation: {applyStoreCreditToCart(input: ApplyStoreCreditToCartInput): {ApplyStoreCreditToCartOutput}}` + +## Example usage + +In the following example, the customer starts with $10 of store credit. The subtotal of the items in the cart before applying the store credit plus shipping and tax is $34.64. The grand total on the cart after applying the store credit is $24.64. + +**Request:** + +```graphql +mutation { + applyStoreCreditToCart( + input: { + cart_id: "4HHaKzxpKM2ZwD0IcheRfcPNBWS3OvRM" + } + ) { + cart { + applied_store_credit { + applied_balance { + currency + value + } + current_balance { + currency + value + } + } + prices { + grand_total { + currency + value + } + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "applyStoreCreditToCart": { + "cart": { + "applied_store_credit": { + "applied_balance": { + "currency": "USD", + "value": 34.64 + }, + "current_balance": { + "currency": "USD", + "value": 10 + } + }, + "prices": { + "grand_total": { + "currency": "USD", + "value": 24.64 + } + } + } + } + } +} +``` + +## Input attributes + +The `ApplyStoreCreditToCartInput` object must contain the following attributes. + +Attribute | Data Type | Description +--- | --- | --- +`cart_id` | String! | The unique ID that identifies the customer’s cart + +## Output attributes + +The `ApplyStoreCreditToCartOutput` object returns the `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + +{% include graphql/cart-object-24.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. diff --git a/src/guides/v2.4/graphql/mutations/change-customer-password.md b/src/guides/v2.4/graphql/mutations/change-customer-password.md deleted file mode 120000 index 3a195addfca..00000000000 --- a/src/guides/v2.4/graphql/mutations/change-customer-password.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/mutations/change-customer-password.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/mutations/change-customer-password.md b/src/guides/v2.4/graphql/mutations/change-customer-password.md new file mode 100644 index 00000000000..576d93d417a --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/change-customer-password.md @@ -0,0 +1,76 @@ +--- +group: graphql +title: changeCustomerPassword mutation +--- + +Use the `changeCustomerPassword` mutation to change the password for the logged-in customer. + +To return or modify information about a customer, Magento recommends you use customer tokens in the header of your GraphQL calls. However, you also can use [session authentication]({{ page.baseurl }}/get-started/authentication/gs-authentication-session.html). + +## Syntax + +`mutation: {changeCustomerPassword(currentPassword: String! newPassword: String!) {Customer}}` + +## Example usage + +The following call updates the customer's password. + +**Request:** + +```graphql +mutation { + changeCustomerPassword( + currentPassword: "roni_cost3@example.com" + newPassword: "roni_cost4@example.com" + ) { + id + email + } +} +``` + +**Response:** + +```json +{ + "data": { + "changeCustomerPassword": { + "id": 1, + "email": "roni_cost@example.com" + } + } +} +``` + +## Input attributes + +The `changeCustomerPassword` mutation requires the following inputs: + +Attribute | Data Type | Description +--- | --- | --- +`currentPassword` | String | The customer's current password +`newPassword` | String | The customer's new password + +## Output attributes + +The `changeCustomerPassword` mutation returns the `customer` object. + +The following table lists the top-level attributes of the `customer` object. See the [`customer` query]({{page.baseurl}}/graphql/queries/customer.html) for complete details about this object. + +{% include graphql/customer-output-24.md %} + +## Errors + +Error | Description +--- | --- +`The current customer isn't authorized.` | The customer's token does not exist in the `oauth_token` table. +`Invalid login or password.` | The password specified in the `currentPassword` argument is not valid. +`Specify the "currentPassword" value.` | The password specified in the `currentPassword` argument is empty. +`Specify the "newPassword" value.` | The password specified in the `newPassword` argument is empty. +`The account is locked.` | The customer's password cannot be changed because the account is locked. + +## Related topics + +* [customer query]({{page.baseurl}}/graphql/queries/customer.html) +* [createCustomer mutation]({{page.baseurl}}/graphql/mutations/create-customer.html) +* [updateCustomer mutation]({{page.baseurl}}/graphql/mutations/update-customer.html) diff --git a/src/guides/v2.4/graphql/mutations/create-customer-v2.md b/src/guides/v2.4/graphql/mutations/create-customer-v2.md new file mode 100644 index 00000000000..5e3519782a8 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/create-customer-v2.md @@ -0,0 +1,101 @@ +--- +group: graphql +title: createCustomerV2 mutation +--- + +The `createCustomerV2` mutation creates a customer account. Use the [`createCustomerAddress` mutation]({{page.baseurl}}/graphql/mutations/create-customer-address.html) to complete the customer profile and define billing and shipping addresses. + +The `createCustomerV2` mutation supersedes the `createCustomer` mutation as the means to create a customer account. The input objects differ between these two mutations. The `createCustomer` mutation required the `CustomerInput` object, as did the `updateCustomer` mutation. The attributes required for creating a customer are different than those for updating a customer, but you could not determine this by looking at the schema. The `createCustomerV2` mutation requires the `CustomerCreateInput` object, which it does not share with the [`updateCustomerV2` mutation]({{page.baseurl}}/graphql/mutations/update-customer-v2.html). + +## Syntax + +`mutation: {createCustomerV2(input: CustomerCreateInput!) {CustomerOutput}}` + +## Example usage + +The following call creates a new customer. + +**Request:** + +```graphql +mutation { + createCustomerV2( + input: { + firstname: "Bob" + lastname: "Loblaw" + email: "bobloblaw@example.com" + password: "b0bl0bl@w" + is_subscribed: true + } + ) { + customer { + firstname + lastname + email + is_subscribed + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "createCustomer": { + "customer": { + "firstname": "Bob", + "lastname": "Loblaw", + "email": "bobloblaw@example.com", + "is_subscribed": true + } + } + } +} +``` + +## Input attributes + +The following table lists the attributes you can use as input for the `createCustomerV2` mutation. + +Attribute | Data Type | Description +--- | --- | --- +`date_of_birth` | String | The customer’s date of birth +`dob` | String | Deprecated. Use `date_of_birth` instead. The customer’s date of birth +`email` | String! | The customer’s email address +`firstname` | String! | The customer’s first name +`gender` | Int | The customer's gender (Male - 1, Female - 2) +`is_subscribed` | Boolean | Indicates whether the customer subscribes to the store's newsletter +`lastname` | String! | The customer’s last name +`middlename` | String | The customer’s middle name +`password` | String | The customer's password +`prefix` | String | An honorific, such as Dr., Mr., or Mrs. +`suffix` | String | A value such as Sr., Jr., or III +`taxvat` | String | The customer’s Tax/VAT number (for corporate customers) + +## Output attributes + +The `CustomerOutput` object contains the `Customer` object. + +The following table lists the top-level attributes of the `customer` object. See the [`customer` query]({{page.baseurl}}/graphql/queries/customer.html) for complete details about this object. + +{% include graphql/customer-output-24.md %} + +## Errors + +Error | Description +--- | --- +`A customer with the same email address already exists in an associated website.` | The email provided in the `input`.`email` argument belongs to an existing customer. +`"Email" is not a valid email address.` | The value provided in the `input`.`email` argument has an invalid format. +`Field CustomerInput.email of required type String! was not provided` | The `input`.`email` argument was omitted. +`Field "xxx" is not defined by type CustomerInput.` | The `input`.`xxx` argument is undefined. +`Required parameters are missing: First Name` | The `input`.`firstname` argument was omitted or contains an empty value. + +## Related topics + +* [customer query]({{page.baseurl}}/graphql/queries/customer.html) +* [updateCustomerV2 mutation]({{page.baseurl}}/graphql/mutations/update-customer-v2.html) +* [createCustomerAddress mutation]({{page.baseurl}}/graphql/mutations/create-customer-address.html) +* [updateCustomerAddress mutation]({{page.baseurl}}/graphql/mutations/update-customer-address.html) +* [deleteCustomerAddress mutation]({{page.baseurl}}/graphql/mutations/delete-customer-address.html) diff --git a/src/guides/v2.4/graphql/mutations/create-customer.md b/src/guides/v2.4/graphql/mutations/create-customer.md index 3c5eb9489ff..a11b8cb8f9d 100644 --- a/src/guides/v2.4/graphql/mutations/create-customer.md +++ b/src/guides/v2.4/graphql/mutations/create-customer.md @@ -3,7 +3,10 @@ group: graphql title: createCustomer mutation --- -Use the `createCustomer` mutation to create a new customer. +{:.bs-callout-warning} +Magento recommends using the [createCustomerV2 mutation]({{page.baseurl}}/graphql/mutations/create-customer-v2.html) to create a customer. + +The `createCustomer` mutation creates a new customer. To return or modify information about a customer, Magento recommends you use customer tokens in the header of your GraphQL calls. However, you also can use [session authentication]({{ page.baseurl }}/get-started/authentication/gs-authentication-session.html). @@ -65,6 +68,8 @@ The following table lists the attributes you can use as input for the `createCus The `createCustomer` mutation returns the `CustomerOutput` object. +The following table lists the top-level attributes of the `customer` object. See the [`customer` query]({{page.baseurl}}/graphql/queries/customer.html) for complete details about this object. + {% include graphql/customer-output-24.md %} ## Errors diff --git a/src/guides/v2.4/graphql/mutations/create-klarna-payments-session.md b/src/guides/v2.4/graphql/mutations/create-klarna-payments-session.md new file mode 100644 index 00000000000..28f1c8019a6 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/create-klarna-payments-session.md @@ -0,0 +1,113 @@ +--- +group: graphql +title: createKlarnaPaymentsSession mutation +contributor_name: Klarna +contributor_link: https://www.klarna.com/ +--- + +The `createKlarnaPaymentsSession` mutation initiates a Klarna session. You can create a session at any time before you display the available payment methods, but ideally, the cart would already contain products, the billing address, shipping address, and shipping method. If the cart changes afterward, you must run the mutation again to ensure that the latest payment methods are made available to the shopper. Factors such as the cart contents, the shipping and billing addresses, and the grand total after applying coupons can determine the payment methods Klarna offers. + +The mutation response includes an array of payment method categories. When the shopper selects a Klarna payment method, prepend the string `klarna_` to the selected `identifer`, and use the resulting string as the `payment_method.code` value in the subsequent `setPaymentMethodOnCart` mutation. For example, if the shopper selects the "Pay later in 30 days" payment method, the `identifier` value is `pay_later`, and the `payment_method.code` value is `klarna_pay_later`. + +The response also contains a client token. You must also supply this value in the `setPaymentMethodOnCart` mutation. + +[Klarna payment method]({{page.baseurl}}/graphql/payment-methods/klarna.html) provides additional information about the workflow of Klarna transactions. + +## Syntax + +```graphql +mutation { + createKlarnaPaymentsSession( + input: createKlarnaPaymentsSessionInput! + ) { + createKlarnaPaymentsSessionOutput + } +} +``` + +## Example usage + +**Request:** + +```graphql +mutation { + createKlarnaPaymentsSession( + input: { + cart_id: "VaP2GtqImwsTEXEf7azrh4vopebXp8gl"} + ) { + client_token + payment_method_categories { + identifier + name + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "createKlarnaPaymentsSession": { + "client_token": "", + "payment_method_categories": [ + { + "identifier": "pay_later", + "name": "Pay later in 30 days" + }, + { + "identifier": "pay_over_time", + "name": "Buy now, pay later" + } + ] + } + } +} +``` + +## Input attributes + +### createKlarnaPaymentsSessionInput attributes + +The `createKlarnaPaymentsSessionInput` object must contain the following attribute. + +Attribute | Data type | Description +--- | --- | --- +`cart_id` | String! | The masked ID that identifies the shopper's cart + +## Output attributes + +### createKlarnaPaymentsSessionOutput attributes + +The `createKlarnaPaymentsSessionOutput` object can contain the following attributes. + +Attribute | Data type | Description +--- | --- | --- +`client_token` | String | The payment method client token +`payment_method_categories` | [Categories] | An array of payment method categories + +### Categories attributes + +The `Categories` object can contain the following attributes. + +Attribute | Data type | Description +--- | --- | --- +`asset_urls` | [Assets] | The payment method assets +`identifier` | String! | The payment method identifier +`name` | String! | The payment method name + +### Assets attributes + +The `Assets` object can contain the following attributes. + +Attribute | Data type | Description +--- | --- | --- +`descriptive` | String | The payment method logo url (descriptive) +`standard` | String | The payment method logo url (standard) + +## Errors + +Error | Description +--- | --- +`The Klarna payment method is not active.` | The [Klarna](https://docs.magento.com/user-guide/payment/klarna.html) payment method is disabled in admin. diff --git a/src/guides/v2.4/graphql/mutations/create-product-review.md b/src/guides/v2.4/graphql/mutations/create-product-review.md new file mode 100644 index 00000000000..f5170f5a39e --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/create-product-review.md @@ -0,0 +1,120 @@ +--- +group: graphql +title: createProductReview mutation +--- + +The `createProductReview` mutation adds a review for the specified product. Use the [`productReviewRatingsMetadata` query]({{page.baseurl}}/graphql/queries/product-review-ratings-metadata.html) to return a list of rating categories and possible values. + +## Syntax + +`createProductReview(input: CreateProductReviewInput!): CreateProductReviewOutput!` + +## Example usage + +In the following example, Roni gives product `WH08` four stars overall, three stars for value, and four stars for quality. + +**Request:** + +```graphql +mutation { + createProductReview( + input: { + sku: "WH08", + nickname: "Roni", + summary: "Great looking sweatshirt", + text: "This sweatshirt looks and feels great. The zipper sometimes sticks a bit.", + ratings: [ + { + id: "NA==", + value_id: "MTk=" + }, { + id: "MQ==", + value_id: "NA==" + }, { + id: "Mg==", + value_id: "OA==" + } + ] + } +) { + review { + nickname + summary + text + average_rating + ratings_breakdown { + name + value + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "createProductReview": { + "review": { + "nickname": "Roni", + "summary": "Great looking sweatshirt", + "text": "This sweatshirt looks and feels great. The zipper sometimes sticks a bit.", + "average_rating": 73.33, + "ratings_breakdown": [ + { + "name": "Quality", + "value": "4" + }, + { + "name": "Value", + "value": "3" + }, + { + "name": "Overall", + "value": "4" + } + ] + } + } + } +} +``` + +## Input attributes + +The `CreateProductReviewInput` input object defines the product review. + +### CreateProductReviewInput attributes {#CreateProductReviewInput} + +The `CreateProductReviewInput` object contains the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`nickname` | String! | The customer's nickname. Defaults to the customer name, if logged in +`ratings` | [ProductReviewRatingInput!]! | Ratings details by category. e.g price: 5, quality: 4 etc +`sku` | String! | The SKU of the reviewed product +`summary` | String! | The summary (title) of the review +`text` | String! | The review text. + +### ProductReviewRatingInput attributes {#ProductReviewRatingInput} + +The `ProductReviewRatingInput` object contains the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`id` | String! | An encoded rating ID +`value_id` | String! | An encoded rating value ID + +## Output attributes + +The `CreateProductReviewOutput` output object contains the following attribute: + +Attribute | Data Type | Description +--- | --- | --- +`review` | ProductReview! | Contains the completed product review + +### ProductReview attributes {#ProductReview} + +{% include graphql/product-review.md %} diff --git a/src/guides/v2.4/graphql/mutations/handle-payflow-pro-response.md b/src/guides/v2.4/graphql/mutations/handle-payflow-pro-response.md deleted file mode 120000 index 9cd3f552977..00000000000 --- a/src/guides/v2.4/graphql/mutations/handle-payflow-pro-response.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/mutations/handle-payflow-pro-response.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/mutations/handle-payflow-pro-response.md b/src/guides/v2.4/graphql/mutations/handle-payflow-pro-response.md new file mode 100644 index 00000000000..d53f3f0e638 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/handle-payflow-pro-response.md @@ -0,0 +1,83 @@ +--- +group: graphql +title: handlePayflowProResponse mutation +--- + +The `handlePayflowProResponse` mutation sends the silent post data that the client received from the Payflow Pro gateway to the Magento server. The content of this payload varies based on factors such as the merchant's location, the items purchased, and the billing/shipping addresses. The following is an example payload: + +```text +'BILLTOCITY=CityM&AMT=0.00&BILLTOSTREET=Green+str,+67&VISACARDLEVEL=12&SHIPTOCITY=CityM' +'&NAMETOSHIP=John+Smith&ZIP=75477&BILLTOLASTNAME=Smith&BILLTOFIRSTNAME=John' +'&RESPMSG=Verified&PROCCVV2=M&STATETOSHIP=AL&NAME=John+Smith&BILLTOZIP=75477&CVV2MATCH=Y' +'&PNREF=B70CCC236815&ZIPTOSHIP=75477&SHIPTOCOUNTRY=US&SHIPTOSTREET=Green+str,+67&CITY=CityM' +'&HOSTCODE=A&LASTNAME=Smith&STATE=AL&SECURETOKEN=MYSECURETOKEN&CITYTOSHIP=CityM&COUNTRYTOSHIP=US' +'&AVSDATA=YNY&ACCT=1111&AUTHCODE=111PNI&FIRSTNAME=John&RESULT=0&IAVS=N&POSTFPSMSG=No+Rules+Triggered&' +'BILLTOSTATE=AL&BILLTOCOUNTRY=US&EXPDATE=0222&CARDTYPE=0&PREFPSMSG=No+Rules+Triggered&SHIPTOZIP=75477&' +'PROCAVS=A&COUNTRY=US&AVSZIP=N&ADDRESS=Green+str,+67&BILLTONAME=John+Smith&' +'ADDRESSTOSHIP=Green+str,+67&' +'AVSADDR=Y&SECURETOKENID=MYSECURETOKENID&SHIPTOSTATE=AL&TRANSTIME=2019-06-24+07%3A53%3A10' +``` + +See [Paypal Payflow Pro payment method]({{page.baseurl}}/graphql/payment-methods/payflow-pro.html) for detailed information about the workflow of PayPal Payflow Pro transactions. + +## Syntax + +`handlePayflowProResponse(input: PayflowProResponseInput!): PayflowProResponseOutput` + +## Example usage + +The following example sends the Payflow Pro payload to Magento: + +**Request:** + +```graphql +mutation { + handlePayflowProResponse( + input: { + cart_id: "Po1WkfK7d3vZE0qga610NwJIbxgqllpt" + paypal_payload: "$payload" + } + ){ + cart { + selected_payment_method { + code + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "handlePayflowProResponse": { + "cart": { + "selected_payment_method": { + "code": "payflowpro", + } + } + } + } +} +``` + +## Input attributes + +The `PayflowProResponseInput` object must contain the `cart_id` and `paypal_payload` attributes. + +Attribute | Data Type | Description +--- | --- | --- +`cart_id` | String! | The unique ID that identifies the customer's cart +`paypal_payload` | String! | The payload returned from PayPal + +## Output attributes + +The PayflowProResponseOutput contains a `Cart` object. + +### Cart object {#CartObject} + +{% include graphql/cart-object-24.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. diff --git a/src/guides/v2.4/graphql/mutations/merge-carts.md b/src/guides/v2.4/graphql/mutations/merge-carts.md deleted file mode 120000 index d31a7fac619..00000000000 --- a/src/guides/v2.4/graphql/mutations/merge-carts.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/mutations/merge-carts.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/mutations/merge-carts.md b/src/guides/v2.4/graphql/mutations/merge-carts.md new file mode 100644 index 00000000000..6fd42d1e53b --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/merge-carts.md @@ -0,0 +1,95 @@ +--- +group: graphql +title: mergeCarts mutation +--- + +The `mergeCarts` mutation transfers the contents of a guest cart into the cart of a logged-in customer. This mutation must be run on behalf of a logged-in customer. + +The mutation retains any items that were already in the logged-in customer's cart. If both the guest and customer carts contain the same item, `mergeCarts` adds the quantities. Upon success, the mutation deletes the original guest cart. + +Use the [`customerCart` query]({{page.baseurl}}/graphql/queries/customer-cart.html) to determine the value of the `destination_cart_id` attribute. + +## Syntax + +`mergeCarts(source_cart_id: String!, destination_cart_id: String!): Cart!` + +## Example usage + +In the following example, the customer had one Overnight Duffle in the cart (`CYmiiQRjPVc2gJUc5r7IsBmwegVIFO43`) before a guest cart (`mPKE05OOtcxErbk1Toej6gw6tcuxvT9O`) containing a Radiant Tee and another Overnight Duffle was merged. The cart now includes three items, including two Overnight Duffles. + +**Request:** + +```graphql +mutation { + mergeCarts(source_cart_id: "mPKE05OOtcxErbk1Toej6gw6tcuxvT9O", destination_cart_id: "CYmiiQRjPVc2gJUc5r7IsBmwegVIFO43") { + items { + id + product { + name + sku + } + quantity + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "mergeCarts": { + "items": [ + { + "id": "14", + "product": { + "name": "Overnight Duffle", + "sku": "24-WB07" + }, + "quantity": 2 + }, + { + "id": "17", + "product": { + "name": "Radiant Tee", + "sku": "WS12" + }, + "quantity": 1 + } + ] + } + } +} +``` + +## Input attributes + +Attribute | Data Type | Description +--- | --- | --- +`destination_cart_id` | String! | The ID of the logged-in customer's cart +`source_cart_id` | String! | The ID of the guest cart + +## Output attributes + +The `mergeCarts` mutation returns a `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + +{% include graphql/cart-object-24.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. + +## Errors + +Error | Description +--- | --- +`Current user does not have an active cart.` | The `mergeCarts` mutation deactivates the guest cart specified in the `source_cart_id` after merging. The guest cannot make any further operations with it. +`Required parameter "destination_cart_id" is missing` | The `destination_cart_id` attribute contains an empty value. +`Required parameter "source_cart_id" is missing` | The `source_cart_id` attribute contains an empty value. +`The current customer isn't authorized.` | The current customer is not currently logged in, or the customer's token does not exist in the `oauth_token` table, or you tried to merge two guest carts. +`The current user cannot perform operations on cart` | The authorized customer tried to merge a guest cart into the cart of another customer. diff --git a/src/guides/v2.4/graphql/mutations/remove-coupon.md b/src/guides/v2.4/graphql/mutations/remove-coupon.md deleted file mode 120000 index fefd4e7f065..00000000000 --- a/src/guides/v2.4/graphql/mutations/remove-coupon.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/mutations/remove-coupon.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/mutations/remove-coupon.md b/src/guides/v2.4/graphql/mutations/remove-coupon.md new file mode 100644 index 00000000000..cb41046dfa0 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/remove-coupon.md @@ -0,0 +1,113 @@ +--- +group: graphql +title: removeCouponFromCart mutation +redirect from: + - /guides/v2.3/graphql/reference/quote-remove-coupon.html +--- + +The `removeCouponFromCart` mutation removes a previously-applied coupon from the cart. The cart must contain at least one item in order to remove the coupon. + +## Syntax + +`mutation: {removeCouponFromCart(input: RemoveCouponFromCartInput) {RemoveCouponFromCartOutput}}` + +## Example usage + +The following example removes a coupon from the cart. + +**Request:** + +``` text +mutation { + removeCouponFromCart( + input: + { cart_id: "IeTUiU0oCXjm0uRqGCOuhQ2AuQatogjG" } + ) { + cart { + items { + product { + name + } + quantity + } + applied_coupons { + code + } + prices { + grand_total{ + value + currency + } + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "removeCouponFromCart": { + "cart": { + "items": [ + { + "product": { + "name": "Strive Shoulder Pack" + }, + "quantity": 1 + }, + { + "product": { + "name": "Affirm Water Bottle " + }, + "quantity": 1 + } + ], + "applied_coupons": null, + "prices": { + "grand_total": { + "value": 39, + "currency": "USD" + } + } + } + } + } +} +``` + +## Input attributes + +The `removeCouponFromCart` mutation must contain the following attribute: + +Attribute | Data Type | Description +--- | --- | --- +`cart_id` | String! | The unique ID that identifies the customer's cart + +## Output attributes + +The `removeCouponFromCart` mutation returns the `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + +{% include graphql/cart-object-24.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. + +## Errors + +Error | Description +--- | --- +`Cart does not contain products.` | The coupon cannot be removed from the empty cart. +`Could not find a cart with ID "XXX"` | The specified `cart_id` value does not exist in the `quote_id_mask` table. +`Current user does not have an active cart.` | The user cannot perform this mutation on the inactive cart. +`Required parameter "cart_id" is missing` | The required `cart_id` argument contains an empty value. +`The coupon code couldn't be deleted. Verify the coupon code and try again.` | The coupon was not removed from the cart. Check the existing shopping cart price rules for details. +`The current user cannot perform operations on cart XXX` | An unauthorized user (guest) tried to add the product into a customer's cart, or an authorized user (customer) tried to add the product into the cart of another customer. +`Wrong store code specified for cart` | The specified `cart_id` does not exist in specified store. diff --git a/src/guides/v2.4/graphql/mutations/remove-giftcard.md b/src/guides/v2.4/graphql/mutations/remove-giftcard.md deleted file mode 120000 index 6a575a3dc18..00000000000 --- a/src/guides/v2.4/graphql/mutations/remove-giftcard.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/mutations/remove-giftcard.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/mutations/remove-giftcard.md b/src/guides/v2.4/graphql/mutations/remove-giftcard.md new file mode 100644 index 00000000000..150ac636f8a --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/remove-giftcard.md @@ -0,0 +1,71 @@ +--- +group: graphql +title: removeGiftCardFromCart mutation +ee_only: True +--- + +The `removeGiftCardFromCart` mutation removes a previously-applied gift card from the cart. + +## Syntax + + `mutation: removeGiftCardFromCart(input: RemoveGiftCardFromCartInput): RemoveGiftCardFromCartOutput` + +## Example usage + + The following example removes a gift card from the cart. + +**Request:** + + ``` text +mutation { + removeGiftCardFromCart( + input: { + cart_id: "lOeLKsVkZ1PEvA8A7EaCvmEAk4JRBR7A" + gift_card_code: "049XDMZ6L81X" + } + ) { + cart { + applied_gift_cards { + code + } + } + } +} +``` + +**Response:** + + ```json +{ + "data": { + "removeGiftCardFromCart": { + "cart": { + "applied_gift_cards": [] + } + } + } +} +``` + +## Input attributes + +The `removeGiftCardFromCartInput` object must contain the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`cart_id` | String! | The unique ID that identifies the customer's cart +`gift_card_code` | String! | The gift card code + +## Output attributes + +The `removeGiftCardFromCartOutput` object contains the `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + + {% include graphql/cart-object-24.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. diff --git a/src/guides/v2.4/graphql/mutations/remove-item.md b/src/guides/v2.4/graphql/mutations/remove-item.md deleted file mode 120000 index 598684cca87..00000000000 --- a/src/guides/v2.4/graphql/mutations/remove-item.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/mutations/remove-item.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/mutations/remove-item.md b/src/guides/v2.4/graphql/mutations/remove-item.md new file mode 100644 index 00000000000..fa89d910f17 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/remove-item.md @@ -0,0 +1,109 @@ +--- +group: graphql +title: removeItemFromCart mutation +redirect from: + - /guides/v2.3/graphql/reference/quote-remove-item.html +--- + +The `removeItemFromCart` mutation deletes the entire quantity of a specified item from the cart. If you remove all items from the cart, the cart continues to exist. + +## Syntax + +`mutation: {removeItemFromCart(input: RemoveItemFromCartInput): {RemoveItemFromCartOutput}}` + +## Example usage + +The following example removes cart item 14 from the cart. + +**Request:** + +```graphql +mutation { + removeItemFromCart( + input: { + cart_id: "IeTUiU0oCXjm0uRqGCOuhQ2AuQatogjG", + cart_item_id: 14 + } + ) + { + cart { + items { + id + product { + name + } + quantity + } + prices { + grand_total{ + value + currency + } + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "removeItemFromCart": { + "cart": { + "items": [ + { + "id": "13", + "product": { + "name": "Strive Shoulder Pack" + }, + "quantity": 3 + } + ], + "prices": { + "grand_total": { + "value": 96, + "currency": "USD" + } + } + } + } + } +} +``` + +## Input attributes + +### RemoveItemFromCartInput object {#RemoveItemFromCartInput} + +The `RemoveItemFromCartInput` object must contain the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`cart_id` | String! | The unique ID that identifies the customer's cart +`cart_item_id` | Int! | The unique ID assigned when a customer places an item in the cart + +## Output attributes + +The `RemoveItemFromCartOutput` object contains the `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + +{% include graphql/cart-object-24.md %} + +## Errors + +Error | Description +--- | --- +`Cart doesn't contain the ZZZ item.` | The item ID specified in the `cart_item_id` argument does not exist in the requested shopping cart. +`Could not find a cart with ID "XXX"` | The specified `cart_id` value does not exist in the `quote_id_mask` table. +`Required parameter "cart_id" is missing.` | The value specified in the `cart_id` argument is empty. +`Required parameter "cart_item_id" is missing.` | The value specified in the `cart_item_id` argument is equal to zero. +`The current user cannot perform operations on cart "XXX"` | An unauthorized user (guest) tried to remove a product from the shopping cart of authorized user (customer), or a customer tried to remove a product from the shopping cart of another customer. + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. diff --git a/src/guides/v2.4/graphql/mutations/remove-products-from-wishlist.md b/src/guides/v2.4/graphql/mutations/remove-products-from-wishlist.md new file mode 100644 index 00000000000..89e51b497f8 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/remove-products-from-wishlist.md @@ -0,0 +1,150 @@ +--- +group: graphql +title: removeProductsFromWishlist mutation +--- + +The `removeProductsFromWishlist` mutation completely removes the specified items from the customer's wish list. Use the [`updateProductsInWishlist` mutation]({{page.baseurl}}/graphql/mutations/remove-products-from-wishlist.html) to change the quantity of specific items in the wish list. + +This mutation requires a valid [customer authentication token]({{page.baseurl}}/graphql/mutations/generate-customer-token.html). + +## Syntax + +`mutation: removeProductsFromWishlist(wishlistId: ID! wishlistItemsIds: [ID!]!): RemoveProductsFromWishlistOutput` + +## Example usage + +The following example removes an item that was added in the [`addProductsToWishlist` mutation]({{page.baseurl}}/graphql/mutations/add-products-to-wishlist.html) example. + +**Request:** + +``` graphql +mutation { + removeProductsFromWishlist( + wishlistId: 1 + wishlistItemsIds: [ + 12 + ]){ + wishlist { + id + items_count + items { + id + qty + product { + name + sku + id + price_range { + minimum_price { + regular_price { + currency + value + } + } + maximum_price { + regular_price { + currency + value + } + } + } + } + } + } + user_errors { + code + message + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "removeProductsFromWishlist": { + "wishlist": { + "id": "1", + "items_count": 2, + "items": [ + { + "id": 11, + "qty": 1, + "product": { + "name": "Sprite Yoga Companion Kit", + "sku": "24-WG080", + "id": 46, + "price_range": { + "minimum_price": { + "regular_price": { + "currency": "USD", + "value": 61 + } + }, + "maximum_price": { + "regular_price": { + "currency": "USD", + "value": 77 + } + } + } + } + }, + { + "id": 13, + "qty": 1, + "product": { + "name": "Stellar Solar Jacket", + "sku": "WJ01", + "id": 1226, + "price_range": { + "minimum_price": { + "regular_price": { + "currency": "USD", + "value": 75 + } + }, + "maximum_price": { + "regular_price": { + "currency": "USD", + "value": 75 + } + } + } + } + } + ] + }, + "user_errors": [] + } + } +} +``` + +## Input attributes + +The `removeProductsFromWishlist` mutation requires the following input. + +Attribute | Data Type | Description +--- | --- | --- +`wishlistId` | ID! | The ID of the customer's wish list +`wishlistItemsIds`| [ID!]! | An array of wish list item IDs to be removed + +## Output attributes + +The `RemoveProductsFromWishlistOutput` object contains the customer's wish list and error message information. + +Attribute | Data Type | Description +--- | --- | --- +`user_errors` | [WishListUserInputError!]! | An array of errors encountered while adding products to a wish list +`wishlist` | Wishlist! | Contains the wish list with all items that were successfully added + +### Wishlist attributes {#Wishlist} + +{% include graphql/wishlist.md %} + +### WishListUserInputError attributes {#WishListUserInputError} + +{% include graphql/wishlist-user-input-errors.md %} diff --git a/src/guides/v2.4/graphql/mutations/remove-reward-points.md b/src/guides/v2.4/graphql/mutations/remove-reward-points.md new file mode 100644 index 00000000000..9b26b83d3ef --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/remove-reward-points.md @@ -0,0 +1,96 @@ +--- +group: graphql +title: removeRewardPointsFromCart mutation +ee_only: True +--- + +The `removeRewardPointsFromCart` mutation removes all reward points that were previously applied to the customer's cart with the [`applyRewardPointsToCart` mutation]({{page.baseurl}}/graphql/mutations/apply-reward-points.html). + +## Syntax + +`mutation: removeRewardPointsFromCart(cartId: ID!): RemoveRewardPointsFromCartOutput` + +## Example usage + +The following example removes all reward points from the customer's cart. The `applied_rewards_points` object is now null. + +**Request:** + +```graphql +mutation { + removeRewardPointsFromCart(cartId: "8k0Q4MpH2IGahWrTRtqM61YV2MtLPApz") + { + cart { + applied_reward_points { + money { + currency + value + } + points + } + prices { + applied_taxes { + amount { + currency + value + } + } + grand_total { + currency + value + } + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "removeRewardPointsFromCart": { + "cart": { + "applied_reward_points": null, + "prices": { + "applied_taxes": [ + { + "amount": { + "currency": "USD", + "value": 6.93 + } + } + ], + "grand_total": { + "currency": "USD", + "value": 90.93 + } + } + } + } + } +} +``` + +## Input attributes + +The `removeRewardPointsFromCart` mutation requires the `cart_id` attribute. + +Attribute | Data Type | Description +--- | --- | --- +`cart_id` | String! | The unique ID that identifies the customer's cart + +## Output attributes + +The `RemoveRewardPointsFromCartOutput` object contains the `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + + {% include graphql/cart-object-24.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. diff --git a/src/guides/v2.4/graphql/mutations/remove-store-credit.md b/src/guides/v2.4/graphql/mutations/remove-store-credit.md deleted file mode 120000 index 4744ffbe1e0..00000000000 --- a/src/guides/v2.4/graphql/mutations/remove-store-credit.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/mutations/remove-store-credit.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/mutations/remove-store-credit.md b/src/guides/v2.4/graphql/mutations/remove-store-credit.md new file mode 100644 index 00000000000..5f9eda0e0b1 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/remove-store-credit.md @@ -0,0 +1,97 @@ +--- +group: graphql +title: removeStoreCreditFromCart mutation +ee_only: true +--- + +The `removeStoreCreditFromCart` mutation removes store credit previously applied to the specified cart with the [`applyStoreCreditToCart`]({{page.baseurl}}/graphql/mutations/apply-store-credit.html) mutation. Magento restores the customer's available store credit to its original amount and recalculates all cart totals. + +Store credit must be enabled on the store to run this mutation. + +## Syntax + +`mutation: {RemoveStoreCreditFromCart(input: RemoveStoreCreditFromCartInput): {RemoveStoreCreditFromCartOutput}}` + +## Example usage + +**Request:** + +```graphql +mutation { + removeStoreCreditFromCart( + input: { + cart_id: "4HHaKzxpKM2ZwD0IcheRfcPNBWS3OvRM" + } + ) { + cart { + applied_store_credit { + applied_balance { + currency + value + } + current_balance { + currency + value + } + } + prices { + grand_total { + currency + value + } + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "removeStoreCreditFromCart": { + "cart": { + "applied_store_credit": { + "applied_balance": { + "currency": "USD", + "value": 0 + }, + "current_balance": { + "currency": "USD", + "value": 10 + } + }, + "prices": { + "grand_total": { + "currency": "USD", + "value": 34.64 + } + } + } + } + } +} +``` + +## Input attributes + +The `RemoveStoreCreditFromCartInput` object must contain the following attributes. + +Attribute | Data Type | Description +--- | --- | --- +`cart_id` | String! | The unique ID that identifies the customer’s cart + +## Output attributes + +The `RemoveStoreCreditFromCartOutput` object returns the `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + +{% include graphql/cart-object-24.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. diff --git a/src/guides/v2.4/graphql/mutations/reorder-items.md b/src/guides/v2.4/graphql/mutations/reorder-items.md index 1ef1f0fae04..3b1a5e73ed7 100644 --- a/src/guides/v2.4/graphql/mutations/reorder-items.md +++ b/src/guides/v2.4/graphql/mutations/reorder-items.md @@ -143,7 +143,7 @@ Attribute | Data Type | Description ### Cart object {#CartObject} -{% include graphql/cart-object.md %} +{% include graphql/cart-object-24.md %} [Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. diff --git a/src/guides/v2.4/graphql/mutations/request-password-reset-email.md b/src/guides/v2.4/graphql/mutations/request-password-reset-email.md new file mode 100644 index 00000000000..67af3eb88d4 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/request-password-reset-email.md @@ -0,0 +1,74 @@ +--- +group: graphql +title: requestPasswordResetEmail mutation +contributor_name: Atwix +contributor_link: https://www.atwix.com/ +--- + +The `requestPasswordResetEmail` mutation triggers the password reset email by the provided email address. Use it to initiate the process to reset the registered customer's password before calling the [resetPassword]({{page.baseurl}}/graphql/mutations/reset-password.html) mutation. + +When the customer clicks the `Set a New Password` button, Magento sends an email to the customer that contains a URL for resetting their password. + +![Reset password email]({{ page.baseurl }}/graphql/images/reset-password-email.png) + +The URL has the following format: + +```text +https:///customer/account/createPassword/?token=gh80pkjGdsPyiXc0sUUXswX1uGN7crUr +``` + +Use the value of the token in the `resetPassword` mutation. + +## Syntax + +`mutation: {requestPasswordResetEmail(email: String!): Boolean}` + +## Example usage + +The following call triggers the password reset email. + +**Request:** + +```graphql +mutation { + requestPasswordResetEmail( + email: "roni_cost@example.com" + ) +} +``` + +**Response:** + +```json +{ + "data": { + "requestPasswordResetEmail": true + } +} +``` + +## Input arguments + +You must specify the customer's email address in the `email` input argument. + +## Output attributes + +The `requestPasswordResetEmail` mutation returns `true` if both of the following operations are successful: + +- The reset password operation initiates. +- Magento sends an email containing a reset link. + +Otherwise, the mutation returns `false`. + +## Errors + +Error | Description +--- | --- +`Cannot reset the customer's password` | A general error message that appears on some internal system errors. The original error is logged and can be found in the Magento logs. +`The account is locked` | You cannot modify a locked customer account. +`The email address has an invalid format.` | The value provided in the `email` argument has an invalid format. +`You must specify an email address.` | An empty value is provided in the `email` argument. + +## Related topics + +[resetPassword mutation]({{page.baseurl}}/graphql/mutations/reset-password.html) diff --git a/src/guides/v2.4/graphql/mutations/reset-password.md b/src/guides/v2.4/graphql/mutations/reset-password.md new file mode 100644 index 00000000000..b3d6c693407 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/reset-password.md @@ -0,0 +1,70 @@ +--- +group: graphql +title: resetPassword mutation +contributor_name: Atwix +contributor_link: https://www.atwix.com/ +--- + +The `resetPassword` mutation resets customer password using a reset password token and the customer's email address. Use it to set a new password for the registered customer after calling the [requestPasswordResetEmail]({{page.baseurl}}/graphql/mutations/request-password-reset-email.html) mutation. + +## Syntax + +`mutation: {resetPassword(email: String!, resetPasswordToken: String!, newPassword: String!): Boolean}` + +## Example usage + +The following call sets a new customer password. + +**Request:** + +```graphql +mutation { + resetPassword( + email: "roni_cost@example.com", + resetPasswordToken: "gh80pkjGdsPyiXc0sUUXswX1uGN7crUr", + newPassword: "new_password" + ) +} +``` + +**Response:** + +```json +{ + "data": { + "resetPassword": true + } +} +``` + +## Input arguments + +The `resetPassword` mutation must contain the following arguments: + +Argument | Type | Description +--- | --- | --- +`email` | String! | Specifies the customer account that needs a password reset +`resetPasswordToken` | String! | A runtime token. You can find it in the reset email URL (see [requestPasswordResetEmail]({{page.baseurl}}/graphql/mutations/request-password-reset-email.html) mutation) or in the `customer_entity`.`rp_token` database table. +`newPassword` | String! | The new password + +{:.bs-callout-info} +The new password must satisfy the password policies set for the store. + +## Output + +The `resetPassword` mutation returns `true` if the request was successful. Otherwise, it returns `false`. + +## Errors + +Error | Description +--- | --- +`Cannot set the customer's password` | A general error message that appears on some internal system errors. The original error is logged and can be found in the Magento logs. +`newPassword must be specified` | The `newPassword` argument is empty. +`resetPasswordToken must be specified` | The `resetPasswordToken` argument is empty. +`The account is locked` | You cannot modify a locked customer account. +`The email address has an invalid format.` | The value provided in the `email` argument has an invalid format. +`You must specify an email address.` | The `email` argument is empty. + +## Related topics + +- [requestPasswordResetEmail mutation]({{page.baseurl}}/graphql/mutations/request-password-reset-email.html) diff --git a/src/guides/v2.4/graphql/mutations/set-billing-address.md b/src/guides/v2.4/graphql/mutations/set-billing-address.md index 192049ecc98..e23263c46ce 100644 --- a/src/guides/v2.4/graphql/mutations/set-billing-address.md +++ b/src/guides/v2.4/graphql/mutations/set-billing-address.md @@ -127,6 +127,6 @@ Attribute | Data Type | Description ### Cart object {#CartObject} -{% include graphql/cart-object.md %} +{% include graphql/cart-object-24.md %} [Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. diff --git a/src/guides/v2.4/graphql/mutations/set-gift-options.md b/src/guides/v2.4/graphql/mutations/set-gift-options.md new file mode 100644 index 00000000000..79c104ad0f2 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/set-gift-options.md @@ -0,0 +1,186 @@ +--- +group: graphql +title: setGiftOptionsOnCart mutation +--- + +The `setGiftOptionsOnCart` mutation allows the buyer to set the following gift options on the cart level: + +* Gift messages +* Gift wrapping +* A gift receipt to accompany the order +* A printed card to accompany the order + +{:.bs-callout-info} +Gift messages are a feature of {{site.data.var.ce}}. All other gift options require {{site.data.var.ee}}. + +To remove a gift message, set the `gift_message` object to null. To remove gift wrapping, set the `gift_wrapping_id` attribute to null. + +Use the [updateCartItems mutation]({{page.baseurl}}/graphql/mutations/update-cart-items.html) to set gift messages and gift wrapping on individual items. + +These options are configured on the **Stores** > Configuration > **Sales** > **Sales** > **Gift Options** screen. To determine whether these options are enabled, specify these attributes in the [`storeConfig` query]({{page.baseurl}}/graphql/queries/store-config.html). + +* `allow_gift_receipt` +* `allow_gift_wrapping_on_order` +* `allow_printed_card` +* `cart_gift_wrapping` +* `cart_printed_card` +* `printed_card_price` +* `sales_gift_wrapping` +* `sales_printed_card` + +Gift wrapping is available for simple, configurable, bundle products as well as physical gift cards. + +## Syntax + +`mutation: {setGiftOptionsOnCart(input: SetGiftOptionsOnCartInput): SetGiftOptionsOnCartOutput}` + +## Example usage + +The following example adds a gift message, gift wrapping, and a gift receipt to the cart. + +**Request:** + +```graphql +mutation { + setGiftOptionsOnCart( + input: { + cart_id: "8k0Q4MpH2IGahWrTRtqM61YV2MtLPApz" + gift_message: { + to: "Alex" + from: "Veronica" + message: "Happy Birthday!" + } + gift_wrapping_id: "Mg==" + gift_receipt_included: true + printed_card_included: false + } + ) { + cart { + id + gift_message { + to + from + message + } + gift_wrapping { + id + } + gift_receipt_included + printed_card_included + items { + quantity + prices { + price { + value + currency + } + } + } + prices { + gift_options { + gift_wrapping_for_order { + value + currency + } + } + grand_total { + value + currency + } + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "setGiftOptionsOnCart": { + "cart": { + "id": "8k0Q4MpH2IGahWrTRtqM61YV2MtLPApz", + "gift_message": { + "to": "Alex" + "from": "Veronica" + "message": "Happy Birthday!" + } + "gift_wrapping": { + "id": "2" + }, + "gift_receipt_included": true, + "printed_card_included": false, + "items": [ + { + "quantity": 1, + "prices": { + "price": { + "value": 32, + "currency": "USD" + } + } + }, + { + "quantity": 1, + "prices": { + "price": { + "value": 84, + "currency": "USD" + } + } + } + ], + "prices": { + "gift_options": { + "gift_wrapping_for_order": { + "value": 7, + "currency": "USD" + } + }, + "grand_total": { + "value": 132.57, + "currency": "USD" + } + } + } + } + } +} +``` + +## Input attributes + +The `SetGiftOptionsOnCartInput` object can contain the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`cart_id` | String! | The unique ID that identifies the shopper's cart +`gift_message` | [GiftMessageInput](#GiftMessageInput) | Gift message details for the cart +`gift_receipt_included` | Boolean! | Indicates whether the customer requested a gift receipt for the cart +`gift_wrapping_id` | ID | The unique identifier of the gift wrapping to be used for the cart +`printed_card_included` | Boolean! | Indicates whether the customer requested a printed card for the cart + +### GiftMessageInput {#GiftMessageInput} + +The `GiftMessageInput` object must contain the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`from` | String! | The name of the gift sender +`message` | String! | The text of the gift message +`to` | String! | The name of the gift recipient + +## Output attributes + +The `SetGiftOptionsOnCartOutput` object contains the `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + +{% include graphql/cart-object-24.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. diff --git a/src/guides/v2.4/graphql/mutations/set-guest-email.md b/src/guides/v2.4/graphql/mutations/set-guest-email.md deleted file mode 120000 index 531609ec568..00000000000 --- a/src/guides/v2.4/graphql/mutations/set-guest-email.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/mutations/set-guest-email.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/mutations/set-guest-email.md b/src/guides/v2.4/graphql/mutations/set-guest-email.md new file mode 100644 index 00000000000..d2b17dac1e8 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/set-guest-email.md @@ -0,0 +1,81 @@ +--- +group: graphql +title: setGuestEmailOnCart mutation +redirect from: + - /guides/v2.3/graphql/reference/quote-set-guest-email.html +--- + +For guest customers, you must assign an email to the cart before you place the order. + +A logged-in customer specifies an email address when they create an account. Therefore, you can place the order without explicitly setting the email. + +## Syntax + +`mutation: {setGuestEmailOnCart(input: SetGuestEmailOnCartInput): {SetGuestEmailOnCartOutput}}` + +## Example usage + +**Request:** + +```graphql +mutation { + setGuestEmailOnCart( + input: { + cart_id: "4JQaNVJokOpFxrykGVvYrjhiNv9qt31C" + email: "jdoe@example.com" + } + ) { + cart { + email + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "setGuestEmailOnCart": { + "cart": { + "email": "jdoe@example.com" + } + } + } +} +``` + +## Input attributes + +The `SetGuestEmailOnCartInput` object must contain the following attributes. + +Attribute | Data Type | Description +--- | --- | --- +`cart_id` | String! | The unique ID that identifies the customer’s cart +`email` | String! | The guest user's email + +## Output attributes + +The `SetGuestEmailOnCartOutput` object contains the `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + +{% include graphql/cart-object-24.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. + +## Errors + +Error | Description +--- | --- +`Could not find a cart with ID "XXX"` | The ID specified in the `cart` argument does not exist. +`Invalid email format` | The value specified in the `email` argument has an incorrect format. +`Required parameter "cart_id" is missing` | The `cart_id` argument was omitted or contains an empty value. +`Required parameter "email" is missing` | The `email` argument was omitted or contains an empty value. +`The current user cannot perform operations on cart "XXX"` | An unauthorized user (guest) tried to set the email address on the customer's cart. +`The request is not allowed for logged in customers` | An authorized user (customer) is not allowed to use the `setGuestEmailOnCart` mutation. diff --git a/src/guides/v2.4/graphql/mutations/set-payment-method.md b/src/guides/v2.4/graphql/mutations/set-payment-method.md index 48182529870..8683ec1dc40 100644 --- a/src/guides/v2.4/graphql/mutations/set-payment-method.md +++ b/src/guides/v2.4/graphql/mutations/set-payment-method.md @@ -20,6 +20,7 @@ Supported online payment methods include: - [PayPal Express Checkout]({{page.baseurl}}/graphql/payment-methods/paypal-express-checkout.html) - [PayPal Payflow Link]({{page.baseurl}}/graphql/payment-methods/payflow-link.html) - [PayPal Payflow Pro]({{page.baseurl}}/graphql/payment-methods/payflow-pro.html) +- [PayPal Payflow Pro Vault]({{page.baseurl}}/graphql/payment-methods/payflow-pro-vault.html) - [PayPal Payments Advanced]({{page.baseurl}}/graphql/payment-methods/payments-advanced.html) - [PayPal Website Payments Pro Hosted Solution]({{page.baseurl}}/graphql/payment-methods/hosted-pro.html) - [Express Checkout for other PayPal solutions]({{page.baseurl}}/graphql/payment-methods/payflow-express.html) @@ -105,7 +106,7 @@ Attribute | Data Type | Description ### Cart object {#CartObject} -{% include graphql/cart-object.md %} +{% include graphql/cart-object-24.md %} [Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. diff --git a/src/guides/v2.4/graphql/mutations/set-shipping-address.md b/src/guides/v2.4/graphql/mutations/set-shipping-address.md index c97dda8c7b6..ce1b5c2501a 100644 --- a/src/guides/v2.4/graphql/mutations/set-shipping-address.md +++ b/src/guides/v2.4/graphql/mutations/set-shipping-address.md @@ -134,6 +134,6 @@ Attribute | Data Type | Description ### Cart object {#CartObject} -{% include graphql/cart-object.md %} +{% include graphql/cart-object-24.md %} [Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. diff --git a/src/guides/v2.4/graphql/mutations/set-shipping-method.md b/src/guides/v2.4/graphql/mutations/set-shipping-method.md index 3bf8066fbed..6e29429c8aa 100644 --- a/src/guides/v2.4/graphql/mutations/set-shipping-method.md +++ b/src/guides/v2.4/graphql/mutations/set-shipping-method.md @@ -114,7 +114,7 @@ Attribute | Data Type | Description ### Cart object {#CartObject} -{% include graphql/cart-object.md %} +{% include graphql/cart-object-24.md %} [Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. diff --git a/src/guides/v2.4/graphql/mutations/subscribe-email-to-newsletter.md b/src/guides/v2.4/graphql/mutations/subscribe-email-to-newsletter.md new file mode 100644 index 00000000000..d92fc5d8e24 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/subscribe-email-to-newsletter.md @@ -0,0 +1,79 @@ +--- +group: graphql +title: subscribeEmailToNewsletter mutation +contributor_name: Atwix +contributor_link: https://www.atwix.com/ +--- + +The `subscribeEmailToNewsletter` mutation allows guests and registered customers to sign up to receive newsletters. + +## Syntax + +`mutation: {subscribeEmailToNewsletter(email: String!): SubscribeEmailToNewsletterOutput}` + +## Example usage + +The following call subscribes an email to the store's newsletter. + +**Request:** + +```graphql +mutation { + subscribeEmailToNewsletter( + email: "email@example.com" + ) { + status + } +} +``` + +**Response:** + +```json +{ + "data": { + "subscribeEmailToNewsletter": { + "status": "SUBSCRIBED" + } + } +} +``` + +## Input arguments + +The mutation contains a required `email` parameter that specifies the email address to be added into a newsletter subscription. + +## Output attributes + +The `SubscribeEmailToNewsletterOutput` object contains the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`status` | SubscriptionStatusesEnum | Contains a subscription status of specified `email` address. + +### SubscriptionStatusesEnum + +The `SubscriptionStatusesEnum` is a predefined set of possible subscription statuses: + +Value | Description +--- | --- +`NOT_ACTIVE` | The subscription requires a confirmation. A confirmation email has been sent to specified email address to confirm the subscription. +`SUBSCRIBED` | The email address is subscribed. +`UNSUBSCRIBED` | The email address is unsubscribed. +`UNCONFIRMED` | The specified email is that of a customer who did not previously confirm a required customer registration. + +The `subscribeEmailToNewsletter` mutation for the `status` field may return only the following statuses: + +- `NOT_ACTIVE` +- `SUBSCRIBED` + +## Errors + +Error | Description +--- | --- +`Cannot create a newsletter subscription.` | A general error message that appears on some internal system errors. The original error is logged and can be found in the Magento logs. +`Enter a valid email address.` | The value provided in the `email` argument has an invalid format. +`Guests can not subscribe to the newsletter. You must create an account to subscribe.` | Guest subscription is disabled. Go to **Stores** > **Configuration** > **Customers** > **Newsletter** > **Subscription Options** > **Allow Guest Subscription** in the Admin to adjust the setting. +`The account sign-in was incorrect or your account is disabled temporarily.` | The email address provided in the `email` argument is that of a customer account pending confirmation. +`This email address is already subscribed.` | The email address provided in the `email` argument is already subscribed. +`You must specify an email address to subscribe to a newsletter.`| The `email` argument is empty. diff --git a/src/guides/v2.4/graphql/mutations/update-cart-items.md b/src/guides/v2.4/graphql/mutations/update-cart-items.md deleted file mode 120000 index 90487b01f6f..00000000000 --- a/src/guides/v2.4/graphql/mutations/update-cart-items.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/mutations/update-cart-items.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/mutations/update-cart-items.md b/src/guides/v2.4/graphql/mutations/update-cart-items.md new file mode 100644 index 00000000000..c534762e1f8 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/update-cart-items.md @@ -0,0 +1,152 @@ +--- +group: graphql +title: updateCartItems mutation +--- + +The `updateCartItems` mutation allows you to modify items in the specified cart. You can also replace the current quantity of one or more cart items with the specified quantities. The mutation does not perform calculations to determine the quantity of cart items. + +{:.bs-callout-info} +Setting the quantity to `0` removes an item from the cart. + +## Syntax + +`mutation: {updateCartItems(input: UpdateCartItemsInput): {UpdateCartItemsOutput}}` + +## Example usage + +The following example changes the quantity of cart item `13`. The new quantity is `3`. + +**Request:** + +```graphql +mutation { + updateCartItems( + input: { + cart_id: "IeTUiU0oCXjm0uRqGCOuhQ2AuQatogjG", + cart_items: [ + { + cart_item_id: 13 + quantity: 3 + } + ] + } + ){ + cart { + items { + id + product { + name + } + quantity + } + prices { + grand_total{ + value + currency + } + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "updateCartItems": { + "cart": { + "items": [ + { + "id": "13", + "product": { + "name": "Strive Shoulder Pack" + }, + "quantity": 3 + }, + { + "id": "14", + "product": { + "name": "Affirm Water Bottle " + }, + "quantity": 1 + } + ], + "prices": { + "grand_total": { + "value": 103, + "currency": "USD" + } + } + } + } + } +} +``` + +## Input attributes + +The `UpdateCartItemsInput` object is listed first. All child objects are listed in alphabetical order. + +### UpdateCartItemsInput attributes {#UpdateCartItemsInput} + +The `UpdateCartItemsInput` object must contain the following attributes. + +Attribute | Data Type | Description +--- | --- | --- +`cart_id` | String! | The unique ID that identifies the customer's cart +`cart_items` | [CartItemUpdateInput!](#CartItemUpdateInput) | Contains the cart item IDs and quantity of each item + +### CartItemUpdateInput attributes {#CartItemUpdateInput} + +The `CartItemUpdateInput` object can contain the following attributes. + +Attribute | Data Type | Description +--- | --- | --- +`cart_item_id` | Int! | The unique ID assigned when a customer places an item in the cart +`customizable_options` | [CustomizableOptionInput!] | An array that defines customizable options for the product +`gift_message` | [GiftMessageInput](#GiftMessageInput) | Gift message details for the cart item +`gift_wrapping_id` | ID | The unique identifier of the gift wrapping to be used for the cart item +`quantity` | Float | The new quantity of the item. A value of `0` removes the item from the cart + +### CustomizableOptionInput attributes {#CustomizableOptionInputSimple} + +The `CustomizableOptionInput` object must contain the following attributes. + +{% include graphql/customizable-option-input.md %} + +### GiftMessageInput attributes {#GiftMessageInput} + +The `GiftMessageInput` object must contain the following attributes. + +Attribute | Data Type | Description +--- | --- | --- +`from` | String! | The name of the gift sender +`message` | String! | The text of the gift message +`to` | String! | The name of the gift recipient + +## Output attributes + +The `UpdateCartItemsOutput` object contains the `Cart` object. + +Attribute | Data Type | Description +--- | --- | --- +`cart` |[Cart!](#CartObject) | Describes the contents of the specified shopping cart + +### Cart object {#CartObject} + +{% include graphql/cart-object-24.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. + +## Errors + +Error | Description +--- | --- +`Could not find cart item with id: XXX` | The specified `input`.`cart_items`.`cart_item_id` value does not exist in the `quote_item` database table. +`Could not find a cart with ID "XXX"` | The specified `cart_id` value does not exist in the `quote_id_mask` database table. +`Required parameter "cart_id" is missing.` | The value specified in the `cart_id` argument is empty. +`Required parameter "cart_items" is missing.` | The `cart_items` argument is empty, or its value is specified as a non-array value. +`Required parameter "quantity" for "cart_items" is missing.` | The required `input`.`cart_items`.`quantity` argument must be specified. +`The current user cannot perform operations on cart "XXX"` | An unauthorized user (guest) tried to update a customer's cart, or an authorized user (customer) tried to update the cart of another customer. diff --git a/src/guides/v2.4/graphql/mutations/update-customer-email.md b/src/guides/v2.4/graphql/mutations/update-customer-email.md new file mode 100644 index 00000000000..01459015867 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/update-customer-email.md @@ -0,0 +1,64 @@ +--- +group: graphql +title: updateCustomerEmail mutation +--- + +Use the `updateCustomerEmail` mutation to change the email address for the logged-in customer. + +To return or modify information about a customer, Magento recommends you use customer tokens in the header of your GraphQL calls. However, you also can use [session authentication]({{ page.baseurl }}/get-started/authentication/gs-authentication-session.html). + +## Syntax + +`mutation: updateCustomerEmail(email: String! password: String!): CustomerOutput` + +## Example usage + +The following call updates the customer's email address. + +**Request:** + +```graphql +mutation { + updateCustomerEmail(email: "new_email@example.com", password: "roni_cost3@example.com") { + customer { + email + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "updateCustomerEmail": { + "customer": { + "email": "new_email@example.com" + } + } + } +} +``` + +## Input attributes + +The `updateCustomerEmail` mutation requires the following inputs: + +Attribute | Data Type | Description +--- | --- | --- +`email` | String! | The customer's new email address +`password` | String! | The customer's password + +## Output attributes + +The `updateCustomerEmail` mutation returns the `customer` object. + +The following table lists the top-level attributes of the `customer` object. See the [`customer` query]({{page.baseurl}}/graphql/queries/customer.html) for complete details about this object. + +{% include graphql/customer-output-24.md %} + +## Related topics + +* [customer query]({{page.baseurl}}/graphql/queries/customer.html) +* [updateCustomerV2 mutation]({{page.baseurl}}/graphql/mutations/update-customer-v2.html) diff --git a/src/guides/v2.4/graphql/mutations/update-customer-v2.md b/src/guides/v2.4/graphql/mutations/update-customer-v2.md new file mode 100644 index 00000000000..0e78dde5de1 --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/update-customer-v2.md @@ -0,0 +1,86 @@ +--- +group: graphql +title: updateCustomerV2 mutation +--- + +The `updateCustomerV2` mutation updates the personal information in an existing customer account. Use the [`updateCustomerEmail` mutation]({{page.baseurl}}/graphql/mutations/update-customer-email.html) to update the customer's email address. + +The `updateCustomerV2` mutation supersedes the `updateCustomer` mutation as the means to update a customer account. The input objects differ between these two mutations. The `updateCustomer` mutation required the `CustomerInput` object, as did the `createCustomer` mutation. Updating a customer does not require any specific attribute, while several attributes are required when you create a customer. You could not determine this by looking at the schema for those mutations. The `updateCustomerV2` mutation requires the `CustomerUpdateInput` object, which it does not share with the [`createCustomerV2` mutation]({{page.baseurl}}/graphql/mutations/create-customer-v2.html). + +To return or modify information about a customer, Magento recommends you use customer tokens in the header of your GraphQL calls. However, you also can use [session authentication]({{ page.baseurl }}/get-started/authentication/gs-authentication-session.html). + +## Syntax + +`mutation: {updateCustomerV2(input: CustomerUpdateInput!) {CustomerOutput}}` + +## Example usage + +The following call updates the first name and the newsletter subscription status for a specific customer. + +**Request:** + +```graphql +mutation { + updateCustomerV2( + input: { + firstname: "Robert" + is_subscribed: false + } + ) { + customer { + firstname + is_subscribed + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "updateCustomerV2": { + "customer": { + "firstname": "Robert", + "is_subscribed": false + } + } + } +} +``` + +## Input attributes + +The following table lists the attributes you can use as input for the `updateCustomerV2` mutation. + +Attribute | Data Type | Description +--- | --- | --- +`date_of_birth` | String | The customer’s date of birth +`dob` | String | Deprecated. Use `date_of_birth` instead. The customer’s date of birth +`firstname` | String | The customer’s first name +`gender` | Int | The customer's gender (Male - 1, Female - 2) +`is_subscribed` | Boolean | Indicates whether the customer subscribes to the store's newsletter +`lastname` | String | The customer’s last name +`middlename` | String | The customer’s middle name +`password` | String | The customer's password +`prefix` | String | An honorific, such as Dr., Mr., or Mrs. +`suffix` | String | A value such as Sr., Jr., or III +`taxvat` | String | The customer’s Tax/VAT number (for corporate customers) + +## Output attributes + +The `CustomerOutput` object contains the `Customer` object. + +The following table lists the top-level attributes of the `customer` object. See the [`customer` query]({{page.baseurl}}/graphql/queries/customer.html) for complete details about this object. + +{% include graphql/customer-output-24.md %} + +## Related topics + +* [customer query]({{page.baseurl}}/graphql/queries/customer.html) +* [createCustomerV2 mutation]({{page.baseurl}}/graphql/mutations/create-customer-v2.html) +* [createCustomerAddress mutation]({{page.baseurl}}/graphql/mutations/create-customer-address.html) +* [updateCustomerAddress mutation]({{page.baseurl}}/graphql/mutations/update-customer-address.html) +* [updateCustomerEmail mutation]({{page.baseurl}}/graphql/mutations/update-customer-email.html) +* [deleteCustomerAddress mutation]({{page.baseurl}}/graphql/mutations/delete-customer-address.html) diff --git a/src/guides/v2.4/graphql/mutations/update-customer.md b/src/guides/v2.4/graphql/mutations/update-customer.md index a6ca42d05cf..52b9c4c861f 100644 --- a/src/guides/v2.4/graphql/mutations/update-customer.md +++ b/src/guides/v2.4/graphql/mutations/update-customer.md @@ -3,7 +3,10 @@ group: graphql title: updateCustomer mutation --- -Use the `updateCustomer` mutation to update the customer's personal information. +{:.bs-callout-warning} +Magento recommends using the [updateCustomerV2 mutation]({{page.baseurl}}/graphql/mutations/update-customer-v2.html) to update a customer. + +The `updateCustomer` mutation updates the customer's personal information. To return or modify information about a customer, Magento recommends you use customer tokens in the header of your GraphQL calls. However, you also can use [session authentication]({{ page.baseurl }}/get-started/authentication/gs-authentication-session.html). @@ -58,6 +61,8 @@ The following table lists the attributes you can use as input for the `updateCus The `updateCustomer` mutation returns the `CustomerOutput` object. +The following table lists the top-level attributes of the `customer` object. See the [`customer` query]({{page.baseurl}}/graphql/queries/customer.html) for complete details about this object. + {% include graphql/customer-output-24.md %} ## Related topics diff --git a/src/guides/v2.4/graphql/mutations/update-products-in-wishlist.md b/src/guides/v2.4/graphql/mutations/update-products-in-wishlist.md new file mode 100644 index 00000000000..687a8c42b4c --- /dev/null +++ b/src/guides/v2.4/graphql/mutations/update-products-in-wishlist.md @@ -0,0 +1,209 @@ +--- +group: graphql +title: updateProductsInWishlist mutation + +--- + +The `updateProductsInWishlist` mutation changes the quantity, description and option information for the specified items in the customer's wish list. + +{:.bs-callout-info} +Use the `removeProductsFromWishlist` mutation to remove an item from the wish list. Do not set the quantity of an item to 0. + +This mutation requires a valid [customer authentication token]({{page.baseurl}}/graphql/mutations/generate-customer-token.html). + +## Syntax + +`mutation: updateProductsInWishlist(wishlistId: ID! wishlistItems: [WishlistItemUpdateInput!]!): UpdateProductsInWishlistOutput` + +## Example usage + +The following example changes the quantity of the product represented by wish list item `16` to `2` and adds a description for item `17`. + +**Request:** + +``` graphql +mutation { + updateProductsInWishlist( + wishlistId: 1 + wishlistItems: [ + { + wishlist_item_id: 16 + quantity: 2 + } + { + wishlist_item_id: 17 + description: "I love this!" + } + ]){ + wishlist { + id + items_count + items { + id + qty + product { + name + sku + id + ... on BundleProduct { + items { + sku + options { + id + uid + } + } + } + price_range { + minimum_price { + regular_price { + currency + value + } + } + maximum_price { + regular_price { + currency + value + } + } + } + } + } + } + user_errors { + code + message + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "updateProductsInWishlist": { + "wishlist": { + "id": "1", + "items_count": 3, + "items": [ + { + "id": 16, + "qty": 2, + "product": { + "name": "Joust Duffle Bag", + "sku": "24-MB01", + "id": 1, + "price_range": { + "minimum_price": { + "regular_price": { + "currency": "USD", + "value": 34 + } + }, + "maximum_price": { + "regular_price": { + "currency": "USD", + "value": 34 + } + } + } + } + }, + { + "id": 17, + "qty": 1, + "product": { + "name": "Stellar Solar Jacket", + "sku": "WJ01", + "id": 1226, + "price_range": { + "minimum_price": { + "regular_price": { + "currency": "USD", + "value": 75 + } + }, + "maximum_price": { + "regular_price": { + "currency": "USD", + "value": 75 + } + } + } + } + }, + { + "id": 18, + "qty": 1, + "product": { + "name": "Sprite Yoga Companion Kit", + "sku": "24-WG080", + "id": 46, + "price_range": { + "minimum_price": { + "regular_price": { + "currency": "USD", + "value": 61 + } + }, + "maximum_price": { + "regular_price": { + "currency": "USD", + "value": 77 + } + } + } + } + } + ] + }, + "user_errors": [] + } + } +} +``` + +## Input attributes + +The `updateProductsInWishlist` mutation requires the following input. + +Attribute | Data Type | Description +--- | --- | --- +`wishlistId` | ID! | The ID of the customer's wish list +`wishlistItems`| [[WishlistItemUpdateInput!](#WishlistItemUpdateInput)]! | An array containing products to be updated + +### WishlistItemUpdateInput attributes {#WishlistItemUpdateInput} + +The `WishlistItemUpdateInput` object defines each item to add to the wish list. + +Attribute | Data Type | Description +--- | --- | --- +`description` | String | Customer-entered comments about the item +`entered_options`| [EnteredOptionInput] | An array of options that the customer entered +`quantity` | Float | The amount or number of items to add +`selected_options` | [ID!] | An array of strings corresponding to options the customer selected +`wishlist_item_id` | ID! | The ID of the wishlist item to update + +### EnteredOptionInput attributes {#EnteredOptionInput} + +{% include graphql/entered-option-input.md %} + +## Output attributes + +The `UpdateProductsInWishlistOutput` object contains the customer's wish list and error message information. + +Attribute | Data Type | Description +--- | --- | --- +`user_errors` | [WishListUserInputError!]! | An array of errors encountered while adding products to a wish list +`wishlist` | Wishlist! | Contains the wish list with all items that were successfully added + +### Wishlist attributes {#Wishlist} + +{% include graphql/wishlist.md %} + +### WishListUserInputError attributes {#WishListUserInputError} + +{% include graphql/wishlist-user-input-errors.md %} diff --git a/src/guides/v2.4/graphql/payment-methods/klarna.md b/src/guides/v2.4/graphql/payment-methods/klarna.md new file mode 100644 index 00000000000..35640708522 --- /dev/null +++ b/src/guides/v2.4/graphql/payment-methods/klarna.md @@ -0,0 +1,135 @@ +--- +group: graphql +title: Klarna payment method +contributor_name: Klarna +contributor_link: https://www.klarna.com/ +--- + +Klarna Payments enables your consumers to try before they buy, finance purchases on your store with Klarna, or let them pay directly. Klarna offers these payment methods through a widget that you can add inline on your checkout page. + +## Klarna payments workflow + +The following diagram shows the workflow for placing an order when Klarna is the selected payment method. + +Klarna payments require cart information to initiate the session. For this reason, the following steps can be executed only after a cart has been created. + +![Klarna payments sequence diagram]({{ page.baseurl }}/graphql/images/klarna-payments.svg) + +1. The PWA client calls the [`createKlarnaPaymentsSession`]({{ page.baseurl }}/graphql/mutations/create-klarna-payments-session.html) mutation to generate the `client_token` and retrieve a list of `payment_categories`. + + This step can be executed at any time after the cart is created. However, we recommend that you add products to the cart and set the billing address, shipping address, and shipping method on the cart before you perform this step. + +1. Magento forwards the request to Klarna. + +1. Klarna returns the `client_token` and the `payment_categories` available to the shopper. + +1. Magento forwards the token to the client. + +1. The client sends the `cart` query to retrieve the available payment methods. + +1. Magento must always retrieve the latest status information from Klarna before returning the Klarna payments method as an option to the shopper. This is important to ensure that the shopper is always shown the latest available payment options. + +1. Klarna returns an updated list of `payment_categories`. + +1. Magento returns all available payment methods, including Klarna payment methods. + +1. The PWA client renders the Klarna payment widget. + + The PWA client uses the `client_token` and `payment_categories` to initialize the [Klarna Payments JS SDK](https://developers.klarna.com/documentation/klarna-payments/javascript-sdk/). + +1. The PWA client sends the [authorization](https://developers.klarna.com/documentation/klarna-payments/single-call-descriptions/authorize-the-purchase/) directly to Klarna. + + On the checkout page, the shopper selects Klarna as the payment method and clicks **Place Order**. When this happens, the PWA client must send the `authorize()` call to Klarna. Then the shopper follows the authorization steps on the Klarna inline modal. During this phase, the communication between the PWA client and Klarna is handled directly by the Klarna Payments JS SDK. + +1. Klarna returns the `authorization_token` in response to the authorize call. + +1. Set the Payment Method providing the `authorization_token` as part of the `setPaymentMethodOnCart` mutation. + + The client uses the [`setPaymentMethodOnCart`]({{ page.baseurl }}/graphql/mutations/set-payment-method.html) mutation to set the payment method to `klarna_`. The `authorization_token` is passed in the `klarna` object. + +1. Magento returns an updated `cart` object. + +1. The PWA client runs the `placeOrder` mutation. + +1. Magento sends the place order request to Klarna. + +1. Klarna sends the response to Magento. + +1. Magento creates an order and sends an order ID in response to the `placeOrder` mutation. + +## How to handle cart updates + +During the purchase flow, the cart can be updated by adding additional products, applying coupons, and changing the billing or shipping address. All these events might cause a change in Klarna options for the specific shopper. + +In order to always present shoppers with the latest available payment options provided by Klarna, the PWA client must: + +1. Perform a cart update. + +1. Magento returns an updated `cart` object. + +1. Send the `cart` query to retrieve the latest available payment methods. + +1. Magento sends another request to Klarna with the latest information available from the cart. + +1. Klarna returns new list of payment methods. Note that the list might contain different options for the shopper. + +1. Magento returns an updated `cart` object. + +1. [Reload the widget](https://developers.klarna.com/documentation/klarna-payments/single-call-descriptions/load-klarna-payments/) on the client side. + +The following diagram describes the workflow: + +![Klarna payments cart updates sequence diagram]({{ page.baseurl }}/graphql/images/klarna-payments-cart-updates.svg) + +## setPaymentMethodOnCart mutation + +When you set the payment method to Klarna in the [`setPaymentMethodOnCart`]({{ page.baseurl }}/graphql/mutations/set-payment-method.html) mutation, the `payment_method` object must contain a `klarna` object. + +### klarna object + +The `klarna` object must contain the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`authorization_token` | String! | The one-time authorization token generated by the Klarna payment gateway based on shopper details collected during the purchase flow + +## Example usage + +The following example shows the `setPaymentMethodOnCart` mutation constructed for the Klarna payment method. + +**Request:** + +```graphql +mutation { + setPaymentMethodOnCart(input: { + cart_id: "3WxC8gQn4Fbo55yqVLSiUFJ9fmEwnlxG" + payment_method: { + code: "klarna_pay_later" + klarna: { + authorization_token: "e9abc610-6748-256f-a506-355626551326" + } + } + }) { + cart { + selected_payment_method { + code + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "setPaymentMethodOnCart": { + "cart": { + "selected_payment_method": { + "code": "klarna_pay_later" + } + } + } + } +} +``` diff --git a/src/guides/v2.4/graphql/payment-methods/payflow-pro-vault.md b/src/guides/v2.4/graphql/payment-methods/payflow-pro-vault.md new file mode 100644 index 00000000000..0bb3b3d8ae5 --- /dev/null +++ b/src/guides/v2.4/graphql/payment-methods/payflow-pro-vault.md @@ -0,0 +1,98 @@ +--- +group: graphql +title: PayPal Payflow Pro Vault payment method +--- + +PayPal Payflow Pro Vault payment method processes credit and debit card payments using information stored in the Magento vault. This payment method is available for customers of the United States, Canada, Australia, and New Zealand. + +The following conditions must be true to use this payment method: + +- The shopper must be a logged-in customer. + +- The customer must have previously saved their payment information in the Magento vault. + +You cannot use this payment method if the customer decides to use a credit or debit card that is not stored in the Magento vault. + +If the customer's stored payment information becomes outdated, use the [deletePaymentToken mutation]({{page.baseurl}}/graphql/mutations/delete-payment-token.html) to remove the token. Then perform the actions described in the [PayPal Payflow Pro payment method]({{page.baseurl}}/graphql/) to generate a new token and process the order. + +{:.bs-callout-info} +Use the [`storeConfig` query]({{page.baseurl}}/graphql/queries/store-config.html) and specify the `payment_payflowpro_cc_vault_active` attribute to determine whether the Vault feature is enabled for Payflow Pro. + +## Payflow Pro workflow + +The following diagram shows the workflow for placing an order when Payflow Pro Vault is the selected payment method. + +![PayPal Payflow Pro Vault sequence diagram]({{site.baseurl}}/common/images/graphql/paypal-payflow-pro-vault.svg) + +1. Use the [`customerPaymentTokens`]({{page.baseurl}}/graphql/queries/customer-payment-tokens.html) query to retrieve the payment tokens the customer has stored in the vault. + +1. Magento returns an array of payment tokens. + +1. The client renders the token information, and the customer selects a payment method. + + When the customer selects a stored payment method, the PWA uses the [`setPaymentMethodOnCart`]({{page.baseurl}}/graphql/mutations/set-payment-method.html) mutation to set the payment method to `payflowpro_cc_vault`. The vaulted public hash is passed in the [`payflowpro_cc_vault`](#payflowpro_cc_vault) object. + +1. Magento returns a `Cart` object. + +1. The client runs the [`placeOrder`]({{page.baseurl}}/graphql/mutations/place-order.html) mutation. + +1. Magento sends an authorization request to the gateway. + +1. The gateway sends the response to Magento. + +1. Magento creates an order and sends an order ID in response to the `placeOrder` mutation. + +## Additional Payment information + +When you set the payment method to Payflow Pro Vault in the [`setPaymentMethodOnCart`]({{page.baseurl}}/graphql/mutations/set-payment-method.html) mutation, the `payment_method` object must contain a `payflowpro_cc_vault` object, which contains the customer's public hash. + +### payflowpro_cc_vault attributes {#payflowpro_cc_vault} + +The `payflowpro_cc_vault` object must contain the following attribute: + +Attribute | Data Type | Description +--- | --- | --- +`public_hash` | String! | The public hash of the payment token + +### Example usage + +The following example shows the `setPaymentMethodOnCart` mutation constructed for the Payflow Pro payment method. + +**Request:** + +```graphql +mutation { + setPaymentMethodOnCart(input: { + cart_id: "IeTUiU0oCXjm0uRqGCOuhQ2AuQatogjG" + payment_method: { + code: "payflowpro_cc_vault" + payflowpro_cc_vault: { + public_hash: "" + } + } + } + }) + { + cart { + selected_payment_method { + code + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "setPaymentMethodOnCart": { + "cart": { + "selected_payment_method": { + "code": "payflowpro_cc_vault" + } + } + } + } +} +``` diff --git a/src/guides/v2.4/graphql/payment-methods/payflow-pro.md b/src/guides/v2.4/graphql/payment-methods/payflow-pro.md deleted file mode 120000 index f92f3aa2c76..00000000000 --- a/src/guides/v2.4/graphql/payment-methods/payflow-pro.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/payment-methods/payflow-pro.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/payment-methods/payflow-pro.md b/src/guides/v2.4/graphql/payment-methods/payflow-pro.md new file mode 100644 index 00000000000..8f507033fd0 --- /dev/null +++ b/src/guides/v2.4/graphql/payment-methods/payflow-pro.md @@ -0,0 +1,95 @@ +--- +group: graphql +title: PayPal Payflow Pro payment method +--- + +Payflow Pro is a payment gateway that processes debit and credit card payments. It is available for customers of the United States, Canada, Australia, and New Zealand. + +Other PayPal solutions have the same GraphQL workflow as Payflow Pro. The information in this topic also applies to the following PayPal solution: + +- Payments Pro + +If Payflow Pro has been configured to implement Express Checkout, use the [PayPal Express Checkout for Payflow payment method]({{page.baseurl}}/graphql/payment-methods/payflow-express.html) instead. + +{:.bs-callout-info} +If the `is_active_payment_token_enabler` attribute is set to `1` (true), in future orders, the logged-in customer can use the [Payflow Pro Vault payment method]({{page.baseurl}}/graphql/payment-methods/payflow-pro-vault.html). + +## Payflow Pro workflow + +The following diagram shows the workflow for placing an order when Payflow Pro is the selected payment method. + +![PayPal Payflow Pro sequence diagram]({{site.baseurl}}/common/images/graphql/paypal-payflow-pro.svg) + +{% include graphql/payment-methods/payflow-pro-workflow.md %} + +## Additional Payment information + +When you set the payment method to Payflow Pro in the [`setPaymentMethodOnCart`]({{page.baseurl}}/graphql/mutations/set-payment-method.html) mutation, the `payment_method` object must contain a `payflowpro` object and a `CreditCardDetailsInput` object. + +### payflowpro object + +The `payflowpro` object must contain the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`cc_details` | CreditCardDetailsInput! | Required input for credit card related information +`is_active_payment_token_enabler` | Boolean | States whether details about the customer's credit/debit card should be tokenized for later use. Required only if Vault is enabled for PayPal Payflow Pro payment integration. + +### CreditCardDetailsInput object + +The `CreditCardDetailsInput` object must contain the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`cc_exp_month` | Int! | Credit card expiration month +`cc_exp_year` | Int! | Credit card expiration year +`cc_last_4` | Int! | Last four digits of the credit card +`cc_type` | String! | Credit card type + +### Example usage + +The following example shows the `setPaymentMethodOnCart` mutation constructed for the Payflow Pro payment method. + +**Request:** + +```graphql +mutation { + setPaymentMethodOnCart(input: { + cart_id: "IeTUiU0oCXjm0uRqGCOuhQ2AuQatogjG" + payment_method: { + code: "payflowpro" + payflowpro: { + cc_details: { + cc_exp_month: 12 + cc_exp_year: 2023 + cc_last_4: 1111 + cc_type: "VI" + } + is_active_payment_token_enabler: 1 + } + } + }) + { + cart { + selected_payment_method { + code + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "setPaymentMethodOnCart": { + "cart": { + "selected_payment_method": { + "code": "payflowpro" + } + } + } + } +} +``` diff --git a/src/guides/v2.4/graphql/protected-mutations.md b/src/guides/v2.4/graphql/protected-mutations.md new file mode 120000 index 00000000000..5632f99185f --- /dev/null +++ b/src/guides/v2.4/graphql/protected-mutations.md @@ -0,0 +1 @@ +../../v2.3/graphql/protected-mutations.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/queries/available-stores.md b/src/guides/v2.4/graphql/queries/available-stores.md new file mode 100644 index 00000000000..c32032ad227 --- /dev/null +++ b/src/guides/v2.4/graphql/queries/available-stores.md @@ -0,0 +1,60 @@ +--- +group: graphql +title: availableStores query +--- + +The `availableStores` query returns configuration information about all store views that have the same parent website. Use this query to implement a store switcher. + +{:.bs-callout-tip} +Specify the [Store header]({{ page.baseurl }}/graphql/send-request.html) to determine the scope of the call. + +## Syntax + +`availableStores: [StoreConfig]` + +## Example usage + +The following query returns information about the store's catalog configuration. + +**Request:** + +```graphql +query { + availableStores { + id + code + locale + base_currency_code + base_url + } +} +``` + +**Response:** + +```json +{ + "data": { + "availableStores": [ + { + "id": 1, + "code": "default", + "locale": "en_US", + "base_currency_code": "USD", + "base_url": "http://example.com/" + }, + { + "id": 2, + "code": "de", + "locale": "de_DE", + "base_currency_code": "EUR", + "base_url": "http://example.com/" + } + ] + } +} +``` + +## Output attributes + +{% include graphql/store-config.md %} diff --git a/src/guides/v2.4/graphql/queries/cart.md b/src/guides/v2.4/graphql/queries/cart.md index c915e651bed..fc482b48690 100644 --- a/src/guides/v2.4/graphql/queries/cart.md +++ b/src/guides/v2.4/graphql/queries/cart.md @@ -574,7 +574,7 @@ The top-level `Cart` object is listed first. All interfaces and child objects ar The `Cart` object can contain the following attributes. -{% include graphql/cart-object.md %} +{% include graphql/cart-object-24.md %} ### AppliedCoupon object {#AppliedCoupon} @@ -682,13 +682,22 @@ Attribute | Data Type | Description ### CartItemInterface {#CartItemInterface} +The `CartItemInterface` has the following implementations: + +* BundleCartItem +* ConfigurableCartItem +* DownloadableCartItem +* GiftCardCartItem +* SimpleCartItem +* VirtualCartItem + The `CartItemInterface` can contain the following attributes. Attribute | Data Type | Description --- | --- | --- `id` | String | ID of the item `prices` | [CartItemPrices](#CartItemPrices) | Includes the price of an item, any applied discounts, and calculated totals -`product` | [ProductInterface]({{ page.baseurl }}/graphql/product/product-interface.html) | Contains attributes that are common to all types of products +`product` | [ProductInterface]({{ page.baseurl }}/graphql/interfaces/product-interface.html) | Contains attributes that are common to all types of products `quantity` | Float | The number of items in the cart ### CartItemPrices object {#CartItemPrices} @@ -721,6 +730,7 @@ Attribute | Data Type | Description `applied_taxes` | [[CartTaxItem]](#CartTaxItem) | An array containing the names and amounts of taxes applied to the item `discount` | CartDiscount | Deprecated. Use `discounts` instead `discounts` | [Discount] | An array containing all discounts applied to the cart +`gift_options` | [GiftOptionsPrices](#GiftOptionsPrices) | The list of prices for the selected gift options `grand_total` | Money | The total, including discounts, taxes, shipping, and other fees `subtotal_excluding_tax` | Money | Subtotal without taxes `subtotal_including_tax` | Money | Subtotal with taxes @@ -748,6 +758,33 @@ Attribute | Data Type | Description `amount` | Money! | The amount of the discount applied to the cart `label` | String! | The description of the discount +### GiftMessage object {#GiftMessage} + +{% include graphql/gift-message.md %} + +### GiftOptionsPrices object {#GiftOptionsPrices} + +The `GiftOptionsPrices` object can contain the following attributes. + +Attribute | Data Type | Description +--- | --- | --- +`gift_wrapping_for_items` | Money | The price of the gift wrapping for all individual order items +`gift_wrapping_for_order` | Money | The price of the gift wrapping for the whole order +`printed_card` | Money | The price of the printed card + +### GiftWrapping object {#GiftWrapping} + +{% include graphql/gift-wrapping.md %} + +### RewardPointsAmount {#RewardPointsAmount} + +The `RewardPointsAmount` object must contain the following attributes. + +Attribute | Data Type | Description +--- | --- | --- +`points` | Float! | The amount of reward points, in points +`money` | Money! | The amount of reward points, in the store's currency + ### SelectedPaymentMethod object {#SelectedPaymentMethod} The `SelectedPaymentMethod` object can contain the following attributes. diff --git a/src/guides/v2.4/graphql/queries/customer-cart.md b/src/guides/v2.4/graphql/queries/customer-cart.md deleted file mode 120000 index e7d85e14326..00000000000 --- a/src/guides/v2.4/graphql/queries/customer-cart.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/queries/customer-cart.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/queries/customer-cart.md b/src/guides/v2.4/graphql/queries/customer-cart.md new file mode 100644 index 00000000000..3782cb19749 --- /dev/null +++ b/src/guides/v2.4/graphql/queries/customer-cart.md @@ -0,0 +1,82 @@ +--- +group: graphql +title: customerCart query +--- + +The `customerCart` query returns the active cart for the logged-in customer. If the cart does not exist, the query creates one. The customer's authorization token must be specified in the headers. + +The `customerCart` query differs from the `cart` query in the following ways: + +- The `customerCart` query must be run on behalf of a logged-in customer. If you run this query on behalf of a guest, an exception will be thrown. +- The `cart` query requires a `cart_id` value as input. The `customerCart` query does not take any input parameters. + +You can define the query to return the `id` attribute. You can use the value of this attribute as the `destination_cart_id` input parameter in the [`mergeCarts` mutation]({{page.baseurl}}/graphql/mutations/merge-carts.html). (The `mergeCarts` mutation provides the ability to merge a guest cart with the logged-in customer's cart.) + +{: .bs-callout-tip } +If you know the value of the logged-in customer's cart ID, you can allow the customer to start an order on one device and complete it on another. + +## Syntax + +`customerCart: Cart!` + +## Example usage + +The following query lists the products in the logged-in customer's cart: + +**Request:** + +```graphql +{ + customerCart { + id + items { + id + product { + name + sku + } + quantity + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "customerCart": { + "id": "CYmiiQRjPVc2gJUc5r7IsBmwegVIFO43", + "items": [ + { + "id": "11", + "product": { + "name": "Strive Shoulder Pack", + "sku": "24-MB04" + }, + "quantity": 1 + }, + { + "id": "12", + "product": { + "name": "Radiant Tee", + "sku": "WS12" + }, + "quantity": 1 + } + ] + } + } +} +``` + +## Output attributes + +The `customerCart` query returns the `Cart` object. + +### Cart object {#CartObject} + +{% include graphql/cart-object-24.md %} + +[Cart query output]({{page.baseurl}}/graphql/queries/cart.html#cart-output) provides more information about the `Cart` object. diff --git a/src/guides/v2.4/graphql/queries/customer-orders.md b/src/guides/v2.4/graphql/queries/customer-orders.md deleted file mode 120000 index b280d9d433f..00000000000 --- a/src/guides/v2.4/graphql/queries/customer-orders.md +++ /dev/null @@ -1 +0,0 @@ -../../../v2.3/graphql/queries/customer-orders.md \ No newline at end of file diff --git a/src/guides/v2.4/graphql/queries/customer-orders.md b/src/guides/v2.4/graphql/queries/customer-orders.md new file mode 100644 index 00000000000..bd0557b5e13 --- /dev/null +++ b/src/guides/v2.4/graphql/queries/customer-orders.md @@ -0,0 +1,99 @@ +--- +group: graphql +title: customerOrders query +--- +{:.bs-callout-warning} +The `customerOrders` query has been deprecated. Specify the `orders` object in the [`customer`]({{page.baseurl}}/graphql/queries/customer.html) query instead. + +The Sales module performs a wide variety of functions, including order, invoice, and shipment management. However, most of these functions are performed on the backend, and the customer does not have access to this information. By returning a list of customer orders, the `customerOrders` query allows a customer to retrieve their order histories. + +Magento recommends you use customer tokens in the header of your GraphQL calls. However, you also can use [session authentication]({{ page.baseurl }}/get-started/authentication/gs-authentication-session.html). + +## Syntax + +`{customerOrders {CustomerOrders}}` + +## Example usage + +The following query returns the order history of the logged in customer. + +**Request:** + +```graphql +{ + customerOrders { + items { + order_number + id + created_at + grand_total + status + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "customerOrders": { + "items": [ + { + "order_number": "000000001", + "id": 1, + "created_at": "2019-02-21 00:24:34", + "grand_total": 36.39, + "status": "processing" + }, + { + "order_number": "000000002", + "id": 2, + "created_at": "2019-02-21 00:24:35", + "grand_total": 39.64, + "status": "closed" + } + ] + } + } +} +``` + +## Output attributes + +The `CustomerOrders` object contains the `items` attribute. + +Attribute | Data type | Description +--- | --- | --- +`items` | [`[CustomerOrder]`](#customerOrderAttributes) | An array of customer orders + +### Customer order items attributes {#customerOrderAttributes} + +The `CustomerOrder` object defines details about each order the customer has placed. + +Attribute | Data type | Description +--- | --- | --- +`created_at` | String | A timestamp indicating when the order was placed +`gift_message` | [GiftMessage]({{page.baseurl}}/graphql/queries/customer-orders.html#GiftMessage) | The entered gift message for the order +`grand_total` | Float | The total of the order +`id` | Int | The ID assigned to the customer's order +`increment_id` | String | Deprecated. Use `order_number` instead. An ID that indicates the sequence of the order in the customer's order history +`order_number` | String! | The order number assigned to the order +`status` | String | The status of the order, such as `open`, `processing`, or `closed` + +#### GiftMessage object {#GiftMessage} + +The `GiftMessage` object contains the following required attributes. + +Attribute | Data Type | Description +--- | --- | --- +`to` | String! | Recipient name +`from` | String! | Sender name +`message` | String! | Gift message text + +## Errors + +Error | Description +--- | --- +`The current customer isn't authorized.` | The current customer is not currently logged in, or the customer's token does not exist in the `oauth_token` table. diff --git a/src/guides/v2.4/graphql/queries/customer.md b/src/guides/v2.4/graphql/queries/customer.md index e6029ab42ee..78807350083 100644 --- a/src/guides/v2.4/graphql/queries/customer.md +++ b/src/guides/v2.4/graphql/queries/customer.md @@ -13,7 +13,7 @@ To return or modify information about a customer, Magento recommends you use cus ## Example usage -### Retrieving the logged-in customer +### Retrieve basic information about the logged-in customer The following call returns information about the logged-in customer. Provide the customer's token in the header section of the query. @@ -74,8 +74,303 @@ The following call returns information about the logged-in customer. Provide the } } ``` +### Retrieve a summary of the customer's order history -### Retrieving the store credit history +The following example returns a summary of the logged-in customer's previous orders. + +**Request:** + +```graphql +query { + customer { + orders( + pageSize: 20 + ) { + items { + id + order_date + total { + grand_total { + value + currency + } + } + status + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "customer": { + "orders": { + "items": [ + { + "id": "MQ==", + "order_date": "2020-03-18 17:25:20", + "total": { + "grand_total": { + "value": 36.39, + "currency": "USD" + } + }, + "status": "Complete" + }, + { + "id": "Mg==", + "order_date": "2020-03-18 17:25:20", + "total": { + "grand_total": { + "value": 39.64, + "currency": "USD" + } + }, + "status": "Closed" + }, + { + "id": "Mw==", + "order_date": "2020-03-21 22:41:38", + "total": { + "grand_total": { + "value": 205.68, + "currency": "USD" + } + }, + "status": "Pending" + }, + { + "id": "NA==", + "order_date": "2020-08-03 02:35:35", + "total": { + "grand_total": { + "value": 159.13, + "currency": "USD" + } + }, + "status": "Complete" + }, + { + "id": "NQ==", + "order_date": "2020-09-08 03:57:11", + "total": { + "grand_total": { + "value": 132.57, + "currency": "USD" + } + }, + "status": "Complete" + } + ] + } + } + } +} +``` + +### Retrieve detailed information about a specific order + +The following example returns details about one of the customer's previous orders. + +These topics contain examples with fragments and provide even more details: + +* [CreditMemoItemInterface attributes and implementations]({{page.baseurl}}/graphql/interfaces/credit-memo-item-interface.html) +* [InvoiceItemInterface attributes and implementations]({{page.baseurl}}/graphql/interfaces/invoice-item-interface.html) +* [OrderItemInterface attributes and implementations]({{page.baseurl}}/graphql/interfaces/order-item-interface.html) +* [ShipmentItemInterface attributes and implementations]({{page.baseurl}}/graphql/interfaces/shipment-item-interface.html) + +**Request:** + +```graphql +{ + customer { + orders(filter: {number: {eq: "000000001"}}) { + total_count + items { + id + number + order_date + status + items { + product_name + product_sku + product_url_key + product_sale_price { + value + } + product_sale_price { + value + currency + } + quantity_ordered + quantity_invoiced + quantity_shipped + } + carrier + shipments { + id + number + items { + product_name + quantity_shipped + } + } + total { + base_grand_total { + value + currency + } + grand_total { + value + currency + } + total_tax { + value + } + subtotal { + value + currency + } + taxes { + amount { + value + currency + } + title + rate + } + total_shipping { + value + } + shipping_handling { + amount_including_tax { + value + } + amount_excluding_tax { + value + } + total_amount { + value + } + taxes { + amount { + value + } + title + rate + } + } + discounts { + amount { + value + currency + } + label + } + } + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "customer": { + "orders": { + "total_count": 1, + "items": [ + { + "id": "MQ==", + "carrier": "Flat Rate", + "number": "000000001", + "order_date": "2020-03-18 17:25:20", + "status": "Complete", + "items": [ + { + "product_name": "Iris Workout Top", + "product_sku": "WS03-XS-Red", + "product_url_key": "iris-workout-top", + "product_sale_price": { + "value": 29, + "currency": "USD" + }, + "quantity_ordered": 1, + "quantity_invoiced": 1, + "quantity_shipped": 1 + } + ], + "shipments": [ + { + "id": "MDAwMDAwMDAx", + "number": "000000001", + "items": [ + { + "product_name": "Iris Workout Top", + "quantity_shipped": 1 + } + ] + } + ], + "total": { + "base_grand_total": { + "value": 36.39, + "currency": "USD" + }, + "grand_total": { + "value": 36.39, + "currency": "USD" + }, + "total_tax": { + "value": 2.39 + }, + "subtotal": { + "value": 29, + "currency": "USD" + }, + "taxes": [ + { + "amount": { + "value": 2.39, + "currency": "USD" + }, + "title": "US-MI-*-Rate 1", + "rate": 8.25 + } + ], + "total_shipping": { + "value": 5 + }, + "shipping_handling": { + "amount_including_tax": { + "value": 5 + }, + "amount_excluding_tax": { + "value": 5 + }, + "total_amount": { + "value": 5 + }, + "taxes": [] + }, + "discounts": [] + } + } + ] + } + } + } +} +``` + +### Retrieve the store credit history The following example returns the store credit history for the logged-in user. @@ -267,6 +562,73 @@ The `customer` object can contain the following attributes: {% include graphql/customer-output-24.md %} +### CustomerAddress attributes {#customerAddressOutput} + +The values assigned to attributes such as `firstname` and `lastname` in this object may be different from those defined in the `Customer` object. + +The `CustomerAddress` output returns the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`city` | String | The city or town +`company` | String | The customer's company +`country_code` | CountryCodeEnum | The customer's country +`country_id` | String | Deprecated. Use `country_code` instead. The customer's country +`custom_attributes` | [CustomerAddressAttribute](#customerAddressAttributeOutput) | Deprecated. Not applicable for GraphQL +`customer_id` | Int | Deprecated. This attribute is not applicable for GraphQL. The ID assigned to the customer +`default_billing` | Boolean | Indicates whether the address is the default billing address +`default_shipping` | Boolean | Indicates whether the address is the default shipping address +`extension_attributes` | [CustomerAddressAttribute](#customerAddressAttributeOutput) | Address extension attributes +`fax` | String | The fax number +`firstname` | String | The first name of the person associated with the shipping/billing address +`id` | Int | The ID assigned to the address object +`lastname` | String | The family name of the person associated with the shipping/billing address +`middlename` | String | The middle name of the person associated with the shipping/billing address +`postcode` | String | The customer's ZIP or postal code +`prefix` | String | An honorific, such as Dr., Mr., or Mrs. +`region` | [CustomerAddressRegion](#customerAddressRegionOutput) | An object that defines the customer's state or province +`region_id` | Int | The unique ID for a pre-defined region +`street` | [String] | An array of strings that define the street number and name +`suffix` | String | A value such as Sr., Jr., or III +`telephone` | String | The telephone number +`vat_id` | String | The customer's Tax/VAT number (for corporate customers) + +#### CustomerAddressAttribute attributes {#customerAddressAttributeOutput} + +The `CustomerAddressAttribute` output data type has been deprecated because the contents are not applicable for GraphQL. It can contain the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`attribute_code` | String | Attribute code +`value` | String | Attribute value + +#### CustomerAddressRegion attributes {#customerAddressRegionOutput} + +The `customerAddressRegion` output returns the following attributes: + +Attribute | Data Type | Description +--- | --- | --- +`region` | String | The state or province name +`region_code` | String | The address region code +`region_id` | Int | The unique ID for a pre-defined region + +### orders input attributes {#orders} + +{% include graphql/customer-orders-output.md %} + +#### ProductReviews object {#ProductReviews} + +`ProductReviews` contains an array of reviews written about the product. + +Attribute | Data Type | Description +--- | --- | --- +`items` | [ProductReview]! | An array of product reviews +`page_info` | [SearchResultPageInfo!]({{page.baseurl}}/graphql/queries/products.html#SearchResultPageInfo) | Metadata for pagination rendering + +#### ProductReview object {#ProductReview} + +{% include graphql/product-review.md %} + ### Wishlist attributes {#Wishlist} Attribute | Data type | Description @@ -277,14 +639,14 @@ Attribute | Data type | Description `sharing_code` | String | An encrypted code that Magento uses to link to the wish list `updated_at` | String | The time of the last modification to the wish list -### WishlistItem attributes {#wishlistitem} +#### WishlistItem attributes {#wishlistitem} Attribute | Data type | Description --- | --- | --- `added_at` | String | The time when the customer added the item to the wish list `description` | String | The customer's comment about this item `id` | Int | The wish list item ID -`product` | [ProductInterface]({{ page.baseurl }}/graphql/product/product-interface.html) | The ProductInterface contains attributes that are common to all types of products. Note that descriptions may not be available for custom and EAV attributes +`product` | [ProductInterface]({{ page.baseurl }}/graphql/interfaces/product-interface.html) | The ProductInterface contains attributes that are common to all types of products. Note that descriptions may not be available for custom and EAV attributes `qty` | Float | The quantity of this wish list item ### Store credit attributes @@ -297,7 +659,7 @@ Attribute | Data Type | Description --- | --- | --- `store_credit` | [CustomerStoreCredit](#CustomerStoreCredit) | Contains the store credit information for the logged-in customer -### CustomerStoreCredit attributes {#CustomerStoreCredit} +#### CustomerStoreCredit attributes {#CustomerStoreCredit} The `store_credit` object contains store credit information, including the balance and history. @@ -307,7 +669,7 @@ Attribute | Data Type | Description `current_balance` | Money | The current store credit balance `enabled` | Boolean | Indicates whether store credits are enabled. If the feature is disabled, then the balance will not be returned -### CustomerStoreCreditHistory attributes {#CustomerStoreCreditHistory} +#### CustomerStoreCreditHistory attributes {#CustomerStoreCreditHistory} The `CustomerStoreCreditHistory` object contains an array of store credit items and paging information. If the store credit or store credit history feature is disabled, then a null value will be returned. @@ -317,7 +679,7 @@ Attribute | Data Type | Description `page_info` | SearchResultPageInfo | An object that includes the `page_size` and `current_page` values specified in the query `total_count` | Int | The number of items returned -### CustomerStoreCreditHistoryItem attributes {#CustomerStoreCreditHistoryItem} +#### CustomerStoreCreditHistoryItem attributes {#CustomerStoreCreditHistoryItem} The `CustomerStoreCreditHistoryItem` object contains information about a specific change to the customer's store credit. @@ -328,6 +690,10 @@ Attribute | Data Type | Description `balance_change` | Money | The amount added to or subtracted from the store credit as a result of this action `date_time_changed` | String | Date and time when the store credit change was made +### Wishlist attributes {#Wishlist} + +{% include graphql/wishlist.md %} + ## Related topics * [isEmailAvailable query]({{page.baseurl}}/graphql/queries/is-email-available.html) diff --git a/src/guides/v2.4/graphql/queries/product-review-ratings-metadata.md b/src/guides/v2.4/graphql/queries/product-review-ratings-metadata.md new file mode 100644 index 00000000000..8baf082bc39 --- /dev/null +++ b/src/guides/v2.4/graphql/queries/product-review-ratings-metadata.md @@ -0,0 +1,155 @@ +--- +group: graphql +title: productReviewRatingsMetadata query +--- + +The `productReviewRatingsMetadata` query returns the active ratings attributes and the values each rating can have. In Luma, these values are one star through five stars. + +Use the [`createProductReview` mutation]({{page.baseurl}}/graphql/mutations/create-product-review.html) to add a product review. + +## Syntax + +`productReviewRatingsMetadata: ProductReviewRatingsMetadata!` + +## Example usage + +The following query returns the metadata for all active ratings attributes. In this example, the default `Rating` attribute has been renamed to `Overall`, and the `Quality` and `Value` attributes have been enabled. + +**Request:** + +```graphql +query { + productReviewRatingsMetadata { + items { + id + name + values { + value_id + value + } + } + } +} +``` + +**Response:** + +```json +{ + "data": { + "productReviewRatingsMetadata": { + "items": [ + { + "id": "NA==", + "name": "Overall", + "values": [ + { + "value_id": "MTY=", + "value": "1" + }, + { + "value_id": "MTc=", + "value": "2" + }, + { + "value_id": "MTg=", + "value": "3" + }, + { + "value_id": "MTk=", + "value": "4" + }, + { + "value_id": "MjA=", + "value": "5" + } + ] + }, + { + "id": "MQ==", + "name": "Quality", + "values": [ + { + "value_id": "MQ==", + "value": "1" + }, + { + "value_id": "Mg==", + "value": "2" + }, + { + "value_id": "Mw==", + "value": "3" + }, + { + "value_id": "NA==", + "value": "4" + }, + { + "value_id": "NQ==", + "value": "5" + } + ] + }, + { + "id": "Mg==", + "name": "Value", + "values": [ + { + "value_id": "Ng==", + "value": "1" + }, + { + "value_id": "Nw==", + "value": "2" + }, + { + "value_id": "OA==", + "value": "3" + }, + { + "value_id": "OQ==", + "value": "4" + }, + { + "value_id": "MTA=", + "value": "5" + } + ] + } + ] + } + } +} +``` + +## Input attributes + +Not applicable + +## Output attributes {#Categories} + +The `ProductReviewRatingsMetadata` output object contains the `items` object. + +Attribute | Data type | Description +--- | --- | --- +`items` | [ProductReviewRatingMetadata!]! | A list of product reviews, sorted by position + +### ProductReviewRatingMetadata attributes {#ProductReviewRatingMetadata} + +The `ProductReviewRatingMetadata` object contains the following attributes. + +Attribute | Data type | Description +--- | --- | --- +`id` | String! | | An encoded rating ID +`name` | String! | The label assigned to an aspect of a product that is being rated, such as quality or price +`values` | [ProductReviewRatingValueMetadata!]! | A list of product review ratings, sorted by position + +### ProductReviewRatingValueMetadata attributes {#ProductReviewRatingValueMetadata} + +The `ProductReviewRatingValueMetadata` object contains the following attributes. + +Attribute | Data type | Description +--- | --- | --- +value | String! | A ratings scale, such as the number of stars awarded +value_id | String! | An encoded rating value ID diff --git a/src/guides/v2.4/graphql/queries/products.md b/src/guides/v2.4/graphql/queries/products.md index 910be9a21d1..fe6643a014a 100644 --- a/src/guides/v2.4/graphql/queries/products.md +++ b/src/guides/v2.4/graphql/queries/products.md @@ -278,7 +278,7 @@ Attribute | Data type | Description ### ProductInterface attributes {#ProductInterface} -The `items` object contains information about each product that match the search criteria. [ProductInterface]({{page.baseurl}}/graphql/product/product-interface.html) describes the possible contents of this object. +The `items` object contains information about each product that match the search criteria. [ProductInterface]({{page.baseurl}}/graphql/interfaces/product-interface.html) describes the possible contents of this object. ### SearchResultPageInfo attributes {#SearchResultPageInfo} diff --git a/src/guides/v2.4/graphql/queries/store-config.md b/src/guides/v2.4/graphql/queries/store-config.md index d659b99acb2..1ab620cdc67 100644 --- a/src/guides/v2.4/graphql/queries/store-config.md +++ b/src/guides/v2.4/graphql/queries/store-config.md @@ -13,7 +13,7 @@ The `storeConfig` query defines information about a store's configuration. You c ### Query a store's configuration -The following call returns all details of a store's configuration. +The `storeConfig` query can return `base` and `extended` store configuration setting. The following call returns all `base` details of a store's configuration. **Request:** @@ -36,11 +36,6 @@ The following call returns all details of a store's configuration. secure_base_link_url secure_base_static_url secure_base_media_url - store_name - send_friend { - enabled_for_customers - enabled_for_guests - } } } ``` @@ -59,19 +54,14 @@ The following call returns all details of a store's configuration. "default_display_currency_code": "USD", "timezone": "America/Chicago", "weight_unit": "lbs", - "base_url": "http://magento2.vagrant193/", - "base_link_url": "http://magento2.vagrant193/", - "base_static_url": "http://magento2.vagrant193/pub/static/version1536249714/", - "base_media_url": "http://magento2.vagrant193/pub/media/", - "secure_base_url": "http://magento2.vagrant193/", - "secure_base_link_url": "http://magento2.vagrant193/", - "secure_base_static_url": "http://magento2.vagrant193/pub/static/version1536249714/", - "secure_base_media_url": "http://magento2.vagrant193/pub/media/", - "store_name": "My Store", - "send_friend": { - "enabled_for_customers": true, - "enabled_for_guests": false - } + "base_url": "http://magentohost.example.com/", + "base_link_url": "http://magentohost.example.com/", + "base_static_url": "http://magentohost.example.com/pub/static/version1536249714/", + "base_media_url": "http://magentohost.example.com/pub/media/", + "secure_base_url": "http://magentohost.example.com/", + "secure_base_link_url": "http://magentohost.example.com/", + "secure_base_static_url": "http://magentohost.example.com/pub/static/version1536249714/", + "secure_base_media_url": "http://magentohost.example.com/pub/media/" } } } @@ -185,6 +175,36 @@ The following query returns information about the store's catalog configuration. } ``` +### Query a store's customer configuration + +The following query returns information about the store's customer configuration. + +**Request:** + +```graphql +{ + storeConfig { + autocomplete_on_storefront + minimum_password_length + required_character_classes_number + } +} +``` + +**Response:** + +```json +{ + "data": { + "storeConfig": { + "autocomplete_on_storefront": true, + "minimum_password_length": "6", + "required_character_classes_number": "2" + } + } +} +``` + ### Query a store's fixed product tax configuration The following query returns enumeration values that indicate the store's fixed product tax configuration. @@ -217,106 +237,4 @@ The following query returns enumeration values that indicate the store's fixed p ## Output attributes -### Supported storeConfig attributes - -Use the `storeConfig` attributes to retrieve information about the store's configuration; such as, locale, currency codes, and secure and unsecure URLs. - -Attribute | Data Type | Description | Example ---- | --- | --- | --- -`base_currency_code` | String | The code representing the currency in which Magento processes all payment transactions | `USD` -`base_link_url` | String | A fully-qualified URL that is used to create relative links to the `base_url` | `http://magentohost.example.com/` -`base_static_url` | String | The fully-qualified URL that specifies the location of static view files | `http://magentohost.example.com/pub/static/` -`base_media_url` | String | The fully-qualified URL that specifies the location of user media files | `http://magentohost.example.com/pub/media/` -`base_url` | String | The store's fully-qualified base URL | `http://magentohost.example.com/` -`code` | String | A unique identifier for the store | `default` -`default_display_currency_code` | String | The code representing the currency displayed on the store | `USD` -`id` | Integer | The ID number assigned to the store | `1` -`locale` | String | The store's locale | `en_US` -`secure_base_link_url` | String | A secure fully-qualified URL that is used to create relative links to the `base_url` | `https://magentohost.example.com/` -`secure_base_media_url` | String | The secure fully-qualified URL that specifies the location of user media files | `https://magentohost.example.com/pub/media/` -`secure_base_static_url` | String | The secure fully-qualified URL that specifies the location of static view files | `https://magentohost.example.com/pub/static/` -`secure_base_url` | String | The store's fully-qualified secure base URL | `https://magentohost.example.com/` -`send_friend` | SendFriendConfiguration | Email to a Friend configuration | Not applicable -`store_name` | String | The store's name | `My Store` -`timezone` | String | The store's time zone | `America/Chicago` -`website_id` | Integer | The ID number assigned to the parent website | `1` -`weight_unit` | String | The weight unit for products | `lbs`, `kgs`, or similar - -#### SendFriendConfiguration attributes - -Attribute | Data Type | Description ---- | --- | --- -`enabled_for_customers` | Boolean! | Indicates whether the Email to a Friend feature is enabled for customers -`enabled_for_guests` | Boolean! | Indicates whether the Email to a Friend feature is enabled for guests - -### Supported theme attributes - -Use the `theme` attributes to retrieve information about the store's thematic elements; such as, footer and header information, copyright text, and logo information. These attributes are defined in the `ThemeGraphQl` module. - -Attribute | Data Type | Description ---- | --- | --- -`absolute_footer` | String | Contains scripts that must be included in the HTML before the closing `` tag -`copyright` | String | The copyright statement that appears at the bottom of each page -`default_description` | String | The description that provides a summary of your site for search engine listings and should not be more than 160 characters in length -`default_keywords` | String | A series of keywords that describe your store, each separated by a comma -`default_title` | String | The title that appears at the title bar of each page when viewed in a browser -`demonotice` | Int | Controls the display of the demo store notice at the top of the page. Options: `0` (No) or `1` (Yes) -`head_includes` | String | Contains scripts that must be included in the HTML before the closing `` tag -`head_shortcut_icon` | String | Uploads the small graphic image that appears in the address bar and tab of the browser -`header_logo_src` | String | The path to the logo that appears in the header -`logo_alt` | String | The Alt text that is associated with the logo -`logo_height` | Int | The height of your logo image in pixels -`logo_width` | Int | The width of your logo image in pixels -`title_prefix` | String | A prefix that appears before the title to create a two- or three-part title -`title_suffix` | String | A suffix that appears after the title to create a two-or three part title -`welcome` | String | Text that appears in the header of the page and includes the name of customers who are logged in - -### Supported CMS attributes - -Use the `cms` attributes to retrieve information about the store's default pages. These attributes are defined in the `CmsGraphQl` module. - -Attribute | Data Type | Description ---- | --- | --- -`cms_home_page` | String | Returns the name of the CMS page that identifies the home page for the store -`cms_no_cookies` | String | Identifies a specific CMS page that appears when cookies are not enabled for the browser -`cms_no_route` | String | Identifies a specific CMS page that you want to appear when a 404 “Page Not Found” error occurs -`front` | String | Indicates the landing page that is associated with the base URL -`no_route` | String | Contains the URL of the default page that you want to appear when if a 404 “Page not Found” error occurs -`show_cms_breadcrumbs` | Int | Determines if a breadcrumb trail appears on all CMS pages in the catalog. Options: `0` (No) or `1` (Yes) - -### Supported Catalog attributes - -Use the `catalog` attributes to retrieve information about the store's catalog. These attributes are defined in the `CatalogGraphQl` module. - -Attribute | Data Type | Description | Example ---- | --- | --- -`catalog_default_sort_by` | String | The default sort order of the search results list | `position` -`category_url_suffix` | String | The suffix applied to category pages, such as `.htm` or `.html` | `.html` -`grid_per_page` | Int | The default number of products per page in Grid View | `9` -`grid_per_page_values` | A list of numbers that define how many products can be displayed in List View | `9,15,30` -`list_mode` | String | The format of the search results list | `grid-list` -`list_per_page` | Int | The default number of products per page in List View | `10` -`list_per_page_values` | String | A list of numbers that define how many products can be displayed in List View | `5,10,15,20,25` -`product_url_suffix` | String | The suffix applied to product pages, such as `.htm` or `.html` | `.html` -`root_category_id` | Int | The ID of the root category -`title_separator` | String | Identifies the character that separates the category name and subcategory in the browser title bar | `-` - -### Supported WEEE (fixed product tax) attributes - -The **Stores** > Settings > **Configuration** > **Sales** > **Tax** > **Fixed Product Taxes** panel contains several fields that determine how to display fixed product tax (FPT) values and descriptions. Use the following attributes to determine the values of the **Fixed Product Taxes** fields. These attributes are defined in the `WeeeGraphQl` module. - -Attribute | Data Type | Description ---- | --- | --- -`category_fixed_product_tax_display_setting` | FixedProductTaxDisplaySettings | Corresponds to the **Display Prices In Product Lists** field. It indicates how FPT information is displayed on category pages -`product_fixed_product_tax_display_setting` | FixedProductTaxDisplaySettings | Corresponds to the **Display Prices On Product View Page** field. It indicates how FPT information is displayed on product pages -`sales_fixed_product_tax_display_setting` | FixedProductTaxDisplaySettings | Corresponds to the **Display Prices In Sales Modules** field. It indicates how FPT information is displayed on cart, checkout, and order pages - -The `FixedProductTaxDisplaySettings` data type is an enumeration that describes whether displayed prices include fixed product taxes and whether Magento separately displays detailed information about the FPTs. - -Value | Description ---- | --- -EXCLUDE_FPT_AND_INCLUDE_WITH_DETAILS | The displayed price does not include the FPT amount. You must display the values of `ProductPrice.fixed_product_taxes` and the price including the FPT separately. This value corresponds to **Excluding FPT, Including FPT description and final price** -EXCLUDE_FPT_WITHOUT_DETAILS | The displayed price does not include the FPT amount. The values from `ProductPrice.fixed_product_taxes` are not displayed. This value corresponds to **Excluding FPT** -FPT_DISABLED | The FPT feature is not enabled. You can omit `ProductPrice.fixed_product_taxes` from your query -INCLUDE_FPT_WITH_DETAILS | The displayed price includes the FPT amount while displaying the values of `ProductPrice.fixed_product_taxes` separately. This value corresponds to **Including FPT and FPT description** -INCLUDE_FPT_WITHOUT_DETAILS | The displayed price includes the FPT amount without displaying the `ProductPrice.fixed_product_taxes` values. This value corresponds to **Including FPT only** +{% include graphql/store-config.md %} diff --git a/src/guides/v2.4/graphql/release-notes.md b/src/guides/v2.4/graphql/release-notes.md index 427c958dec3..cc17b1afc46 100644 --- a/src/guides/v2.4/graphql/release-notes.md +++ b/src/guides/v2.4/graphql/release-notes.md @@ -3,18 +3,21 @@ group: graphql title: Release Notes --- -*Release notes published January 2020.* +*Release notes published October 2020.* GraphQL is a flexible and performant API that allows you to build custom front-ends, including headless storefronts, [Progressive Web Apps](https://github.com/magento/pwa-studio) (PWA), and mobile apps for Magento. -The **[Magento GraphQL](https://github.com/magento/graphql-ce) project** is a Magento Community Engineering special project open to contributors. -To take part and contribute, see the [Magento GraphQL](https://github.com/magento/graphql-ce) repository and [wiki](https://github.com/magento/graphql-ce/wiki) to get started. Join us in our [Slack](https://magentocommeng.slack.com/messages/C8076E0KS) channel (or [self signup](https://tinyurl.com/engcom-slack)) to discuss the project. +To take part and contribute, see the [Magento 2](https://github.com/magento/magento2) repository and look for issues with the `Project: GraphQL` tag. Join us in our [Slack](https://magentocommeng.slack.com/messages/C8076E0KS) channel (or [self signup](https://tinyurl.com/engcom-slack)) to discuss the project. These release notes can include: - {:.new}New features - {:.fix}Fixes and improvements +## {{site.data.var.ee}} and {{site.data.var.ce}} 2.4.1 + +As of version 2.4.1, the [Magento Open Source 2.4.1 Release Notes]({{page.baseurl}}/release-notes/open-source-2-4-1.html) and [Magento Commerce 2.4.1 Release Notes]({{page.baseurl}}/release-notes/commerce-2-4-1.html) describe the new GraphQL features and bug fixes. + ## {{site.data.var.ee}} and {{site.data.var.ce}} 2.4.0 - {:.new} **Added the [`reorderItems` mutation]({{page.baseurl}}/graphql/mutations/reorder-items.html).** This mutation enables the logged-in customer to add the contents of a previous order to their cart. @@ -23,6 +26,8 @@ These release notes can include: - {:.new} **Added the [`pickupLocations` query]({{page.baseurl}}/graphql/queries/pickup-locations.html).** When the Inventory in-store pickup feature is enabled, this query allows the shopper to select a pickup location. The `pickup_location_code` attribute has been added to the [`setShippingAddressesOnCart` mutation]({{page.baseurl}}/graphql/mutations/set-shipping-address.html) to specify which source will serve as the pickup location. +The [Magento Open Source 2.4.0 Release Notes]({{page.baseurl}}/release-notes/release-notes-2-4-0-open-source.html#graphql-1) and [Magento Commerce 2.4.0 Release Notes]({{page.baseurl}}/release-notes/release-notes-2-4-0-commerce.html#graphql-1) list the bug fixes. + ## {{site.data.var.ee}} and {{site.data.var.ce}} 2.3.5 - {:.new} **The `products` and `categoryList` queries can now be used to retrieve information about products and categories that have been added to a staged campaign.** These queries require an admin authorization token. See [Using queries](https://devdocs.magento.com/guides/v2.3/graphql/queries/index.html#staging) for details. diff --git a/src/guides/v2.4/install-gde/install/cli/install-cli-subcommands-enable.md b/src/guides/v2.4/install-gde/install/cli/install-cli-subcommands-enable.md deleted file mode 120000 index 2652610b978..00000000000 --- a/src/guides/v2.4/install-gde/install/cli/install-cli-subcommands-enable.md +++ /dev/null @@ -1 +0,0 @@ -../../../../v2.3/install-gde/install/cli/install-cli-subcommands-enable.md \ No newline at end of file diff --git a/src/guides/v2.4/install-gde/install/cli/install-cli-subcommands-enable.md b/src/guides/v2.4/install-gde/install/cli/install-cli-subcommands-enable.md new file mode 100644 index 00000000000..54b170b1b69 --- /dev/null +++ b/src/guides/v2.4/install-gde/install/cli/install-cli-subcommands-enable.md @@ -0,0 +1,78 @@ +--- +group: installation-guide +title: Enable or disable modules +functional_areas: + - Install + - System + - Setup +--- + +## First steps {#instgde-cli-before} +{% include install/first-steps-cli.md %} +In addition to the command arguments discussed here, see [Common arguments]({{ page.baseurl }}/install-gde/install/cli/install-cli-subcommands.html#instgde-cli-subcommands-common). + +## Prerequisites {#instgde-cli-subcommands-enable-disable-prereq} + +This command has no prerequisites. + +## Module status {#instgde-cli-subcommands-status} + +Use the following command to list enabled and disabled modules: + +```bash +bin/magento module:status [--enabled] [--disabled] +``` + +where + +* `--enabled` lists all enabled modules. +* `--disabled` lists all disabled modules. +* `` is a space-delimited list of modules to check the status. If any [module](https://glossary.magento.com/module) name contains special characters, enclose the name in either single or double quotes. + +## Module enable, disable {#instgde-cli-subcommands-enable-disable} + +To enable or disable available modules, use the following command: + +```bash +bin/magento module:enable [-c|--clear-static-content] [-f|--force] [--all] +``` + +```bash +bin/magento module:disable [-c|--clear-static-content] [-f|--force] [--all] +``` + +where + +* `` is a space-delimited list of modules to enable or disable. If any [module](https://glossary.magento.com/module) name contains special characters, enclose the name in either single or double quotes. +* `--all` to enable or disable all modules at the same time. +* `-f` or `--force` to force a module to be enabled or disabled despite dependencies. Before you use this option, see [About enabling and disabling modules](#instgde-cli-subcommands-enable-modules). +* `-c` or `--clear-static-content` cleans [generated static view files]({{ page.baseurl }}/config-guide/cli/config-cli-subcommands-static-view.html#config-cli-static-overview). + + Failure to clear static view files might result in issues if there are multiple files with the same name and you do not clear all of them. + + In other words, because of the [static file fallback]({{ page.baseurl }}/config-guide/cli/config-cli-subcommands-static-view.html) rules, if you do not clear static files and there is more than one file named `logo.svg` that are different, fallback might cause the wrong file to display. + +For example, to disable the Weee module, enter: + +```bash +bin/magento module:disable Magento_Weee +``` + +For important information about enabling and disabling modules, see [About enabling and disabling modules](#instgde-cli-subcommands-enable-modules). + +## Update the database {#instgde-cli-subcommands-enable-update} + +If you enabled one or more modules, run the following command to update the database: + +```bash +bin/magento setup:upgrade +``` + +Then clean the cache: + +```bash +bin/magento cache:clean +``` + +## About enabling and disabling modules {#instgde-cli-subcommands-enable-modules} +{% include install/enable-disable-modules.md %} diff --git a/src/guides/v2.4/release-notes/b2b-release-notes.md b/src/guides/v2.4/release-notes/b2b-release-notes.md index f8c5a56c60d..c1121fa8478 100644 --- a/src/guides/v2.4/release-notes/b2b-release-notes.md +++ b/src/guides/v2.4/release-notes/b2b-release-notes.md @@ -9,6 +9,77 @@ These release notes can include: - {:.new}New features - {:.fix}Fixes and improvements +## Magento B2B - Version 1.3.0 + +This release includes improvements to order approvals, shipping methods, shopping cart, and logging of Admin actions. + +- {:.new} B2B order approvals have been enhanced to improve usability and to allow for bulk actions on purchase orders. + +- {:.new} B2B merchants can now control shipping methods that are offered to each Company. + +- {:.new} Merchants can now allow users to clear the contents of their shopping cart in a single action and can configure this ability independently on each website + +- {:.new} B2B buyers can now add individual items or the entire contents of their shopping cart directly to a requisition list. + +- {:.new} B2B merchants can create orders from the Admin on behalf of customers using Payment on Account as the payment method. + +- {:.new} Merchants can now directly view all quotes associated with a user from the customer’s detail page. + +- {:.new} Merchants can now filter the Customers Now Online grid by Company. + +- {:.new} Admins can now filter customers in the Admin by Sales Rep. + +- {:.new} To reduce creation of fraudulent or spam accounts, merchants can now enable Google reCAPTCHA on the New Company Request form on the storefront. + +- {:.new} Admin actions taken in the Company modules are now logged in the Admin Actions Log. Actions are logged from all relevant company modules: `Company`, `NegotiableQuote`, `CompanyCredit`, `SharedCatalog`. + +- {:.fix} Magento no longer displays the **Delete customer** button on the **Customers** page when the logged-in administrator does not have rights to delete customers in deployments where B2B is installed. +- {:.fix} Customer group is no longer automatically changed for a customer who is assigned to a Company when you edit the customer on the Customer grid. + +- {:.fix} When a merchant creates a new shared catalog, permissions are now automatically set to **Allow** for the **Display Product Prices** and **Add to Cart** features in categories when the customer group has been assigned this access in catalog permission settings. Previously, these settings were automatically set to **Deny** even when catalog permissions were set to **Allow**. + +- {:.fix} Shared catalog category permissions are no longer overwritten when a product is edited from the product edit page. + +- {:.fix} Magento now sends an email notification confirming that a customer has permission to exceed the designated credit limit when a merchant enables the **Allow To Exceed Credit Limit** setting. Previously, the notification email sent by Magento indicated that the customer did not have permission to exceed the limit. + +- {:.fix} The HTML container that surrounds product price on requisition lists is now rendered correctly for the children of bundled products. + +- {:.fix} Merchants can now designate the language in which company user email is sent when creating a new company in multi-language deployments. Previously, the drop-down menu the enables merchants to select the appropriate store view and language was not displayed. + +- {:.fix} Custom customer address attributes fields are now displayed as expected in the storefront checkout workflow. + +- {:.fix} The B2B Features tab (Admin **Stores** > **Configuration** > **General** ) now opens correctly. Guests can now use QuickOrder to add products to their cart and then successfully remove items. Previously, when a shopper used QuickOrder to add multiple products to their cart, and then removed a product, the product was not removed. + +- {:.fix} A company can now be updated using the REST API PUT `/V1/company/:companyId` request without specifying the `region_id` when state is configured as **not required**. Previously, even though `region_id` was not required, Magento threw an error if it was not specified. + +- {:.fix} When you create or update a B2B Company using the REST API (`http://magento.local/rest/V1/company/2`, where `2` represents the company ID), the response now includes the settings for `applicable_payment_method` or `available_payment_methods` as expected. + +- {:.fix} Magento no longer displays a 404 page when a merchant uses the **Enter** button instead of clicking the **Save** button when creating a requisition list on the storefront. + +- {:.fix} When a merchant creates a new shared catalog, permissions are now automatically set to **Allow** for the **Display Product Prices** and **Add to Cart** features in categories when the customer group has been assigned this access in catalog permission settings. Previously, these settings were automatically set to **Deny** even when catalog permissions were set to **Allow**. + +- {:.fix} Category permissions no longer change when a new product is assigned to a public shared catalog. Previously, category permissions were duplicated. + +- {:.fix} The REST API endpoint PUT `rest/default/V1/company/{id}`, which is used to update Company email, is no longer case-sensitive. + +- {:.fix} Disabling reward modules no longer affects B2B features on customer accounts. Previously, when reward modules were disabled, the following B2B-related tabs were not displayed: Company Profile, Company Users, and Roles and Permissions. + +- {:.fix} Magento now uses the correct sender name on email notifications when changes are made to company accounts. Previously, Magento used the general contact sender name defined in the default scope for all emails. + +- {:.fix} You can now successfully implement multishipping for orders that contain both physical and virtual products. + +- {:.fix} Merchants can now create company users from the Company Users section in My Account and Company Structure pages in deployments where **Access Restriction** is enabled and **Restriction Mode** is set to **Sales: Login Only**. Previously, Magento threw this error when a merchant tried to create a user: Can not register new customer due to restrictions are enabled. + +- {:.fix} Magento no longer resets a customer’s customer group to the default when a customer saves their account information. + +- {:.fix} Magento no longer throws a fatal error when an administrator assigns a customer who has an active shopping cart to a customer group. + +- {:.fix} Magento now provides an `addToCart` DataLayer event for Quick Order and Requisition lists pages. + +- {:.fix} Notification emails that are sent to sales representatives assigned to a company now include the assigned corporate logo. Previously, the notification email included the default LUMA logo, not the uploaded corporate logo. + +- {:.fix} A requisition list now includes all grouped products and quantities that have been added to the list. Previously, when a merchant navigated to a requisition list after adding products to it from a product detail page, Magento displayed this error: `1 product(s) require your attention - Options were updated. Please review available configurations`. + ## Magento B2B - Version 1.2.0 - {:.new} [Storefront Order Search](https://github.com/magento/partners-magento2b2b/pull/16) added thanks to contribution by [Marek Mularczyk]( https://github.com/mmularski) from [Divante](https://www.divante.com/) and community members. diff --git a/src/guides/v2.4/release-notes/backward-incompatible-changes/reference.md b/src/guides/v2.4/release-notes/backward-incompatible-changes/reference.md index c62194e93ce..3367caafff3 100644 --- a/src/guides/v2.4/release-notes/backward-incompatible-changes/reference.md +++ b/src/guides/v2.4/release-notes/backward-incompatible-changes/reference.md @@ -22,6 +22,12 @@ To view changes in functional tests, refer to [Backward incompatible changes in {:.bs-callout-info} Patch releases are primarily focused on delivering security and quality enhancements on a regular basis to help you keep your sites performing at their peak. On an exceptional basis, breaking changes or additional patches or hotfixes may be released to address security or compliance issues and high-impact quality issues. On the module level, these are mostly PATCH-level changes; sometimes MINOR-level changes. See [Release policy]({{site.baseurl}}/release/policy/). +## 2.4.0 - 2.4.1 + +{% include backward-incompatible-changes/open-source/2.4.0-2.4.1-develop.html %} + +{% include backward-incompatible-changes/commerce/2.4.0-2.4.1-develop.html %} + ## 2.3.0 - 2.4.0 {% include backward-incompatible-changes/open-source/2.3.0-2.4.0.md %} diff --git a/src/guides/v2.4/release-notes/bk-release-notes.md b/src/guides/v2.4/release-notes/bk-release-notes.md index f971c64b186..fa2db0cd886 100644 --- a/src/guides/v2.4/release-notes/bk-release-notes.md +++ b/src/guides/v2.4/release-notes/bk-release-notes.md @@ -6,6 +6,9 @@ redirect_from: magento-release-information.html ## Magento 2.4.x release notes +* [{{site.data.var.ce}} 2.4.1 Release Notes]({{page.baseurl}}/release-notes/open-source-2-4-1.html) +* [{{site.data.var.ee}} 2.4.1 Release Notes]({{page.baseurl}}/release-notes/commerce-2-4-1.html) + * [{{site.data.var.ce}} 2.4.0 Release Notes]({{page.baseurl}}/release-notes/release-notes-2-4-0-open-source.html) * [{{site.data.var.ee}} 2.4.0 Release Notes]({{page.baseurl}}/release-notes/release-notes-2-4-0-commerce.html) diff --git a/src/guides/v2.4/release-notes/commerce-2-4-1.md b/src/guides/v2.4/release-notes/commerce-2-4-1.md new file mode 100644 index 00000000000..af5355b585c --- /dev/null +++ b/src/guides/v2.4/release-notes/commerce-2-4-1.md @@ -0,0 +1,1957 @@ +--- +group: release-notes +title: Magento Commerce 2.4.1 Release Notes +--- + +Magento Commerce 2.4.1 introduces enhancements to performance and security plus significant additions to the B2B feature set. Security enhancements include support for the `SameSite` attribute for cookies and the addition of CAPTCHA protection for payment-related and order-related API endpoints and the Place Order storefront page. B2B improvements focus on the order approval process, B2B shipping methods, expanded logging of Admin actions, and enhanced security on storefront. + +This release includes all improvements to core quality that were included in Magento 2.4.0, over 150 new fixes to core code, and over 15 security enhancements. It includes the resolution of almost 300 GitHub issues by our community members. These community contributions range from minor clean-up of core code to significant enhancements in GraphQL. + +All known issues identified in Magento 2.4.0 have been fixed in this release. + +{:.bs-callout-info} + +Quarterly releases may contain backward-incompatible changes (BIC). Magento 2.4.1 contains minor backward-incompatible changes. To review minor backward-incompatible changes, see [BIC reference]({{page.baseurl}}/release-notes/backward-incompatible-changes/reference.html). (Major backward-incompatible issues are described in [BIC highlights]({{page.baseurl}}/release-notes/backward-incompatible-changes/index.html). Not all releases introduce major BICs.) + +## Security-only patch available + +Merchants can now install time-sensitive security fixes without applying the hundreds of functional fixes and enhancements that a full quarterly release (for example, Magento 2.4.0-p1) provides. Patch 2.4.0.1 (Composer package 2.4.0-p1) is a security-only patch that provides fixes for vulnerabilities that have been identified in our previous quarterly release, Magento 2.4.0. All hot fixes that were applied to the 2.4.0 release are included in this security-only patch. (A *hot fix* provides a fix to a released version of Magento that addresses a specific problem or bug.) + +For general information about security-only patches, see the Magento DevBlog post [Introducing the New Security-only Patch Release](https://community.magento.com/t5/Magento-DevBlog/Introducing-the-New-Security-only-Patch-Release/ba-p/141287). For instructions on downloading and applying security-only patches (including patch 2.3.5-p2), see [Install Magento using Composer]({{page.baseurl}}/install-gde/composer.html). Security-only patches include security bug fixes only, not the additional security enhancements that are included in the full patch. + +## Other release information + +Although code for these features is bundled with quarterly releases of the Magento core code, several of these projects (for example, B2B, Page Builder, and Progressive Web Applications (PWA) Studio) are also released independently. Bug fixes for these projects are documented in the separate, project-specific release information that is available in the documentation for each project. + +## Highlights + +Look for the following highlights in this release. + +### Substantial security enhancements + +This release includes over 15 security fixes and platform security improvements. All security fixes have been backported to Magento 2.4.0-p1 and Magento 2.3.6. + +#### Over 15 security enhancements that help close remote code execution (RCE) and cross-site scripting (XSS) vulnerabilities + +No confirmed attacks related to these issues have occurred to date. However, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. Most of these issues require that an attacker first obtains access to the Admin. As a result, we remind you to take all necessary steps to protect your Admin, including but not limited to these efforts: IP allowlisting, [two-factor authentication]({{page.baseurl}}/security/two-factor-authentication.html), use of a VPN, the use of a unique location rather than `/admin`, and good password hygiene. See [Security Updates Available for Magento](https://helpx.adobe.com/security/products/magento/apsb20-59.html) for a discussion of these fixed issues. + +#### Additional security enhancements + +Security improvements for this release include: + +* **CAPTCHA** protection has been added to the following product areas: + + * Place Order storefront page and REST and GraphQL endpoints + * Payment-related REST and GraphQL endpoints. + + CAPTCHA protection for these additional pages is disabled by default. It can be enabled on the Admin in the same way that other pages covered by CAPTCHA are. This protection has been added as an anti-brute force mechanism to protect stores against carding attacks. See [CAPTCHA](https://docs.magento.com/user-guide/stores/security-captcha.html). + +* **Support for the SameSite attribute for cookies**. To support the Google Chrome enforcement of the new cookie classification system, Magento classes that handle cookies have been updated to support the `SameSite` cookie attribute. This attribute is set to `Lax` by default but can be explicitly overridden. + +* **Enhanced Magento Scan Tool**. Adobe has partnered with [Sanguine Security](https://sansec.io/), a leader in preventing digital skimming, to integrate their database of over 8700 threat signatures into the Magento Security Scan Tool. This partnership will enable merchants to get real-time insights into the security status of their site through proactive detection of malware and reduction of false positives. Merchants can register for the tool by visiting `https://account.magento.com/scanner`. For more information, see the [Secure Your Storefront With the Enhanced Magento Security Scan Tool](https://magento.com/blog/magento-news/secure-your-storefront-enhanced-magento-security-scan-tool) blog post. + +{:.bs-callout-info} +Starting with the release of Magento Commerce 2.3.2, Magento will assign and publish indexed Common Vulnerabilities and Exposures (CVE) numbers with each security bug reported to us by external parties. This allows users of Magento Commerce to more easily identify unaddressed vulnerabilities in their deployment. You can learn more about CVE identifiers at [CVE](https://cve.mitre.org/). + +### Infrastructure improvements + +This release contains enhancements to core quality, which improve the quality of the Framework and these functional areas: Customer Account, Catalog, CMS, OMS, Import/Export, Promotions and Targeting, Cart and Checkout, B2B, and Staging and Preview. + +* **Site-Wide Analysis Tool (SWAT) integration with Magento Admin**. (SWAT) provides system insights and instrumentation for Commerce Cloud installations of Magento with 24/7 real-time performance monitoring, reports, and self-service recommendations. Merchants can use the new SWAT Admin role to securely access their SWAT Customer Detail pages through the Magento Admin. See [SWAT FAQ](https://support.magento.com/hc/en-us/articles/360048646671) for an overview. For usage information, see [SWAT](https://docs.magento.com/user-guide/reports/site-wide-analysis-tool.html). + +### Performance improvements + +* **Reduction in the size of network transfers between Redis and Magento**. Plugin list configuration is now generated during the execution of the `bin/magento di:compile` command. This configuration information is written to generated metadata folders based on scope. Previously, this information was stored in cache. Resulting performance improvements include a decrease in network cache size and execution time for many scenarios. + +* **Enhanced message queue consumer performance**. Three new configuration settings support a decrease in consumer queue CPU consumption. These optional parameters provide increased control over consumers and save server resources. See [Configure message queues]({{page.baseurl}}/extension-dev-guide/message-queues/config-mq.html) for a description of the `maxIdleTime`, `sleep`, and `onlySpawnWhenMessageAvailable` parameters. + +* **Improved execution time** for `bin/magento` commands. + +### Adobe Stock Integration + +This release includes Adobe Stock Integration v2.1.0. + +### New Media Gallery + +The New Media Gallery is now enabled by default in the Admin. Merchants can now perform these actions on images in the Media Gallery: + +* Delete images in bulk +* Optimize media storage by identifying duplicate images and images that are not used on the storefront +* Filter images by the storefront area they are used in, including product and category content and CMS blocks +* Work with image metadata + * View metadata from the images uploaded into Media Gallery + * Edit image metadata (title, description, and keywords) + * Search for images by their metadata + +### Page Builder + +Page Builder now supports full screen mode, which supports easier editing of content and provides a consistent experience editing content across the Admin. See [Workspace](https://docs.magento.com/user-guide/cms/page-builder-workspace.html). + +### GraphQL + +This release adds GraphQL coverage for the following features: + +* **Product reviews**. Customers and guests can write product reviews. Customers can retrieve their product review histories. See [Create a product review]({{page.baseurl}}/graphql/mutations/create-product-review.html) and [productReviewRatingsMetadata query]({{page.baseurl}}/graphql/queries/product-review-ratings-metadata.html) for information on retrieving information about the reviews infrastructure. + +* **Gift options**. All customers and guests can add a gift message to their order. On {{site.data.var.ee}} installations, they can also add gift wrapping, gift receipts, and printed cards to the order. See [`setGiftOptionsOnCart` mutation]({{page.baseurl}}/graphql/mutations/set-gift-options.html) and [`updateCartItems` mutation]({{page.baseurl}}/graphql/mutations/update-cart-items.html) + +* **Reward points**. Customers can apply or remove reward points to their carts. They can also view their reward point history. See [`applyRewardPointsToCart`]({{page.baseurl}}/graphql/mutations/apply-reward-points.html) and [`removeRewardPointsFromCart`]({{page.baseurl}}/graphql/mutations/remove-reward-points.html) for a discussion of managing reward points within a cart. + +* **Order history**. All customers can view details about their order histories, including invoices, shipping, and refunds. + +* **Add to cart**. The [`addProductsToCart` mutation]({{page.baseurl}}/graphql/mutations/add-products-to-cart.html) allows you to add any type of product to the active cart. We recommend using this mutation instead of single-purpose mutations such as `addSimpleProductsToCart`. _Fix submitted by Yaroslav Rogoza in pull request [27914](https://github.com/magento/magento2/pull/27914)_. [GitHub-28524](https://github.com/magento/magento2/issues/28524) + +* **Stored payment methods**. Logged-in customers can now store payment details (including Braintree credit card and Braintree with PayPal) in My Account. + +* **Support for wish lists in Magento Open Source**. Added support for Open Source wish lists. You can [add items]({{page.baseurl}}/graphql/mutations/add-products-to-wishlist.html) to, [update items]({{page.baseurl}}/graphql/mutations/update-products-in-wishlist.html) in, and [remove items]({{page.baseurl}}/graphql/mutations/remove-products-from-wishlist.html) from a wish list. + +* **Improved management of customer accounts**. We have added the [`createCustomerV2`]({{page.baseurl}}/graphql/mutations/create-customer-v2.html) and [`updateCustomerV2`]({{page.baseurl}}/graphql/mutations/update-customer-v2.html) mutations to manage customer accounts. These new mutations require different input objects than the `createCustomer` and `updateCustomer` mutations. To change a customer's email address, use the new [`updateCustomerEmail`]({{page.baseurl}}/graphql/mutations/update-customer-email.html) mutation. + +* **Support for Payflow Pro Vault**. Added GraphQL Vault support for the [Payflow Pro Vault]({{page.baseurl}}/graphql/payment-methods/payflow-pro-vault.html) payment method. _Fix submitted by Oleh Usik in pull request [28821](https://github.com/magento/magento2/pull/28821)_. [GitHub-28520](https://github.com/magento/magento2/issues/28520) + +* Updated the GraphQL [`storeConfig` query]({{page.baseurl}}/graphql/queries/store-config.html) to include new customer configuration settings. _Fix submitted by Oleh Usik in pull request [27876](https://github.com/magento/magento2/pull/27876)_. [GitHub-28521](https://github.com/magento/magento2/issues/28521) + +* Added the [`requestPasswordResetEmail` mutation]({{page.baseurl}}/graphql/mutations/request-password-reset-email.html), which triggers the password reset email for the provided email address. _Fix submitted by Oleh Usik in pull request [27876](https://github.com/magento/magento2/pull/27876)_. [GitHub-28521](https://github.com/magento/magento2/issues/28521) + +* **Klarna GraphQL**. Added or updated topics on Klarna GraphQL in [Klarna's payment method]({{page.baseurl}}/graphql/payment-methods/klarna.html) and [`createKlarnaPaymentsSession`]({{page.baseurl}}/graphql/mutations/create-klarna-payments-session.html) + +See the [GraphQL Developer Guide]({{page.baseurl}}/graphql/) for details on these enhancements. + +### PWA Studio + +PWA Studio v8.0.0 introduces new features and enhancements: + +* Updates to the Venia style guide that apply to design tokens, typography, colors, core components, and page layouts + +* Improvements to the Venia mini-cart experience + +* Initial support for multiple locales and localized content on the Venia storefront + +* Numerous improvements to the MyAccount experience of the Venia storefront + +See [Magento compatibility](https://magento.github.io/pwa-studio/technologies/magento-compatibility/) for a list of PWA Studio versions and their compatible Magento core versions. For information about enhancements and bug fixes, see [PWA Studio releases](https://github.com/magento/pwa-studio/releases). + +### B2B + +Magento 2.4.1 introduces B2B v1.3.0. This release includes improvements to order approvals, shipping methods, shopping cart, and logging of Admin actions. + +#### Improvements to Order Approvals + +B2B order approvals have been enhanced to improve usability and to allow for bulk actions on purchase orders. +Improvements to order approval and rejection include the following: + +* **New View Rule page for users without edit privileges**. B2B buyers can now view rules that apply to their company on the new View Rule page when they do not have permission to edit them. + +* **Count alert icon on the Requires My Approval tab**. The Requires My Approval tab in the My Purchase Orders view now displays a counter that indicates the number of pending approval actions. + +* **Bulk order approvals and rejections**. B2B managers and Company Administrators can now perform bulk rejection and approval of purchase orders. These changes allow approvers to approve or reject multiple purchase orders in a single action. + +* Merchants can now search the **Applies to** and **Requires approval from** fields of the My Purchase Orders view and can select multiple user roles during rule creation. + +* Examples of how to configure Order Approval rules are provided on the Rule Configuration page. + +See [Approval rules](https://docs.magento.com/user-guide/customers/account-dashboard-approval-rules.html) + +#### B2B shipping methods enhancements + +B2B merchants can now control shipping methods that are offered to each Company. Merchants can configure the following from the Admin: + +* A specific set of shipping methods for B2B Company accounts +* The use of All or B2B-specific shipping methods for each Company account +* A specific list of B2B shipping methods for each Company account + +#### Shopping cart improvements + +* Merchants can now allow users to clear the contents of their shopping cart in a single action and can configure this ability independently on each website. + +* B2B buyers can now add individual items or the entire contents of their shopping cart directly to a requisition list. + +#### New Admin features + +* B2B merchants can create orders from the Admin on behalf of customers using Payment on Account as the payment method. +* Merchants can now directly view all quotes associated with a user from the customer’s detail page. +* Merchants can now filter the Customers Now Online grid by Company. +* Admins can now filter customers in the Admin by Sales Rep. + +See [B2B Features](https://docs.magento.com/user-guide/configuration/general/b2b-features.html). + +#### Enhanced security on storefront + +To reduce creation of fraudulent or spam accounts, merchants can now enable Google reCAPTCHA on the New Company Request form on the storefront. See [reCAPTCHA](https://docs.magento.com/user-guide/configuration/security/google-recaptcha-storefront.html). + +#### Expanded logging of Admin actions + +Admin actions taken in the Company modules are now logged in the Admin Actions Log. Actions are logged from all relevant company modules: `Company`, `NegotiableQuote`, `CompanyCredit`, `SharedCatalog`. + + +This release also includes multiple bug fixes. See [B2B Release Notes]({{page.baseurl}}/release-notes/b2b-release-notes.html). + +### Magento Functional Testing Framework (MFTF) + +MFTF 3.1.0 is now available. See [Magento Functional Testing Framework Changelog](https://github.com/magento/magento2-functional-testing-framework/blob/develop/CHANGELOG.md). + +### Vendor Developed Extensions + +See the following articles for updates on features and changes for this release: + +* [Amazon Pay](https://docs.magento.com/user-guide/payment/amazon-pay.html) + +* [Braintree](https://docs.magento.com/user-guide/payment/braintree.html) + +* [dotdigital Engagement Cloud](https://docs.magento.com/user-guide/marketing/dotdigital/engagement-cloud.html) + +* [Klarna](https://docs.magento.com/user-guide/payment/klarna.html) + +* [Vertex Cloud](https://docs.magento.com/user-guide/tax/vertex.html) + +* [Yotpo Product Reviews](https://docs.magento.com/user-guide/marketing/yotpo-reviews-intro.html) + +## Fixed issues + +We have fixed hundreds of issues in the Magento 2.4.1 core code. + +### Installation, upgrade, deployment + + + +* Installation of Magento with third-party extensions that have dependencies on APIs for the Store module in CLI commands no longer fails. Previously, Magento displayed this error message: `The default website isn't defined. Set the website and try again`. This was a known issue in Magento 2.4.0. + + + +* `bin/magento setup:di:compile` no longer throws a fatal error. Previously, Magento threw an error the first time you ran this command, but the second execution resulted in successful compilation. + + + +* Upgrade no longer fails when a plugin is declared on `Magento\Framework\Encryption\Encryptor`. + + + +* Magento now displays an informative error message when some themes are not deployed after running `bin/magento setup:static-content:deploy`. Previously, when deployment completed successfully but not all packages were deployed, Magento did not display an error. When this command is executed with enabled parallel processing and each theme requires more time to be deployed then the specified maximum execution time, this command can finish successfully, although themes are not deployed. + + + +* The **Use default** checkbox for Klarna payments (**Stores** > **Configuration** > **Sales** > **Payment methods** > **Klarna**) now remain checked as expected when website scope changes. + + + +* Running `/bin/magento config:show vendor_module/general/value` now returns `0` or an empty string as expected. Previously, it returned `Configuration for path: "vendor_module/general/value" doesn't exist`. _Fix submitted by Vadim Malesh in pull request [28549](https://github.com/magento/magento2/pull/28549)._ [GitHub-23290](https://github.com/magento/magento2/issues/23290) + + + +* Upgrade no longer results in the sudden failure of the Galera cluster. Previously, the Galera cluster exited abruptly after re-indexing immediately after upgrade. During Magento upgrade, index tables are altered, and the engine is changed from `MEMORY` to `InnoDB`. At this point, the content of these tables became out-of-sync between the nodes of the Galera cluster. [GitHub-25334](https://github.com/magento/magento2/issues/25334) + + + +* Disabling the PageBuilder module no longer affects the rendering of the product page. Previously, custom layouts on the product page disappeared when the module was disabled, and Magento displayed a blank page. + + + +* You can now use `bin/magento sampledata:deploy` to deploy sample data as expected after installing Magento using Composer. Previously, Magento threw this error: `Git installations must deploy sample data from GitHub; see https://devdocs.magento.com/guides/v2.3/install-gde/install/sample-data-after-clone.html for more information`. _Fix submitted by Andrii Beziazychnyi in pull request [27481](https://github.com/magento/magento2/pull/27481)_. [GitHub-19481](https://github.com/magento/magento2/issues/19481) + + + +* Storefront performance has improved by eliminating the unnecessary loading of the `Datepicker` component. _Fix submitted by Mateusz Krzeszowiak in pull request [27860](https://github.com/magento/magento2/pull/27860)_. [GitHub-28823](https://github.com/magento/magento2/issues/28823) + + + +* Executing `bin/magento setup:upgrade` now completes as expected. Previously, Magento displayed printed array content for caches. _Fix submitted by Sathish Subramanian in pull request [27567](https://github.com/magento/magento2/pull/27567)_. [GitHub-27091](https://github.com/magento/magento2/issues/27091) + + + +* `bin/magento setup:static-content:deploy --language=all` now deploys all languages that are used on the storefront and all languages configured by Admin users when no language parameter is set. (`en_US` is always deployed by default.) _Fix submitted by Anton Evers in pull request [28922](https://github.com/magento/magento2/pull/28922)_. [GitHub-29218](https://github.com/magento/magento2/issues/29218) + + + +* Magento no longer displays the Backup menu when the Backup feature is disabled. _Fix submitted by Eden Duong in pull request [29222](https://github.com/magento/magento2/pull/29222)_. [GitHub-29280](https://github.com/magento/magento2/issues/29280) + + + +* Catalog image helper initialization now uses the product model instead of `DataObject`. _Fix submitted by jmonteros422 in pull request [29435](https://github.com/magento/magento2/pull/29435)_. [GitHub-1711](https://github.com/magento/adobe-stock-integration/issues/1711) + + + +* Admin users can now save an empty **Customer Token Lifetime (hours)** field (Admin **Stores** > **Configurations** > **Services** > **OAuth** > **Access Token Expiration**). [GitHub-29502](https://github.com/magento/magento2/issues/29502) + + + +* The **Create Permanent Redirect for old URL** setting is now disabled by default for categories. _Fix submitted by Vadim Malesh in pull request [28752](https://github.com/magento/magento2/pull/28752)_. [GitHub-24922](https://github.com/magento/magento2/issues/24922) + +### AdminGWS + + + +* Magento no longer displays the **Add Attribute** button (**Stores** > **Attributes** or **Add Attribute Set** button (**Stores** > **Attributes** > **Customer**) when the logged-in administrator lacks the appropriate permissions to create these entities. Previously, Magento threw a 404 error when a website administrator who did not have the appropriate permissions tried to create an **Attribute Set** or **Customer** attribute. + + + +* Magento no longer throws an error when an administrator with restricted roles for specific websites tries to create a subcategory from the Admin. + +### Adobe Stock Integration + + + +* Images in the Adobe Stock images grid are now properly aligned after filters have been cleared. _Fix submitted by Nazar Klovanych in pull request [28366](https://github.com/magento/magento2/pull/28366)_. [GitHub-824](https://github.com/magento/adobe-stock-integration/issues/824), [GitHub-972](https://github.com/magento/adobe-stock-integration/issues/972) + + + +* Added support for reading `exif_image.png` or `exif-image.jpeg` metadata. _Fix submitted by Nazar Klovanych in pull request [29576](https://github.com/magento/magento2/pull/29576)_. [GitHub-1449](https://github.com/magento/adobe-stock-integration/issues/1449) + + + +* The **Used in** section of the Adobe Stock gallery image details page now accurately identifies if the image is associated with a product. _Fix submitted by Nazar Klovanych in pull request [28798](https://github.com/magento/magento2/pull/28798)_. [GitHub-1474](https://github.com/magento/adobe-stock-integration/issues/1474) + + + +* `\Magento\MediaGallery\Model\ResourceModel\Keyword\SaveAssetsKeywords::execute` now deletes the links to the keywords that are not specified on the parameters and insert the new ones when deleting keyword tags while editing image details. _Fix submitted by jmonteros422 in pull request [29207](https://github.com/magento/magento2/pull/29207)_. [GitHub-1391](https://github.com/magento/adobe-stock-integration/issues/1391) + + + +* The `Login failed` message that Magento displays when a merchant clicks **License** for a previously saved, unlicensed Adobe Stock image no longer contains HTML tags. _Fix submitted by yolouiese in pull request [29398](https://github.com/magento/magento2/pull/29398)_. [GitHub-1684](https://github.com/magento/adobe-stock-integration/issues/1684) + + + +* Clicking on the links in the **Used in** section of the image Details page now displays a grid that displays all entities that are filtered by the image. The asset filter is also set and displayed correctly. Previously, Magento did not display the asset title in the **Applied filters** section. _Fix submitted by Nazar Klovanych in pull request [29367](https://github.com/magento/magento2/pull/29367)_. [GitHub-1694](https://github.com/magento/adobe-stock-integration/issues/1694) + + + +* Magento no longer displays the **Used in** section of the image Details page when the image is not in use. _Fix submitted by Nazar Klovanych in pull request [29367](https://github.com/magento/magento2/pull/29367)_. [GitHub-1699](https://github.com/magento/adobe-stock-integration/issues/1699) + + + +* Corrected display issues when adding a new image tag that exceeds the maximum number of characters. _Fix submitted by Nazar Klovanych in pull request [29367](https://github.com/magento/magento2/pull/29367)_. [GitHub-1702](https://github.com/magento/adobe-stock-integration/issues/1702) + + + +* Assets can now be checked as expected using the assets filter on the image Details **Used in** section. _Fix submitted by Nazar Klovanych in pull request [29367](https://github.com/magento/magento2/pull/29367)_. [GitHub-1704](https://github.com/magento/adobe-stock-integration/issues/1704) + + + +* Information about images that are used by different entities (for example, `page` and `category`) is now listed corrected in the image Details page. _Fix submitted by Nazar Klovanych in pull request [29367](https://github.com/magento/magento2/pull/29367)_. [GitHub-1747](https://github.com/magento/adobe-stock-integration/issues/1747) + + + +* You can now use the new `UrlFilterApplier` component to apply filters on product,`cms_page`, and `cms_block` grids using the GET URL parameter. _Fix submitted by Gabriel da Gama in pull request [28932](https://github.com/magento/magento2/pull/28932)_. [GitHub-1501](https://github.com/magento/adobe-stock-integration/issues/1501) + + + +* Clicking on links in the **Used in** section for an image in the Media Gallery now opens the grid of entities that are filtered by the image as expected. Previously, the image title was not displayed in the applied filters section of the grid. _Fix submitted by Nazar Klovanych in pull request [29429](https://github.com/magento/magento2/pull/29429)_. [GitHub-1694](https://github.com/magento/adobe-stock-integration/issues/1694) + + + +* Magento now adds tags correctly when you edit multiple images successively in the Media Gallery. _Fix submitted by Nazar Klovanych in pull request [29429](https://github.com/magento/magento2/pull/29429)_. [GitHub-1755](https://github.com/magento/adobe-stock-integration/issues/1755) + + + +* Magento now removes tags for Adobe Stock images after a merchant deletes the tags and saves the image details. Previously, tags were not deleted until the page was refreshed. _Fix submitted by Honeymay Louiese Ignacio in pull request [29400](https://github.com/magento/magento2/pull/29400)_. [GitHub-1703](https://github.com/magento/adobe-stock-integration/issues/1703) + +### Amazon Pay + +* Amazon Pay now checks whether a user is already logged in before rendering payment options. + +* Issues with multi-factor authentication and abandoned carts have been resolved. + +* Amazon Pay now correctly populates the `store name` in emails and other displayed locations. If the **Store Name** field in Amazon Pay configuration is empty, the extension retrieves the store's default name (that is, the name you give your store in the Magento Admin). + +* Localization/translation issues for Decline scenarios have been addressed. Displayed text is no longer always in English. + +### Analytics + + + +* Administrators with the correct permissions can now access Advanced Reporting and Segment Reports. + + + +* Magento successfully generates advance reporting data files and sends them as expected to Inventory on deployments with split databases. Previously, Magento did not generate or send the `quotes.csv` file to Inventory, and as a result, Inventory did not generate the expected reports. + +### Braintree + +* Braintree now sends the correct amount to PayPal when a promotion code is applied on the checkout page. + +* Apple Pay now works as expected when Magento Terms & Conditions are enabled on the checkout page. + +* Browser errors no longer occur during checkout on desktop devices when Venmo is enabled from the Admin. + +* Checkout no longer fails when the shopper enters special characters in the **Name** fields of the checkout workflow. Previously, authentication failed because the Braintree 3DS API did not support non-ASCII characters. + +* Magento now displays the correct recipient name in the shipping section of the checkout workflow when placing an order using PayPal. + +* Magento now updates the Order Review page as expected when a shopper changes the shipping method more than once during checkout. + +### Bundle products + + + +* Magento no longer throws an exception when you try to create a product in a deployment in which Inventory is installed but the `Magento_InventoryBundleProduct` module is disabled. + + + +* Magento now correctly calculates offline refunds for orders that contain bundle products. + + + +* The mini cart now displays the correct prices for bundle products when tier prices are also assigned for simple products. [GitHub-22807](https://github.com/magento/magento2/issues/22807) + + + +* Merchants can now create a credit memo for bundle products that provides a refund without requiring the return of the product. Previously, Magento threw an error. _Fix submitted by Dzung Nguyen in pull request [27455](https://github.com/magento/magento2/pull/27455)_. [GitHub-23440](https://github.com/magento/magento2/issues/23440) + + + +* Magento no longer displays redundant validation messages when a shopper adds a bundle product to their cart without selecting a required option. _Fix submitted by Dzung Nguyen in pull request [27455](https://github.com/magento/magento2/pull/27455)_. [GitHub-23440](https://github.com/magento/magento2/issues/23440) + + + +* GraphQL now supports placing an order for a bundle product with option type `radio` and `dropdown` with multiple choices. Previously, Magento displayed a message about invalid input for `BundleItem.type: radio/dropdown`. _Fix submitted by Michał Derlatka in pull request [29256](https://github.com/magento/magento2/pull/29256)_. [GitHub-26110](https://github.com/magento/magento2/issues/26110) + +### Cache + + + +* Local cache storage is now retained for the period of time set in **Stores** > **Configuration** > **General** > **Web** > **Default Cookie Settings**. Previously, the expiry date of cookies was hard-coded to one day, which put it out of sync with this setting. As a result, welcome messages did not retain returning customer information for the expected duration. + + + +* The number of calls to page cache `config` has been reduced. _Fix submitted by Lukasz Bajsarowicz in pull request [28992](https://github.com/magento/magento2/pull/28992)_. [GitHub-29159](https://github.com/magento/magento2/issues/29159) + + + +* Varnish no longer throws a `Connection reset by peer` error when a large catalog is reindexed on schedule. _Fix submitted by Matthew O'Loughlin in pull request [26256](https://github.com/magento/magento2/pull/8815)_. [GitHub-26255](https://github.com/magento/magento2/issues/8815) + + + +* Full page cache is no longer cleared for unrelated products when a product has been edited in the Admin. [GitHub-25670](https://github.com/magento/magento2/issues/25670) + +### Cart and checkout + + + +* Direct SQL queries have been replaced by Data Provider, which has improved checkout performance. _Fix submitted by Lukasz Bajsarowicz in pull request [29376](https://github.com/magento/magento2/pull/29376)_. [GitHub-29453](https://github.com/magento/magento2/issues/29453) + + + +* The Products in the Comparison and the Recently Compared Products lists now work as expected. Previously, when the comparison list was expanded, Magento did not display products, even though the section indicated that the list contained products. + + + +* The **Delete** button on the **Add to Shopping Cart by SKU** section of a customer’s **Manage Shopping Cart** page now works as expected when multiple rows are selected. + + + +* Magento no longer throws an error when you try to order a product by SKU when the digits you enter match a valid SKU but the case of these digits differ. Previously, when you entered an SKU on **My Account** > **Order by SKU** that did not exactly match a valid SKU, Magento threw an error. + + + +* A customer’s shipping address is now selected by default at checkout when the address is located in the country identified on the Allow Countries list and that list includes only that country. Previously, Magento did not select the address as default and displayed this error message: `Please specify a regionId in shipping address`. + + + +* Merchants can now enable **Apply to Shipping Amount** in the Action tab of **Marketing** > **Cart Price Rules** > **Add New Rule** when **Fixed amount discount for whole cart** is applied. [GitHub-24422](https://github.com/magento/magento2/issues/24422) + + + +* Magento no longer throws an exception when a shopper tries to unset the persistence cookie after beginning checkout and then navigating to the storefront home page. Previously, when the shopper clicked the **Not you?** link on the home page, Magento threw this exception: `The shipping address is missing. Set the address and try again`. [GitHub-24218](https://github.com/magento/magento2/issues/24218) + + + +* Magento now displays an add-to-cart success message when a customer adds an out-of-stock product to their cart. Previously, the product was added, but Magento did not display a success message. + + + +* Custom address attributes are now included as expected in the form that displays for the payment step in the checkout workflow. + + + +* The **State/Province/Region** input box is now enabled as expected on **My Account** > **Address Book** > **Add new address**. + + + +* Discounts are now applied as expected to shipping charges when **Apply to Shipping Amount** is enabled. _Fix submitted by Andrii Kalinich in pull request [28839](https://github.com/magento/magento2/pull/28839)_. [GitHub-26723](https://github.com/magento/magento2/issues/26723) + + + +* The code that supports closing the mini cart has been refactored to remove the `closeSidebar` function. The appropriate click binding has been added to the `[data-action="close"]` element. _Fix submitted by lumnn in pull request [28906](https://github.com/magento/magento2/pull/28906)_. [GitHub-29161](https://github.com/magento/magento2/issues/29161) + + + +* The new **Show "Clear Shopping Cart" button on the cart page** configuration setting provides control over displaying a **Clear Cart** button on the shopping cart view page. By default, this setting is disabled. _Fix submitted by Pavlo Sydorenko in pull request [27917](https://github.com/magento/magento2/pull/27917)_. [GitHub-28705](https://github.com/magento/magento2/issues/28705) + + + +* Validation has been added to the phone field in the checkout workflow. _Fix submitted by Oleh Usik in pull request [27537](https://github.com/magento/magento2/pull/27537)_. [GitHub-28800](https://github.com/magento/magento2/issues/28800) + + + +* Guest checkout is now disabled as expected when a cart contains downloadable products when the **Shareable** and **Disable Guest Checkout if Cart Contains Downloadable Items** settings are disabled. _Fix submitted by Rani Priya in pull request [23972](https://github.com/magento/magento2/pull/23972)_. [GitHub-23971](https://github.com/magento/magento2/issues/23971) + + + +* The success message that Magento displays when a shopper adds a product to their cart from the customer account sidebar now contains a link to the shopper’s shopping cart. _Fix submitted by Ajith in pull request [27977](https://github.com/magento/magento2/pull/27977)_. [GitHub-29097](https://github.com/magento/magento2/issues/29097) + + + +* Magento now selects an empty value by default for the prefix dropdown options menu on the checkout workflow. _Fix submitted by Vadim Malesh in pull request [28238](https://github.com/magento/magento2/pull/28238)_. [GitHub-18823](https://github.com/magento/magento2/issues/18823) + + + +* The pop-up message that Magento displays when you delete multiple items from a shopping cart now accurately describes the number and type of entities you have selected for deletion. _Fix submitted by Nazar Klovanych in pull request [29490](https://github.com/magento/magento2/pull/29490)_. [GitHub-1749](https://github.com/magento/adobe-stock-integration/issues/1749) + + + +* Magento now displays a customer registration form when a guest user completes checkout. + + + +* Custom customer address attributes fields are now displayed as expected in the storefront checkout workflow. + + + +* Magento now retrieves the current customer group for an active quote during checkout. Previously, Magento used the customer group that was active when the product was first added to the cart, and if that customer group was deleted before checkout, Magento threw an error. _Fix submitted by Konstantin in pull request [28902](https://github.com/magento/magento2/pull/28902)_. [GitHub-29327](https://github.com/magento/magento2/issues/29327) + +### Catalog + + + +* Magento now removes disabled products from a shopper’s cart before checkout. Previously, when a shopper added a product to their cart that was disabled before checkout completed, Magento removed the disabled product from the cart, but the product remained in the quote, and the shopper could not check out. [GitHub-26680](https://github.com/magento/magento2/issues/26680) + + + +* Magento now sorts bestselling products as expected. Previously, both product count and the pagination of sort results were incorrect. [GitHub-25955](https://github.com/magento/magento2/issues/25955) + + + +* Shoppers can now open a product’s detail page by clicking on the product name in the compare products sidebar. _Fix submitted by Eduard Chitoraga in pull request [27451](https://github.com/magento/magento2/pull/27451)_. [GitHub-21101](https://github.com/magento/magento2/issues/21101) + + + +* `children_count` values now remain positive when an administrator deletes categories. Previously, when an administrator deleted categories, the `children_count` for remaining categories was negative. _Fix submitted by Vitaliy Prokopov in pull request [28044](https://github.com/magento/magento2/pull/28044)_. [GitHub-27969](https://github.com/magento/magento2/issues/27969) + + + +* Magento now uses the default option (**Configuration** > **Web** > **Default Layouts** > **Default Product Layout**) that you have selected for the `page_layout` attribute when creating a new product. Previously, your selected default value was not applied. + + + +* You can now successfully perform mass actions on Inventory product stock. Previously, when you tried to perform a mass action on inventory product stock, Magento displayed a blank page. If you performed this action with Magento in developer mode, Magento threw this error: `Notice: Undefined offset: 32000 in /Users/kodithuw/sites/m23inventory/inventory/InventoryCatalogAdminUi/view/adminhtml/templates/catalog/product/edit/action/inventory.phtml on line 24` + + + +* The total record count displayed when you click **Add Products** on the Products tab when adding products to a catalog category no longer changes based on product sort order. + + + +* The `{products(filter: {sku: {eq: "some sku"}}) {…}` query now returns values that have been converted into the expected currency. Previously, `price_tiers.final_price.value` displayed special prices in the base currency. _Fix submitted by Petkovski Marjan in pull request [28890](https://github.com/magento/magento2/pull/28890)_. [GitHub-26121](https://github.com/magento/magento2/issues/26121) + +### Catalog Rule + + + +* Magento no longer throws a fatal error when you save a catalog rule with the following conditions: `If ALL of these conditions are FALSE:, If ALL of these conditions are TRUE:, Attribute set is default` + +### Cleanup + + + +* Corrected misalignment of the Admin Sales Order grid checkbox. _Fix submitted by Tu Nguyen in pull request [27642](https://github.com/magento/magento2/pull/27642)_. [GitHub-27633](https://github.com/magento/magento2/issues/27633) + + + +* Corrected a misspelling in the shipping address ID getter in the sales order address save handler. _Fix submitted by Konstantin in pull request [28810](https://github.com/magento/magento2/pull/28810)_. [GitHub-28982](https://github.com/magento/magento2/issues/28982) + + + +* Corrected the `getRegionNameExpresion` method name to `getRegionNameExpression`. _Fix submitted by Pierre Grimaud in pull request [28832](https://github.com/magento/magento2/pull/28832)_. [GitHub-28829](https://github.com/magento/magento2/issues/28829) + + + +* A redundant `init` method has been removed from `app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php` and `app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPriceType.php`. _Fix submitted by Oleh Usik in pull request [28650](https://github.com/magento/magento2/pull/28650)_. [GitHub-29009](https://github.com/magento/magento2/issues/29009) + + + +* `localStorage` polyfill has been moved from from `base` to `frontend`. _Fix submitted by Ihor Sviziev in pull request [28749](https://github.com/magento/magento2/pull/28749)_. [GitHub-28900](https://github.com/magento/magento2/issues/28900) + + + +* Updated the Magento Commerce logo and removed extraneous spaces from the README file. _Fix submitted by Rafael Corr̻a Gomes in pull request [28891](https://github.com/magento/magento2/pull/28891)_. [GitHub-29056](https://github.com/magento/magento2/issues/29056) + + + +* The unnecessary `overflowed` class has been removed from the mini cart sidebar widget. _Fix submitted by lumnn in pull request [28963](https://github.com/magento/magento2/pull/28963)_. [GitHub-29160](https://github.com/magento/magento2/issues/29160) + + + +* An incorrect CSS selector in the Shipment page has been corrected. _Fix submitted by Tu Nguyen in pull request [28639](https://github.com/magento/magento2/pull/28639)_. [GitHub-29261](https://github.com/magento/magento2/issues/29261) + + + +* The `lib/internal/Magento/Framework/App/Request/Http.php` file has been simplified by optimizing logic and removing redundant variable assignments and over-usage of returns within a function. _Fix submitted by Chris Snedaker in pull request [28608](https://github.com/magento/magento2/pull/28608)_. [GitHub-29381](https://github.com/magento/magento2/issues/29381) + + + +* The `bin/magento module:status` command now accepts multiple module names as arguments. _Fix submitted by Chandru Rajendran in pull request [28250](https://github.com/magento/magento2/pull/28250)_. [GitHub-29344](https://github.com/magento/magento2/issues/29344) + + + +* Fixed a typo in the class description of `\Magento\Downloadable\Block\Sales\Order\Email\Items\Downloadable`. _Fix submitted by Benjamin Rosenberger in pull request [29451](https://github.com/magento/magento2/pull/29451)_. [GitHub-29470](https://github.com/magento/magento2/issues/29470) + + + +* The `TierPriceManagement` class has been refactored to remove redundant code. _Fix submitted by Lukasz Bajsarowicz in pull request [29202](https://github.com/magento/magento2/pull/29202)_. [GitHub-29477](https://github.com/magento/magento2/issues/29477) + + + +* `autoload.php` has been refactored to improve readability and return speed. _Fix submitted by Vitaliy Ryaboy in pull request [28923](https://github.com/magento/magento2/pull/28923)_. [GitHub-29527](https://github.com/magento/magento2/issues/29527) + +### CMS content + + + +* The Hierarchy tab for a selected default store view now displays the selected parent page as expected. + + + +* Magento no longer throws an error during store view creation when the new store view contains a CMS page with the same URL key as a page in a different store view. _Fix submitted by Vadim Malesh in pull request [28421](https://github.com/magento/magento2/pull/28421)_. [GitHub-28357](https://github.com/magento/magento2/issues/28357) + + + +* Magento now throws an error when a merchant creates a CMS page with the same URL as the Company Structure page. Previously, Magento displayed the CMS page instead of the Company Structure page. + +### Configurable products + + + +* Pagination problems with the Configurable Product Edit Current Variations list have been corrected. + + + +* Magento no longer updates the Related Products price box whenever a shopper selects options for a configurable product. Previously, Magento updated the price box whenever a shopper selected an option for a configurable product. + + + +* Magento now displays the correct price for configurable products with customizable options on the Admin Create Order page. As expected, the displayed price is a sum of the child product's price and the custom option's price. Previously, Magento displayed only the custom option price. [GitHub-25766](https://github.com/magento/magento2/issues/25766) + + + +* The order summary now displays the correct discount amount when a cart price rule has been applied. Previously, the rule did not correctly round amounts when calculating shipping discounts. + + + +* Admin user accounts created from an admin account with a restricted scope can now create a configurable product with attributes as expected. Previously, Magento threw this error: `Notice: Undefined index: value_index in 23develop/app/code/Magento/ConfigurableProduct/Helper/Product/Options/Factory.php on line 101`. + + + +* Magento no longer throws a validation error when you use POST `/V1/products` to a configurable product with an `int` value of 0. Previously, Magento threw this error: `Product with id "%1" does not contain required attribute “%2”.”` _Fix submitted by Vadim Malesh in pull request [29001](https://github.com/magento/magento2/pull/29001)_. [GitHub-13210](https://github.com/magento/magento2/issues/13210) + + + +* The configuration options attribute of a parent product are no longer assigned to a new configurable product’s `size` attribute. _Fix submitted by Abel Truong in pull request [27339](https://github.com/magento/magento2/pull/27339)_. [GitHub-26449](https://github.com/magento/magento2/issues/26449) + +### Cookies + + + +* Magento now creates a maximum of one `mage-translation-file-version` and `mage-translation-storage` cookie per session. _Fix submitted by Ihor Sviziev in pull request [27364](https://github.com/magento/magento2/pull/27364)_. [GitHub-27355](https://github.com/magento/magento2/issues/27355) + +### cron + + + +* Message queue consumer configuration has been extended with new parameters that help control consumers and save server resources and that potentially decrease consumer queue CPU consumption. See [Configure message queues]({{page.baseurl}}/extension-dev-guide/message-queues/config-mq.html) for a description of the `maxIdleTime`, `sleep`, and `onlySpawnWhenMessageAvailable` parameters. + + + +* `cron` expressions such as  `3/10 * * * *` are now scheduled as expected. _Fix submitted by Anton Evers in pull request [28930](https://github.com/magento/magento2/pull/28930)_. [GitHub-29240](https://github.com/magento/magento2/issues/29240) + + + +*  `sales_clean_quotes` no longer loads all expired quotes at once. Previously, Magento failed with this fatal error because all expired quotes were loaded simultaneously: `PHP Fatal error: Allowed memory size of 2147483648 bytes exhausted (tried to allocate 20480 bytes) in /path/to/magento2/vendor/magento/framework/Model/AbstractModel.php on line 359`, + +### CSS + + + +* Magento no longer duplicates CSS when **Critical CSS** is enabled. _Fix submitted by Tu Nguyen in pull request [28480](https://github.com/magento/magento2/pull/28480)_. [GitHub-26498](https://github.com/magento/magento2/issues/26498) + + + +* The server-side LESS compiler now imports all remote CSS files as expected when you run `bin/magento setup:static-content:deploy -f`. Previously, Magento did not import the remote files and threw an error. [GitHub-25119](https://github.com/magento/magento2/issues/25119) + +### Custom customer attributes + + + +* Corrected alignment issues for the explanatory text about passwords and the **Job Title** field on the Customer Edit Account Information page. + + + +* CAPTCHA now works as expected when a new customer clicks the **Create an Account** button on the storefront customer registration page. Previously, Magento did not create the customer account and displayed an error when the customer clicked the button. + + + +* The checkout workflow no longer displays custom customer address attribute values when the customer has not entered any data. + +### Customer + + + +* The region names in Admin customer addresses are now translated as expected. + + + +* The **State/Province** fields are now populated as expected on the Edit Address page (**My Account** > **Address book**). + + + +* Magento no longer throws an error when a customer clicks the **Submit** button multiple times on forms throughout the storefront for which invisible reCAPTCHA has been enabled. Previously, clicking this button multiple times resulted in an internal error similar to this: `Internal error: Make sure you are using reCaptcha V3 api keys`. + + + +* Saving a deleted customer from the Admin now generates an error message only. Previously, Magento displayed a blank page and generated a report that contains this string: `"0":"No such entity with customerId = 3","1":"#1 Magento\\Customer\\Model CustomerRegistry->retrieve() called at [app\/code\/Magento\/Customer\/Model\/ResourceModel\/CustomerRepository.php:340"`. + + + +* Magento now displays an error message as expected when an administrator tries to save an address for a customer whose account has just been deleted. Previously, Magento displayed a blank message box. + + + +* The labels for address fields in the checkout workflow and the address book have been edited for consistency. + + + +* Frontend labels now fall back to store labels if their values are not null. Previously, customer attributes used the default frontend labels. _Fix submitted by Toan Nguyen in pull request [27064](https://github.com/magento/magento2/pull/27064)_. [GitHub-27063](https://github.com/magento/magento2/issues/27063) + + + +* The `sortOrder`number of links in layout XML has been corrected. Previously, this order was reversed and used descending order. _Fix submitted by Tu Nguyen in pull request [27340](https://github.com/magento/magento2/pull/27340)_. [GitHub-27162](https://github.com/magento/magento2/issues/27162) + +### Customer segment + + + +* Bulk operations have been refactored to save and refresh customer segments asynchronously, which has improved the performance of these tasks for deployments that include many customers (greater than 3,000,000). + + + +* Customer segment conditions now work as expected in a split-database deployment. Previously, Magento threw an error when you tried to edit a customer segment by adding a condition: `SQLSTATE[42S02]: Base table or view not found`. + +### Directory + + + +* The format of the State/Province drop-down menu is now consistent across the Admin. + +### dotdigital + +* Order sync no long fails when an order contains product SKUs that no longer exist in the catalog. + +* Empty product categories are no longer included in web insight data. + +* Web behavior tracking now works for merchants with certain theme configurations. A new fallback selector addresses this. + +* The subscriber status data field no loner includes empty values when customer sync was run using cron. (App emulation addresses this issue.) + +* Address book mapping now works as expected when a dotdigital account is enabled at the default level but disabled for the main website. + +* Coupons are now generated (using the external dynamic content URL for coupon generation) for email addresses that contain plus ('+') signs. + +* Contacts are no longer resubscribed when their `last_subscribed_at` value is null. + +* Upgrade errors (dating from 4.5.2) that affected earlier Magento versions have been resolved. + +* A regression issue that was introduced in 4.5.3 that affected using a method to obtain the subscriber status when preparing subscriber export has been fixed. + +* The total figure for synced subscribers (presented in the logs and on screen) is now correctly calculated. + +### Downloadable + + + +* The My Downloadable Products area now displays links to purchased downloadable products that are part of a grouped product as expected. + + + +* Clicking on a downloadable product's **Sample** button from the Admin product page now downloads a sample as expected. Previously, when you clicked **Sample**, Magento displayed this error: `The product that was requested doesn't exist. Verify the product and try again`. + + + +* Shoppers can now download samples of downloadable products that are out-of-stock. Previously, when a shopper tried to download a sample, Magento opened a new tab, but did not display an informative message or begin the download process. _Fix submitted by Vadim Malesh in pull request [28898](https://github.com/magento/magento2/pull/28898)_. [GitHub-23638](https://github.com/magento/magento2/issues/23638) + + + +* The exception message that Magento displays when a shopper tries to set a shipping address for a downloadable product has been improved. _Fix submitted by Michał Derlatka in pull request [28904](https://github.com/magento/magento2/pull/28904)_. [GitHub-26107](https://github.com/magento/magento2/issues/26107) + + + +* A product’s `stock_item` data is updated and downloadable product links and samples are preserved as expected when you use a REST PUT call to update `stock_item` values. Previously, after the product update, the product no longer contained links to download content. _Fix submitted by Vadim Malesh in pull request [28799](https://github.com/magento/magento2/pull/28799)_. [GitHub-21811](https://github.com/magento/magento2/issues/21811) + + + +* Magento now displays a more informative message when a customer sets the shipping address for an order that contains only downloadable products. + +### Dynamic block (formerly banner) + + + +* Table title now matches the data table (as expected) when you create a dynamic block and add a related catalog price rule. + +### Email + + + +* Magento now sends email notifications about order changes to the correct customer email if the customer email was changed after the order was created. + + + +* Order update emails that are sent to customers now include the correct order status. Previously, if an order status changed from `processing` to another state, the order email did not reflect the status change. + + + +* Magento no longer displays misleading messages about existing accounts during guest checkout. Previously, when a guest navigated to the checkout page, then navigated back to the shipping page, Magento displayed this error: `You already have an account with us. Sign in or continue as guest`. + + + +* Custom email templates now load the same elements as native default email templates. Previously, some elements were missing, including variable values. + + + +* You can now create an email template that sends email with `Content-Type: "text/plain”`. Previously, Magento ignored the content type specified in the template. _Fix submitted by twoonesixdigital in pull request [26474](https://github.com/magento/magento2/pull/26474)_. [GitHub-26471](https://github.com/magento/magento2/issues/26471) + + + +* Unnecessary CSS has been removed from the email Preview template. _Fix submitted by Tu Nguyen in pull request [27828](https://github.com/magento/magento2/pull/27828)_. [GitHub-27543](https://github.com/magento/magento2/issues/27543) + + + +* Text in the email template that duplicates text already displayed by the footer has been removed. _Fix submitted by Paweł Tylek in pull request [27356](https://github.com/magento/magento2/pull/27356)_. [GitHub-28433](https://github.com/magento/magento2/issues/28433) + + + +* Product alert emails are now sent from the store from which the alert is subscribed. Previously, this email was always sent from the default store. _Fix submitted by Maciej Pawłowski in pull request [26534](https://github.com/magento/magento2/pull/26534)_. [GitHub-28968](https://github.com/magento/magento2/issues/28968) + + + +* A duplicate `customer.name` variable has been removed from the email template. _Fix submitted by Paweł Tylek in pull request [29054](https://github.com/magento/magento2/pull/29054)_. [GitHub-29087](https://github.com/magento/magento2/issues/29087) + + + +* Notification emails that are sent to sales representatives assigned to a company now include the assigned corporate logo. Previously, the notification email included the default LUMA logo, not the uploaded corporate logo email. + +### Frameworks + + + +* The **Time of day to send data** field of the Admin **Stores** > **Configuration** > GENERAL > **Advanced Reporting** page is now rendered correctly. + + + +* Shoppers can now change the number of orders that are displayed per page when the Orders list spans multiple pages. Previously, Magento displayed this message when you navigated to the last page of orders and tried to change the number of orders displayed per page: `You have placed no orders`. This was a known issue for Magento 2.4.0. + + + +* You can now add products to a category when implementing Level 2 cache. + + + +* `X-Magento-Tags` headers no longer exceed the size permitted by the HTTP specification. Previously, category pages that contain many products returned an `X-Magento-Tag` header that resulted in a 503 error. + + + +* `sales_order_shipment_track_save_commit_after` is now triggered as expected when you used the REST API to create a shipment. + + + +* Magento now displays an informative error message when a `di compile` fails due to a nonexistent dependency. Previously, the message displayed did not identify the class in which the exception occurred. + + + +* Magento no longer throws the following fatal error when Redis uses all allowed memory: `report.CRITICAL: OOM command not allowed when used memory > 'maxmemory'`. + + + +* Shoppers can now add multiple products to their cart when the `Persistent` module is disabled. [GitHub-14486](https://github.com/magento/magento2/issues/14486) + +### General fixes + + + +* Sorting products on the Admin (**Stores** > **Attributes** > **Products**) now displays all products that meet your search criteria. Previously, Magento did not display records, and to sort the records, you had to navigate to the first page of search results. + + + +* Unnecessary quotation marks and escaping around a URL in `tracking.phtml` have been removed. + + + +* The `var/log/system.log` now displays a more accurate message when a user tries to access a non-existing resource file under the static directory and SCD OnDemand and production mode are enabled. Magento now logs a 404 error. Previously, Magento logged the same message that is logged when the error occurs in developer mode. + + + +* JavaScript minification now works correctly. The minification file resolver no longer leaks variables to global scope. Previously, `ctx`, `origNameToUrl`, and `baseUrl` variables under window were leaked. _Fix submitted by Mateusz Krzeszowiak in pull request [27622](https://github.com/magento/magento2/pull/27622)_. [GitHub-28110](https://github.com/magento/magento2/issues/28110) + + + +* When you debug an error that prevents object creation, Magento now prints as well as logs the original exception message. Previously, the message was only logged. _Fix submitted by Marvin Hinz in pull request [26572](https://github.com/magento/magento2/pull/26572)_. [GitHub-26550](https://github.com/magento/magento2/issues/26550) + + + +* Callback execution after database changes are committed has been improved. Previously, if one callback failed with an exception, all callbacks failed. _Fix submitted by Alok Patel in pull request [27134](https://github.com/magento/magento2/pull/27134)_. [GitHub-28167](https://github.com/magento/magento2/issues/28167) + + + +* Mixins for modules with no dependencies defined no longer throw this error: `TypeError: Cannot read property 'map' of null`. _Fix submitted by Mateusz Krzeszowiak in pull request [27690](https://github.com/magento/magento2/pull/27690)_. [GitHub-28340](https://github.com/magento/magento2/issues/28340) + + + +* Storage polyfill is now loaded and applied only when `localStorage` or `sessionStorage` are not available. _Fix submitted by Mateusz Krzeszowiak in pull request [27619](https://github.com/magento/magento2/pull/27619)_. [GitHub-28381](https://github.com/magento/magento2/issues/28381) + + + +* Multi-page storefront orders lists now behave as expected when a shopper changes the number of results displayed per page from the second or subsequent results page. Previously, Magento displayed this error when a shopper changed the number of search results displayed in the **My Account** > **My Orders** list: `You have placed no orders`. _Fix submitted by Vadim Malesh in pull request [28417](https://github.com/magento/magento2/pull/28417)_. [GitHub-28488](https://github.com/magento/magento2/issues/28488) + + + +* The deprecated `addWarning` method has been replaced with the `addWarningMessage` method in the Magento core security module. _Fix submitted by kishorekumarkesavan in pull request [28264](https://github.com/magento/magento2/pull/28264)_. [GitHub-28308](https://github.com/magento/magento2/issues/28308) + + + +* Code generated using the Magento command-line commands is now consistent with Magento requirements and coding standards. _Fix submitted by Lukasz Bajsarowicz in pull request [28351](https://github.com/magento/magento2/pull/28351)_. [GitHub-28376](https://github.com/magento/magento2/issues/28376) + + + +* Magento no longer displays a CMS page more than once in the site hierarchy if the page is assigned to multiple store views. + + + +* Saving an attribute with `backend_type = static` no longer removes the content of the `frontend_class` field. _Fix submitted by jiten-patel in pull request [27369](https://github.com/magento/magento2/pull/27369)_. [GitHub-27051](https://github.com/magento/magento2/issues/27051) + + + +* Unnecessary code and `responsive.js` have been removed from files that are loaded by themes. _Fix submitted by Mateusz Krzeszowiak in pull request [27617](https://github.com/magento/magento2/pull/27617)_. [GitHub-28811](https://github.com/magento/magento2/issues/28811) + + + +* Validation has been added to the **Number of Symbols** field on the Admin CAPTCHA configuration page. _Fix submitted by Eden Duong in pull request [29199](https://github.com/magento/magento2/pull/29199)_. [GitHub-29198](https://github.com/magento/magento2/issues/29198) + + + +* The RSS feed now loads correctly. Previously, the feed did not load the first time, although it loaded as expected when the page was refreshed. _Fix submitted by Vadim Malesh in pull request [29455](https://github.com/magento/magento2/pull/29455)_. [GitHub-25211](https://github.com/magento/magento2/issues/25211) + + + +* An expired persistent session is now renewed as expected when the shopper logs back in. + + + +* Password lifetime as set in **Stores** > **Configuration** > **Advanced** > **Admin** is now honored. Previously, if you clicked **Forgot password?** when prompted to reset your password, you could bypass the password reset. + + + +* Coupon codes are now applied only to the specified product. Previously, Magento applied the coupon code to all products in the cart. [GitHub-28246](https://github.com/magento/magento2/issues/28246) + + + +* Cart expiry settings are no longer re-set when an inventory or price update occurs. Previously, when a cart was set to expire in 24 hours, and an inventory update or price update occurred, the indexers populated the `updated_at table`, which re-set the expiry time. + + + +* Magento no longer throws a fatal error when an administrator assigns a customer who has an active shopping cart to a customer group. + + + +* Selecting a toolbar option from **Developer tools** > **Network** on a product page when running the Chrome browser no longer initializes `toolbar.js` twice. _Fix submitted by Paweł Tylek in pull request [28838](https://github.com/magento/magento2/pull/28838)_. [GitHub-25934](https://github.com/magento/magento2/issues/25934) + + + +* Magento now adds an admin user’s ACL role ID to the product category tree cache ID. This will limit the category trees that an admin with limited scope can see as expected. _Fix submitted by quangdo-aligent in pull request [27429](https://github.com/magento/magento2/pull/27429)_. [GitHub-28306](https://github.com/magento/magento2/issues/28306) + +### Gift cards + + + +* Gift card accounts now capture order numbers as expected. Previously, the **More information** field in the History tab for the selected gift account did not display order IDs. + + + +* Using a comma as a decimal separator now works as expected. Previously, the comma separator ignored decimal values. + + + +* Gift cards are now displayed as expected in the mini cart. Previously, Magento rendered HTML objects as text. + + + +* Credit memos now correctly reflect the grand total for orders that involved discounted products and that were paid for by a combination of gift card and store credit. + +### Google Tag Manager + + + +* Magento no longer throws a JavaScript error during checkout when the **Cookie Restriction Mode** setting and Google Tag Manager are enabled. + +### GraphQL + + + +* Shoppers can select gift message and wrapping options during checkout. GraphQL now covers gift message options for different types of cart items. See [`setGiftOptionsOnCart` mutation]({{page.baseurl}}/graphql/mutations/set-gift-options.html) and [`updateCartItems` mutation]({{page.baseurl}}/graphql/mutations/update-cart-items.html). _Fix submitted by Oleh Usik in pull requests [28519](https://github.com/magento/magento2/pull/28105), [27956](https://github.com/magento/magento2/pull/27956), [28072](https://github.com/magento/magento2/pull/28072), [28072](https://github.com/magento/magento2/pull/28072), and 246 in private repo partners-magento2ee_. [GitHub-253](https://github.com/magento/magento2/issues/28519) + + + +* Customers and guests can write product reviews. Customers can also retrieve their product review histories. See [Create a product review]({{page.baseurl}}/graphql/mutations/create-product-review.html) and [productReviewRatingsMetadata query]({{page.baseurl}}/graphql/queries/product-review-ratings-metadata.html) for information on retrieving information about the reviews infrastructure. _Fix submitted by Eduard Chitoraga in pull request [27882](https://github.com/magento/magento2/pull/27882)_. [GitHub-28523](https://github.com/magento/magento2/issues/28523) + + + +* Customers can apply or remove reward points to their carts. They can also view their reward point history. See [`applyRewardPointsToCart`]({{page.baseurl}}/graphql/mutations/apply-reward-points.html) and [`removeRewardPointsFromCart`]({{page.baseurl}}/graphql/mutations/remove-reward-points.html) for a discussion of managing reward points within a cart. _Fix submitted by Petkovski Marjan in pull request 285 in private repo partners-magento2ee and Dmitriy Gallyamov in pull requests 284 and 281 in private repo partners-magento2ee_. [GitHub-28835](https://github.com/magento/magento2/issues/28835), [GitHub-28833](https://github.com/magento/magento2/issues/28833) + + + +* The [`addProductsToCart` mutation]({{page.baseurl}}/graphql/mutations/add-products-to-cart.html) allows you to add any type of product to the active cart. We recommend using this mutation instead of single-purpose mutations such as `addSimpleProductsToCart`. _Fix submitted by Yaroslav Rogoza in pull request [27914](https://github.com/magento/magento2/pull/27914)_. [GitHub-28524](https://github.com/magento/magento2/issues/28524) + + + +* GraphQL queries for related products now return values for related products that were created from target rules. Previously, queries for related products (up-sell and cross-sell) only returned values if the related products were added from the product settings. _Fix submitted by Ulzii in pull request 288 in private repo partners-magento2ee_. [GitHub-28566](https://github.com/magento/magento2/issues/28566) + + + +* The new `availableStores` query returns a list of configuration attributes for multiple stores available under the same website (based on the current store). It does not expose the list of websites. See [`availableStores` query]({{page.baseurl}}/graphql/queries/available-stores.html). _Fix submitted by Dmitriy Gallyamov in pull request [28794](https://github.com/magento/magento2/pull/28794)_. [GitHub-28569](https://github.com/magento/magento2/issues/28569) + + + +* GraphQL now uses only an authorization token to retrieve a type of user and its ID. Previously, GraphQL used an active customer's cookies to retrieve this information when the authorization token was empty. _Fix submitted by Alexander Taranovsky in pull request [27373](https://github.com/magento/magento2/pull/27373)_. [GitHub-28040](https://github.com/magento/magento2/issues/28040) + + + +* We have added the [`createCustomerV2`]({{page.baseurl}}/graphql/mutations/create-customer-v2.html) and [`updateCustomerV2`]({{page.baseurl}}/graphql/mutations/update-customer-v2.html) mutations to manage customer accounts. These new mutations require different input objects than the `createCustomer` and `updateCustomer` mutations. To change a customer's email address, use the new [`updateCustomerEmail`]({{page.baseurl}}/graphql/mutations/update-customer-email.html) mutation. _Fix submitted by Michał Derlatka in pull request [28888](https://github.com/magento/magento2/pull/28888)_. [GitHub-28570](https://github.com/magento/magento2/issues/28570) + + + +* `updateCustomer` no longer allows you to set an invalid `INT` value in the `gender` argument. _Fix submitted by Alexander Taranovsky in pull request [28487](https://github.com/magento/magento2/pull/28487)_. [GitHub-28481](https://github.com/magento/magento2/issues/28481) + + + +* You can use the `subscribeEmailToNewsletter` mutation to subscribe customers to a newsletter. See [`subscribeEmailToNewsletter` mutation]({{page.baseurl}}/graphql/mutations/subscribe-email-to-newsletter.html). _Fix submitted by Alexander Taranovsky in pull request [27586](https://github.com/magento/magento2/pull/27586)_. [GitHub-27337](https://github.com/magento/magento2/issues/27337) + + + +* Removed redundant logic in the `setShippingMethodsOnCart` mutation resolver. _Fix submitted by Alexander Taranovsky in pull request [27349](https://github.com/magento/magento2/pull/27349)_. [GitHub-28262](https://github.com/magento/magento2/issues/28262) + + + +* Added test coverage for the `Please provide Email of sender` error associated with the `sendEmailToFriend` mutation. _Fix submitted by Alexander Taranovsky in pull request [28034](https://github.com/magento/magento2/pull/28034)_. [GitHub-28138](https://github.com/magento/magento2/issues/28138) + + + +* The `products` query now returns product attribute option labels for the default store view as expected. Previously, this query returned the product attribute option labels that were set for the Admin. _Fix submitted by Dmitriy Gallyamov in pull request [28647](https://github.com/magento/magento2/pull/28647)_. [GitHub-28568](https://github.com/magento/magento2/issues/28568) + + + +* Custom attribute aggregations now return store-specific option values. _Fix submitted by Dmitriy Gallyamov in pull request [28647](https://github.com/magento/magento2/pull/28647)_. [GitHub-28572](https://github.com/magento/magento2/issues/28572) + + + +* Price intervals that are returned in a product aggregation can now be numeric only (no wildcards permitted). _Fix submitted by Dmitriy Gallyamov in pull request [28745](https://github.com/magento/magento2/pull/28745)_. [GitHub-28628](https://github.com/magento/magento2/issues/28628) + + + +* The `categoryList` query now returns the correct response when using fragments. _Fix submitted by Ulzii in pull request [28710](https://github.com/magento/magento2/pull/28710)_. [GitHub-28584](https://github.com/magento/magento2/issues/28584) + + + +* GraphQL product search now considers configured category permissions. Previously, product search ignored the **Enable** setting (**Stores** > **Configuration** > **Catalog** > **Catalog** > **Category Permissions**). _Fix submitted by Petkovski Marjan in pull request [28757](https://github.com/magento/magento2/pull/28757) and pull request 271 in private repo `partners-magento2ee`_. [GitHub-28563](https://github.com/magento/magento2/issues/28563 + + + +* You can now add a product to a cart using `addSimpleProductToCart` when other items in the cart are out-of-stock. Previously, Magento returned this error: `Some of the products are out of stock`. [GitHub-26683](https://github.com/magento/magento2/issues/26683) + +* The default GraphQL `Category` method now sorts by category position as expected. _Fix submitted by Derrik Nyomo in pull request [29301](https://github.com/magento/magento2/pull/29301)_. [GitHub-104](https://github.com/magento/catalog-storefront/issues/104) + +* Added support for wish lists in Magento Open Source. You can [add items]({{page.baseurl}}/graphql/mutations/add-products-to-wishlist.html) to, [update items]({{page.baseurl}}/graphql/mutations/update-products-in-wishlist.html) in, and [remove items]({{page.baseurl}}/graphql/mutations/remove-products-from-wishlist.html) from a wish list. _Fix submitted by Eduard Chitoraga in pull requests [28205](https://github.com/magento/magento2/pull/28205) and 264 in private repo partners-magento2ee_. [GitHub-28551](https://github.com/magento/magento2/issues/28551) + +* The [`addProductsToCart` mutation]({{page.baseurl}}/graphql/mutations/add-products-to-cart.html) allows you to add any type of product to the active cart. We recommend using this mutation instead of single-purpose mutations such as `addSimpleProductsToCart`. _Fix submitted by Yaroslav Rogoza in pull request [27914](https://github.com/magento/magento2/pull/27914)_. [GitHub-28524](https://github.com/magento/magento2/issues/28524) + +* Added GraphQL Vault support for the [Payflow Pro Vault]({{page.baseurl}}/graphql/payment-methods/payflow-pro-vault.html) payment method. _Fix submitted by Oleh Usik in pull request [28821](https://github.com/magento/magento2/pull/28821)_. [GitHub-28520](https://github.com/magento/magento2/issues/28520) + +* Updated the GraphQL [`storeConfig` query]({{page.baseurl}}/graphql/queries/store-config.html) to include new customer configuration settings. _Fix submitted by Oleh Usik in pull request [27876](https://github.com/magento/magento2/pull/27876)_. [GitHub-28521](https://github.com/magento/magento2/issues/28521) + +* Added the [`resetPassword` mutation]({{page.baseurl}}/graphql/mutations/reset-password.html). _Fix submitted by Oleh Usik in pull request [27876](https://github.com/magento/magento2/pull/27876)_. [GitHub-28521](https://github.com/magento/magento2/issues/28521) + +* Added the [`requestPasswordResetEmail` mutation]({{page.baseurl}}/graphql/mutations/request-password-reset-email.html), which triggers the password reset email for the provided email address. _Fix submitted by Oleh Usik in pull request [27876](https://github.com/magento/magento2/pull/27876)_. [GitHub-28521](https://github.com/magento/magento2/issues/28521) + +* Added discussion about Klarna GraphQL in [Klarna's payment method]({{page.baseurl}}/graphql/payment-methods/klarna.html) and[`createKlarnaPaymentsSession`]({{page.baseurl}}/graphql/mutations/create-klarna-payments-session.html) + +### Images + + + +* HTML markup for thumbnail images has been improved. _Fix submitted by Tu Nguyen in pull request [28642](https://github.com/magento/magento2/pull/28642)_. [GitHub-29468](https://github.com/magento/magento2/issues/29468) + +### Import/export + + + +* The `error_report.csv` file now downloads with content and is available inside the `var/import_history/` directory as expected. Previously, this file was not generated after import. + + + +* Importing a product by using a CSV file now generates an `error_report.csv` file as expected. Previously, Magento generated the file but removed it after the import completed. _Fix submitted by Vadim Malesh in pull request [28460](https://github.com/magento/magento2/pull/28460)_. [GitHub-28420](https://github.com/magento/magento2/issues/28420) + + + +* Removed redundant class imports throughout code base. _Fix submitted by Oleh Usik in pull request [28696](https://github.com/magento/magento2/pull/28696)_. [GitHub-29012](https://github.com/magento/magento2/issues/29012) + + + +* Magento now successfully imports customer addresses that contain a region for a country that does not have defined regions. Previously, Magento threw this error: `Please enter a valid region`. + + + +* Magento now loads the correct entity attribute set when a merchant selects an entity type when scheduling a new export. + + + +* The position of products in the `catalog_category_product` table now updates as expected when an administrator creates a product in the Admin and assigns it to a category. Previously, the position of new products was always assigned a 0 value. + + + +* Customer data is now successfully exported from the Admin, and the export data grid displays customer data as expected. Previously, an error related to memory allocation occurred during export. + + + +* Imported CSV files now capture related product information as expected. Previously, related product information was not consistently uploaded the first time the CSV file was imported. + + + +* Removed unused construct parameters in `AdvancedPricing.php`. [GitHub-29531](https://github.com/magento/magento2/issues/29531) + +### Index + + + +* `Magento_CacheInvalidate` now handles large tag patterns correctly when doing a `PURGE`. `sendPurgeRequest` has been refactored to handle an array of tags instead of requiring the caller to use `implode()`. _Fix submitted by Matthew O'Loughlin in pull request [26256](https://github.com/magento/magento2/pull/26256)_. [GitHub-26255](https://github.com/magento/magento2/issues/26255) + + + +* Shared indexers now show a status of **valid** after you run `bin/magento indexer:status` after re-indexing. Previously, shared indexers had an **invalid** status after a full re-index. + +### Infrastructure + + + +* Problems loading catalog and product pages on deployments running PHP 7.4.9 no longer occur. Previously, Magento threw this error when you tried to load the catalog and product pages: `There has been an error processing your request. Exception printing is disabled by default for security reasons`. [GitHub-29502](https://github.com/magento/magento2/issues/29502) + + + +* All exceptions that occur when layouts are rendered in production mode are now logged in the exception log file (`var/report`). Previously, Magento logged these messages in the system log as critical issues. + + + +* Regular expressions now work properly for large pages as the result of an increase in `ipcre.backtrack_limi`t and `pcre.recursion_limit` to approximately 1000000. _Fix submitted by Mateusz Krzeszowiak in pull request [27270](https://github.com/magento/magento2/pull/27270)_. [GitHub-26026](https://github.com/magento/magento2/issues/26026) + + + +* Interceptor generation has been improved. `} else {` statements have been removed from interceptors, and `array_map` has replaced `foreach`. _Fix submitted by Lukasz Bajsarowicz in pull request [27902](https://github.com/magento/magento2/pull/27902)_. [GitHub-28383](https://github.com/magento/magento2/issues/28383) + + + +* Array creation is now consistent throughout the class (`app/code/Magento/Sales/Model/Order/Pdf/Items/Invoice/DefaultInvoice.php`). _Fix submitted by Nathan de Graaf in pull request [28515](https://github.com/magento/magento2/pull/28515)_. [GitHub-28795](https://github.com/magento/magento2/issues/28795) + + + +* Plugins have been migrated out of the Magento Framework to follow the Magento best practice of prohibiting plugins in the Framework namespace. _Fix submitted by Lukasz Bajsarowicz in pull request [27965](https://github.com/magento/magento2/pull/27965)_. [GitHub-27962](https://github.com/magento/magento2/issues/27962) + + + +* Magento no longer throws an `Undefined class constant` error when an interceptor is generated. _Fix submitted by Vova Yatsyuk in pull request [28797](https://github.com/magento/magento2/pull/28797)_. [GitHub-28981](https://github.com/magento/magento2/issues/28981) + + + +* Form data now persists when Magento throws an integration exception when you save a integration using a name that is already in use. _Fix submitted by Aditya Yadav in pull request [26660](https://github.com/magento/magento2/pull/26660)_. [GitHub-28143](https://github.com/magento/magento2/issues/28143) + + + +* Magento no longer truncates `X-Forwarded-For` headers to 32 characters. _Fix submitted by Ihor Sviziev in pull request [27221](https://github.com/magento/magento2/pull/27221)_. [GitHub-28693](https://github.com/magento/magento2/issues/28693) + + + +* The logic that checks if a redirect is internal now works correctly in the Admin when using a custom Admin domain. Previously, problems with this logic resulted in many Admin redirects to the homepage of the default store. _Fix submitted by Vadim Malesh in pull request [29066](https://github.com/magento/magento2/pull/29066)_. [GitHub-28943](https://github.com/magento/magento2/issues/28943) + + + +* Problems with the `styles-old.less` file have been eliminated, and linting no longer identifies errors. _Fix submitted by Tu Nguyen in pull request [28895](https://github.com/magento/magento2/pull/28895)_. [GitHub-24004](https://github.com/magento/magento2/issues/24004) + + + +* `NonComposerComponentRegistration.php` has been refactored. _Fix submitted by Vitaliy Ryaboy in pull request [28975](https://github.com/magento/magento2/pull/28975)_. [GitHub-29308](https://github.com/magento/magento2/issues/29308) + + + +* `ResourceConnection.php` has been refactored to improve class readability. _Fix submitted by Lukasz Bajsarowicz in pull request [29341](https://github.com/magento/magento2/pull/29341)_. [GitHub-29389](https://github.com/magento/magento2/issues/29389) + + + +* The README file for the build-in web server has been updated to include all Elasticsearch parameters. _Fix submitted by Yevhenii Dumskyi in pull request [29300](https://github.com/magento/magento2/pull/29300)_. [GitHub-29299](https://github.com/magento/magento2/issues/29299) + + + +* The `Magento\CmsUrlRewrite\Plugin\Cms\Model\Store\View::aftersSave` plugin now returns a value as expected. Previously, this plugin did not return a value, and as a result, saving a store view resulted in an error. _Fix submitted by Pieter Hoste in pull request [29035](https://github.com/magento/magento2/pull/29035)_. [GitHub-29034](https://github.com/magento/magento2/issues/29034) + + + +* Added the following support for magic methods for `DataObject`: + + * new extension to support `get/set/has/uns` magic methods (with usage of `__call`) + * support for SessionManager, which forwards all calls to the DataObject container + * test coverage for extensions + * updated tests for Filtered Error check + * increased PHPStan check level from 0 to 1. _Fix submitted by Oleksandr Kravchuk in pull request [27905](https://github.com/magento/magento2/pull/27905)_. [GitHub-28303](https://github.com/magento/magento2/issues/28303) + + + +* `ScopeConfigInterface` can now be more than a string. The restriction of `magentoConfigFixture` to string only was the inadvertent result of a previous pull request and has been reverted. _Fix submitted by Kristof, Fooman in pull request [29305](https://github.com/magento/magento2/pull/29305)_. [GitHub-29345](https://github.com/magento/magento2/issues/29345) + + + +* The `convertConfigTimeToUtc` method no longer throws a fatal error due to sending incorrect parameters to the `Phrase` constructor. _Fix submitted by Kos Rafał in pull request [29483](https://github.com/magento/magento2/pull/29483)_. [GitHub-29525](https://github.com/magento/magento2/issues/29525) + + + +* Price filters now work as expected on grid data when `Magento\Backend\Block\Widget\Grid\Column\Filter\Price::getCondition` and `Magento\Backend\Block\Widget\Grid\Column\Filter\Price::getValue()` return an array with indexes that contain `from` or `to` string data. Previously, Magento threw this error: `Notice: A non well formed numeric value encountered in vendor/magento/module-backend/Block/Widget/Grid/Column/Filter/Price.php on line 197`. _Fix submitted by Nikita Sarychev in pull request [29214](https://github.com/magento/magento2/pull/29214)_. [GitHub-29213](https://github.com/magento/magento2/issues/29213) + + + +* Added an extension point to support adding HTML to the category page. This corrects a bug that was introduced by a previous pull request. _Fix submitted by iGerchak in pull request [29291](https://github.com/magento/magento2/pull/29291)_. [GitHub-29286](https://github.com/magento/magento2/issues/29286) + +### Inventory + + + +* Unnecessary code comments have been removed from `app/code/Magento/CatalogInventory/Model/StockState.php`. _Fix submitted by Vitaliy Prokopov in pull request [27758](https://github.com/magento/magento2/pull/27758)_. [GitHub-26702](https://github.com/magento/magento2/issues/26702) + +### Layered navigation + + + +* The layered navigation sidebar now shows Boolean attributes with both options (**yes**/**no**) and matching product counts. Previously, layered navigation did not return a **no** option for Boolean attributes in deployments using Elasticsearch. + + + +* The swatch layered navigation filter is now consistent with standard filters used throughout Magento. _Fix submitted by Bartłomiej Szubert in pull request [28015](https://github.com/magento/magento2/pull/28015)_. [GitHub-28011](https://github.com/magento/magento2/issues/28011) + +### Logging + + + +* All broken reference errors are now logged when deployments are in developer mode only. Previously, one error was logged for deployments in production mode, too, which bloated error logs. _Fix submitted by Bartłomiej Szubert in pull request [28735](https://github.com/magento/magento2/pull/28735)_. [GitHub-26504](https://github.com/magento/magento2/issues/26504) + +### Media Gallery + + + +* The Media Gallery configuration UI (Admin **Stores** > **Configuration** > **Advanced** > **System**) has been reorganized. _Fix submitted by Shankar Konar in pull request [29433](https://github.com/magento/magento2/pull/29433)_. [GitHub-28011](https://github.com/magento/adobe-stock-integration/issues/1738) + + + +* Added tests to cover the **Used In** links for an image in the Media gallery. _Fix submitted by Nazar Klovanych in pull request [29392](https://github.com/magento/magento2/pull/29392)_. [GitHub-1963](https://github.com/magento/adobe-stock-integration/issues/1693) + + + +* Magento no longer throws an exception when a merchant tries to save a product with its associated image when the Media Gallery is disabled. _Fix submitted by Nazar Klovanych in pull request [29492](https://github.com/magento/magento2/pull/29492)_. [GitHub-1750](https://github.com/magento/adobe-stock-integration/issues/1750) + +### MFTF + + + +* The `AdminSubmitAdvancedInventoryFormActionGroup`, `AdminClickOnAdvancedInventoryLinkActionGroup`, and  `AdminSetStockStatusConfigActionGroup` action groups are now used within tests according to best practice. _Fix submitted by Oleh USIA in pull request [29386](https://github.com/magento/magento2/pull/29386)_. [GitHub-29420](https://github.com/magento/magento2/issues/29420) + + + +* `SearchProductGridByKeywordActionGroup` is now used for search in the product grid. _Fix submitted by Oleh Usik in pull request [29385](https://github.com/magento/magento2/pull/29385)_. [GitHub-29434](https://github.com/magento/magento2/issues/29434) + + + +* `AdminCategoriesClickDoneButtonOnPopupActionGroup` is now used to click **Done** on the Search Categories popup. _Fix submitted by Oleh Usik in pull request [28989](https://github.com/magento/magento2/pull/28989)_. [GitHub-29380](https://github.com/magento/magento2/issues/29380) + + + +* `LoginToStorefrontActionGroup` is now used to replace a sequence of actions that is used for store front customer login. _Fix submitted by Sathish Subramanian in pull request [28113](https://github.com/magento/magento2/pull/28113)_. [GitHub-28165](https://github.com/magento/magento2/issues/28165) + + + +* `AdminUpdateCustomURLRewritesPermanentTest` has been refactored to meet MFTF best practices. _Fix submitted by Kate Kyzyma in pull request [28361](https://github.com/magento/magento2/pull/28361)_. [GitHub-28393](https://github.com/magento/magento2/issues/28393) + + + +* Test names have been changed to meet MFTF conventions. _Fix submitted by Evgeny Levinsky in pull request [27839](https://github.com/magento/magento2/pull/27839)_. [GitHub-28305](https://github.com/magento/magento2/issues/28305) + +#### New action groups + + + +* `StorefrontCheckoutClickNextButtonActionGroup` _Fix submitted by Oleh Usik in pull request [29472](https://github.com/magento/magento2/pull/29472)_. [GitHub-29539](https://github.com/magento/magento2/issues/29539) + + + +* `AdminProductFormSaveActionGroup` _Fix submitted by Oleh Usik in pull request [29142](https://github.com/magento/magento2/pull/29142)_. [GitHub-29292](https://github.com/magento/magento2/issues/29292) + + + +* `AdminSaveCategoryActionGroup` _Fix submitted by Oleh Usik in pull request [28993](https://github.com/magento/magento2/pull/28993)_. [GitHub-29388](https://github.com/magento/magento2/issues/29388) + + + +* `AdminProductGridSectionClickFirstRowActionGroup` _Fix submitted by Oleh Usik in pull request [29000](https://github.com/magento/magento2/pull/29000)_. [GitHub-29295](https://github.com/magento/magento2/issues/29295) + + + +* `AdminProductFormCategoryExistInCategoryListActionGroup` and `AdminProductFormCategoryNotExistInCategoryListActionGroup` _Fix submitted by Alexander Steshuk in pull request [28287](https://github.com/magento/magento2/pull/28287)_. [GitHub-28392](https://github.com/magento/magento2/issues/28392) + + + +* `AdminExpandCategoryTreeActionGroup` _Fix submitted by Oleh Usik in pull request [29133](https://github.com/magento/magento2/pull/29133)_. [GitHub-29289](https://github.com/magento/magento2/issues/29289) + + + +* `AdminTaxRateGridOpenPageActionGroup` _Fix submitted by Oleh Usik in pull request [29007](https://github.com/magento/magento2/pull/29007)_. [GitHub-29281](https://github.com/magento/magento2/issues/29281) + + + +* `AdminNavigateNewCustomerActionGroup` _Fix submitted by Oleh Usik in pull request [29134](https://github.com/magento/magento2/pull/29134)_. [GitHub-29287](https://github.com/magento/magento2/issues/29287) + +#### New tests + + + +* Added test for deleting a CMS page as an Admin user. _Fix submitted by Dmitry Tsymbal in pull request [28112](https://github.com/magento/magento2/pull/28112)_. [GitHub-28202](https://github.com/magento/magento2/issues/28202) + +* Added the `StorefrontShareCustomerWishlistActionGroup` test for customer wishlist sharing with invalid email addresses. The existing test for wish list sharing (`StorefrontShareWishlistEntityTest`) has been refactored. `StorefrontCustomerShareWishlistActionGroup` has been deprecated. + + + +* Added a test to check for the implementation of the **Only X left Threshold** configuration setting. _Fix submitted by Oleh Usik in pull request [27549](https://github.com/magento/magento2/pull/27549)_. [GitHub-28755](https://github.com/magento/magento2/issues/28755) + +### Newsletter + + + +* Exporting the Newsletter Subscribers list using the `Excel XML` option now results in the export of all rows as expected. Previously, exported data included only the page pagination value, not all rows. + + + +* Newsletter subscription emails now use the same HTML tags as other newsletter-related emails. _Fix submitted by Paweł Tylek in pull request [27357](https://github.com/magento/magento2/pull/27357)_. [GitHub-28166](https://github.com/magento/magento2/issues/28166) + + + +* Adds a test for deleting newsletter subscriber as an Admin user. _Fix submitted by Dmitry Tsymbal in pull request [28972](https://github.com/magento/magento2/pull/28972)_. [GitHub-29032](https://github.com/magento/magento2/issues/29032) + + + +* Added tests for newsletter subscription for guests with a disallowed option in config statements. This test replaces deprecated `VerifyRegistredLinkDisplayedForGuestSubscriptionNoTest` and `StorefrontCreateNewSubscriberActionGroup`. _Fix submitted by Dmitry Tsymbal in pull request [28872](https://github.com/magento/magento2/pull/28872)_. [GitHub-29039](https://github.com/magento/magento2/issues/29039) + +### Orders + + + +* The `GetAssetIdByContentFieldInterface` and its implementation on `MediaContent` modules now permits Adobe Stock Integration to extend `MediaGallery` filter functionality. _Fix submitted by Gabriel da Gama in pull request [29058](https://github.com/magento/magento2/pull/29058)_. [GitHub-1464](https://github.com/magento/magento2/issues/1464) + + + +* The `CustomerAddressI` values for a newly created customer is now validated in quotes. _Fix submitted by Andrii Kalinich in pull request [29139](https://github.com/magento/magento2/pull/29139)_. [GitHub-28793](https://github.com/magento/magento2/issues/28793) + + + +* The order status for a credit memo with zero total is now `Closed`. Previously, Magento reported its order status as `Complete`. _Fix submitted by Andrii Kalinich in pull request [29023](https://github.com/magento/magento2/pull/29023)_. [GitHub-22762](https://github.com/magento/magento2/issues/22762) + +### Page Builder + + + +* The `description` and `short_description` product attributes have been re-ordered to better accommodate planned changes to Page Builder content staging. _Fix submitted by Matt Walters in pull request [29238](https://github.com/magento/magento2/pull/29238)_. [GitHub-543](https://github.com/magento/magento2-page-builder/issues/543) + +### Payment methods + + + +* Magento now displays a message that prompts you to enter mandatory credit card data when you click **Submit** for an Admin order without entering valid payment information. Previously, the Braintree card validator did not throw an error when payment input fields were invalid and the page became inactive. + + + +* You can now change the shipping method for an order you create from the Admin for a customer whose account has a stored credit card (Braintree). Previously, when you selected a different shipping method, the stored card was not selected, and Magento did not place the order. + +#### PayPal + + + +* The Order Review page of the checkout workflow now displays the correct shipping amount for PayPal through Braintree orders for which the shipping method has been changed during checkout. Previously, when a customer changed the shipping method on the PayPal Order Review page of the checkout workflow, Magento did not update the order total with the correct method. + + + +* Merchants can now successfully cancel orders that were authorized using PayPal. Previously, Magento did not cancel the order and displayed this error: `Declined: 10601-Authorization has expired`. + + + +* Magento no longer empties your cart when you cancel an order by closing the PayPal payment popup window after first completing another order. + +### Performance + +* Three new configuration settings support a decrease in consumer queue CPU consumption. These optional parameters provide increased control over consumers and save server resources. See [Configure message queues]({{page.baseurl}}/extension-dev-guide/message-queues/config-mq.html) for a description of the `maxIdleTime`, `sleep`, and `onlySpawnWhenMessageAvailable` parameters. + + + +* Plugin list configuration is now generated during the execution of the `di:compile` command. This configuration information is written to generated metadata folders based on scope. Previously, this information was stored in cache. Resulting performance improvements include: + + * Network cache size has decreased + * Execution time for many scenarios has been improved. + + + +* Magento now loads the appropriate slider widget on demand, which has improved page loading. The touch slider widget customization has been moved to a separate file so it can be loaded only on compatible devices. The appropriate slider widget type is now loaded only when range binding is actually used on the page. _Fix submitted by Mateusz Krzeszowiak in pull request [27616](https://github.com/magento/magento2/pull/27616)_. [GitHub-28807](https://github.com/magento/magento2/issues/28807) + + + +* The performance of checkout with multiple simultaneous orders has been improved. + + + +* Deadlocks no longer occur when the import process executes a bulk insert and the re-index process simultaneously executes a large insert from select. Previously, Magento displayed this error: `PDOException: SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock`. [GitHub-8933](https://github.com/magento/magento2/issues/8933) + +### Return Merchandise Authorizations (RMA) + + + +* The Returns page now works as expected after you create a shipping label for a Return Merchandise Authorization (RMA). Previously, merchants could not interact with any page elements on the Returns page after creating a shipping label for an RMA. This was a known issue for 2.4.0, and MC-35984-2.4.0-CE-composer.patch addressed this issue for Magento 2.4.0. + + + +* Magento now displays either an informative error message or all available products when an administrator with restricted permissions tries to create a return for products that are no longer in the assigned website scope. Previously, Magento displayed a blank page. + +### Reviews + + + +* A unique key for `entity_pk_value-entity_type-store_id` has been added to the `review_entity_summary` table, which prevents the creation of duplicate rows for the same product ID (`entity_pk_value`). Previously, this lack of unique key resulted in duplicate rows for the same product ID and SQL errors. + +### Sales + + + +* Magento no longer assigns a status of `Complete` after invoicing to an order that requires zero payment. + + + +* The New Shipment email generated by the REST API now contains the same shipping and customer information as shipments that are created manually from the Admin. Previously, this email did not contain the customer name, tracking information, products ordered, and other order information. + + + +* Guest user names are now visible as expected in invoice- and shipment-related emails when the emails are loaded or customized from the Admin. + + + +* The PDF invoice is now translated into the language of the store view where the order has been placed. Previously, the PDF invoice was translated in the language of the Admin. + + + +* You can now issue a refund as expected from the credit memo page. [GitHub-29014](https://github.com/magento/magento2/issues/29014) + + + +* Localised region names that are displayed on the storefront Order page are now correctly translated. Previously, the region name was not based on the specified locale unless it was edited in the Admin. + + + +* Shipments created through the POST `/rest/V1/shipment` endpoint now update orders properly. Previously, Magento created a shipment, but shipment status remained in the processing state. + + + +* Credit memos now display the payment method that is derived from the scope of the store in which the order was made. Previously, credit memos displayed the name as defined the default store scope. _Fix submitted by Ledian Hymetllari in pull request [27582](https://github.com/magento/magento2/pull/27582)_. [GitHub-27570](https://github.com/magento/magento2/issues/27570) + +### Search + + + +* You can now search for products by attribute from the Admin Customer view using QuickSearch. Previously, an exception occurred on the catalog search result page. + + + +* Magento now displays configurable products on the category page as expected after you add a product attribute. + + + +* Elasticsearch results now include the correct values for each store view’s attribute options. If a Dropdown or Multiple Select attribute has a different option value in the non-default store view than in the default store view, Elasticsearch now indexes that value or returns the product with that value in the results. Previously, Elasticsearch did not index that value or return the product with that value in the results. + + + +* Searching by SKU now works as expected in advanced search with Elasticsearch. Previously, when you tried to search by SKU, Magento displayed this error message: `We can't find any items matching these search criteria. Modify your search`. + + + +* Advanced search no longer lets shoppers filter on negative prices. _Fix submitted by Rohan Hapani in pull request [27359](https://github.com/magento/magento2/pull/27359)_. [GitHub-27358](https://github.com/magento/magento2/issues/27358) + + + +* Scope values are now reset as expected on the New Synonym Group form. _Fix submitted by Sathish Subramanian in pull request [29206](https://github.com/magento/magento2/pull/29206)_. [GitHub-28947](https://github.com/magento/magento2/issues/28947) + +### Shipping + + + +* Magento now calculates shipping table rates correctly after upgrade. Previously, shipping table rates were calculated based on net price, which excluded VAT. + + + +* Customers can now successfully remove reward points on the order review page of the checkout workflow when checking out with multiple addresses. Previously, Magento threw a `404 Not Found` error when a customer clicked the **Remove** button to remove points for any address. This was a known issue in Magento 2.4.0. + + + +* Magento now displays shipping rates in the correct currency in the checkout workflow for orders specifying FedEx as the shipping method. + + + +* Multi-page PDFs of shipping labels for orders shipped by UPS now display the correct count. + + + +* Problems with the JavaScript components of the Create Packages page have been resolved. Previously, Magento did not display the **Create Shipping Label** checkbox on this page, and you could not create a shipping label for an existing order. + +### Sitemap + + + +* The sitemap in `robots.txt` is now store-specific. _Fix submitted by Vadim Malesh in pull request [29331](https://github.com/magento/magento2/pull/29331)_. [GitHub-28901](https://github.com/magento/magento2/issues/28901) + + + +* Encoded values are now correctly escaped in the `sitemap.xml` file. Previously, when you included encoded characters in a product name or image title, the generated sitemap was invalid. + +### Staging + + + +* The **Set Product as New** attribute label now appears as expected on a product’s detail and scheduled update pages. + + + +* You can now successfully preview the staging schedule for a CMS block. Previously, Magento threw a fatal error. + + + +* You can now access the CMS Preview page when editing a CMS page with a scheduled update and re-assigning it from the default store to another store. Previously, Magento threw a 404 error when you clicked on the preview link. + + + +* You can now use POST `/V1/products/special-price` to update a product’s special price without specifying `price_from` and `price_to` parameter values. Previously, the Special Price API only worked with schedule updates, and if these parameters were empty, Magento returned this error: `The Start Time for Future Update needs to be selected. Select and try again`. + +### Store + + + +* Deleting a previously created store view no longer results in an error in deployments with a split database configuration. Previously, Magento threw an exception. + + + +* You can now export `config.php` and default website code from one website to install and configure Magento on a second website in a multi website deployment. Previously, the default store and view disappeared after the export, and errors occurred on the storefront. + +### Swagger + + + +* You can now generate a customer token with Swagger. Previously, Swagger did not generate a response code when valid customer access information was entered, and Magento displayed this error: `The account sign-in was incorrect or your account is disabled temporarily. Please wait and try again later`. _Fix submitted by Vadim Malesh in pull request [28822](https://github.com/magento/magento2/pull/28822)_. [GitHub-27098](https://github.com/magento/magento2/issues/27098) + +### Swatches + + + +* Configurable products with swatches now show tier pricing when a shopper clicks **Edit** in the cart. Previously, Magento did not display tier prices in the cart before checkout. _Fix submitted by Sathish Subramanian in pull request [29137](https://github.com/magento/magento2/pull/29137)_. [GitHub-28270](https://github.com/magento/magento2/issues/28270) + + + +* Magento now displays tier prices as expected for configurable product variations. + +### TargetRule + + + +* The performance of the product page under the following conditions has improved: + + * The target rule module is installed + * Linked product functionality (related, up-sell and cross-sell products) is implemented + +### Tax + + + +* Magento no longer displays a fixed product tax attribute on the storefront for a product after a merchant has unassigned it from the product’s attribute set. + +### Test + + + +* PHPUnit 9 errors have been fixed in unit tests. _Fix submitted by Anton Evers in pull request [29244](https://github.com/magento/magento2/pull/29244)_. [GitHub-29329](https://github.com/magento/magento2/issues/29329) + + + +* Added unit tests for approving a purchase order that was made with a discount that has since expired will place an order at full amount and not update the purchase order total. _Fix submitted by Joan He in pull request [18](https://github.com/magento/partners-magento2-infrastructure/pull/18)_. [GitHub-204](https://github.com/magento/partners-magento2b2b/issues/204) + + + +* `SynchronizeFilesInterface` is now covered by integration tests. _Fix submitted by jmonteros422 in pull request [29493](https://github.com/magento/magento2/pull/29493)_. [GitHub-1742](https://github.com/magento/magento2/issues/1742) + + + +* A function has been added to `\Magento\TestFramework\TestCase\WebapiAbstract` that enables the comparison of large nested arrays of expected and actual outcomes in tests and permits testers to ignore irrelevant keys in the actual outcome. _Fix submitted by Jekabs in pull request [29458](https://github.com/magento/magento2/pull/29458)_. [GitHub-29498](https://github.com/magento/magento2/issues/29498) + + + +* Corrected the inversion of expected value with actual value in `app/code/Magento/Newsletter/Test/Unit/Model/SubscriptionManagerTest.php`. _Fix submitted by Lukasz Bajsarowicz in pull request [29271](https://github.com/magento/magento2/pull/29271)_. [GitHub-29283](https://github.com/magento/magento2/issues/29283) + + + +* Using `ObjectManager` for instantiating classes during test has been replaced with the new keyword in unit tests. _Fix submitted by Lukasz Bajsarowicz in pull request [29272](https://github.com/magento/magento2/pull/29272)_. [GitHub-29346](https://github.com/magento/magento2/issues/29346) + + + +* Test coverage has been added for these cases of the `updateCustomer` mutation: invalid date of birth, invalid email address, and empty customer last name. _Fix submitted by Alexander Taranovsky in pull request [28304](https://github.com/magento/magento2/pull/28304)_. [GitHub-28394](https://github.com/magento/magento2/issues/28394) + + + +* The `ApiFunctional TestFramework` GraphQL client now parses headers correctly. [GitHub-26425](https://github.com/magento/magento2/issues/26425) + +### Theme + + + +* Themes that are added in User Agent Rules are now affected as expected when you run `bin/magento catalog:images:resize`. Previously, only themes that were assigned to stores were affected when `bin/magento catalog:images:resize` was run. + +### Translation and locales + + + +* Magento no longer throws an error when an administrator changes the **Date** field during Admin product creation or save when the Admin locale is Chinese or Japanese. [GitHub-24696](https://github.com/magento/magento2/issues/24696) + + + +* Magento now checks area (frontend or `adminhtml`) before rendering inline translation markup. Previously, making an API call to `/rest/V1/integration/admin/token` with bad credentials while inline translation was enabled results in the inclusion of inline translation markup around the error message in the API response. _Fix submitted by Zach Nanninga in pull request [28856](https://github.com/magento/magento2/pull/28856)_. [GitHub-28656](https://github.com/magento/magento2/issues/28656) + + + +* Bulgarian regions have been added to the `directory_country_region` table. _Fix submitted by Nikola Lardev in pull request [27957](https://github.com/magento/magento2/pull/27957)_. [GitHub-28215](https://github.com/magento/magento2/issues/28215) + + + +* The titles and buttons on the Admin **Customers** > **Add New Address** and **Edit Product** > **Advanced Inventory** modals can now be translated. _Fix submitted by Sathish Subramanian in pull request [28174](https://github.com/magento/magento2/pull/28174)_. [GitHub-28201](https://github.com/magento/magento2/issues/28201) + + + +* The term FPT can now be translated on Admin **Stores** > **Configuration** > **Sales** > **Tax** > **Fixed Product Taxes**. _Fix submitted by Vadim Malesh in pull request [28108](https://github.com/magento/magento2/pull/28108)_. [GitHub-5477](https://github.com/magento/magento2/issues/5477) + + + +* The **Ship here** button label on the checkout workflow shipping address modal has been changed to match the camel case used for other buttons. This case now matches the case that is used in the translation files. Previously, because of the mismatch in case, this label was not translated. _Fix submitted by WK in pull request [28547](https://github.com/magento/magento2/pull/28547)_. [GitHub-28685](https://github.com/magento/magento2/issues/28685) + +### UI + + + +* The privacy and cookie policy link in the page footer is now displayed as an active link when the Privacy and Cookie Policy page is displayed. _Fix submitted by Sathish Subramanian in pull request [28004](https://github.com/magento/magento2/pull/28004)_. [GitHub-27985](https://github.com/magento/magento2/issues/27985) + + + +* Fixed misalignment of the cursor in the Invoice Comments text area of the invoice associated with an order you have selected from Admin **Sales** > **Orders**. + + + +* The Create New Order page now displays **Add Products By SKU** and **Add Products** buttons as expected. + + + +* Magento now displays the Edit Review page properly when a Product Rating is available for the selected product. + + + +* Magento now correctly displays the Admin customer edit page on an iPhone running Safari. + + + +* Corrected unnecessary scrolling on the Create New Order page. + + + +* Directly clicking on the **Export Tax Rates** button of the Add New Tax Rule page (**Stores** > **Tax Rules**) now downloads the `tax_rates.csv` file as expected. Previously, merchants had to click on the edge of the **Export Tax Rates** button. This was a known issue in Magento 2.4.0. + + + +* The **Add selections to my cart** button on the bottom of the shopping cart now works as expected. This was a known issue in Magento 2.4.0. + + + +* The **Refresh** button of the **Recently Viewed Products** section of the Customer's Activities page now works as expected. Previously, when you clicked **Refresh**, the product list was not refreshed, and the page scrolled. + + + +* Magento now correctly displays the calendar icon used for selecting a customer’s date of birth on the Conditions tab of **Customers** > **Segments** > **Add Segment**. + + + +* The checkout summary section of the checkout workflow no longer flickers when a shopper scrolls through this page on Internet Explorer 11.x. + + + +* Magento now correctly displays the Order by SKU widget on the storefront Category page. Previously, the HTML code for this widget was not rendered, and Magento did not display the **Load a list of SKUs** link. + + + +* UI components that have been disabled using `this.disabled(true)` no longer appear on the storefront. [GitHub-29098](https://github.com/magento/magento2/issues/29098) + + + +* Magento now displays the recently viewed products widget properly in mobile view. _Fix submitted by Tu Nguyen in pull request [27572](https://github.com/magento/magento2/pull/27572)_. [GitHub-27058](https://github.com/magento/magento2/issues/27058) + + + +* Changing the position of a product from the Admin is now reflected in the product position on the storefront. _Fix submitted by Oleg Aleksin in pull request [28150](https://github.com/magento/magento2/pull/28150)_. [GitHub-28149](https://github.com/magento/magento2/issues/28149) + + + +* The login form style are now consistent with the style on other forms in the Blank theme. Unnecessary styles that set the width for container control wrap input fields have been removed. _Fix submitted by Tu Nguyen in pull request [28084](https://github.com/magento/magento2/pull/28084)_. [GitHub-28059](https://github.com/magento/magento2/issues/28059) + + + +* The **OK** button on the mini cart delete product confirmation pop-up now behaves as expected. _Fix submitted by Tu Nguyen in pull request [28083](https://github.com/magento/magento2/pull/28083)_. [GitHub-27095](https://github.com/magento/magento2/issues/27095) + + + +* Product gallery elements no longer blink during page load. _Fix submitted by Mateusz Krzeszowiak in pull request [27871](https://github.com/magento/magento2/pull/27871)_. [GitHub-28339](https://github.com/magento/magento2/issues/28339) + + + +* The CSS class that controls field width is now applied as expected for the Start Time element throughout the Admin. _Fix submitted by Shankar Konar in pull request [29511](https://github.com/magento/magento2/pull/29511)_. [GitHub-29496](https://github.com/magento/magento2/issues/29496) + + + +* The Terms and Conditions text label can now display longer text strings properly. _Fix submitted by Bartłomiej Szubert in pull request [29413](https://github.com/magento/magento2/pull/29413)_. [GitHub-24060](https://github.com/magento/magento2/issues/24060) + + + +* The title of the order failure page has been rewritten for accuracy. Previously, when a shopper canceled an order, Magento displayed a page with this title: `We received your order!`. _Fix submitted by Angelo Romano in pull request [29410](https://github.com/magento/magento2/pull/29410)_. [GitHub-29416](https://github.com/magento/magento2/issues/29416) + + + +* The total number of canceled items on the canceled order view page is now correctly identified on the canceled order view page. Previously, this field was labeled **Total Due**. _Fix submitted by Madhu Rajawat in pull request [27516](https://github.com/magento/magento2/pull/27516)_. [GitHub-26191](https://github.com/magento/magento2/issues/26191) + + + +* The toggle button on the create configurable product page now works as expected. _Fix submitted by Tu Nguyen in pull request [28032](https://github.com/magento/magento2/pull/28032)_. [GitHub-22702](https://github.com/magento/magento2/issues/22702) + + + +* The advanced attribute properties block icon on the Advanced Attribute Properties page now behaves as expected. _Fix submitted by Tu Nguyen in pull request [28032](https://github.com/magento/magento2/pull/28032)_. [GitHub-26022](https://github.com/magento/magento2/issues/26022) + + + +* The Admin section of the system configuration page now expands to display required fields as expected when you try to save configuration settings for a new module. _Fix submitted by Bartłomiej Szubert in pull request [28285](https://github.com/magento/magento2/pull/28285)_. [GitHub-26427](https://github.com/magento/magento2/issues/26427) + + + +* Corrected behavior of the magnifier when mode is set to `inside`. _Fix submitted by Sean van Zuidam in pull request [29077](https://github.com/magento/magento2/pull/29077)_. [GitHub-29076](https://github.com/magento/magento2/issues/29076) + + + +* Corrected the distractingly long input field width that resulted when a shopper entered an invalid email address in the subscribe field of the page footer. _Fix submitted by Dipesh Rangani in pull request [27106](https://github.com/magento/magento2/pull/27106)_. [GitHub-27099](https://github.com/magento/magento2/issues/27099) + + + +* An `Uncaught ReferenceError` error no longer appears in the dev console when you add a new tag and move the mouse cursor over it. _Fix submitted by Nazar Klovanych in pull request [29392](https://github.com/magento/magento2/pull/29392)_. [GitHub-1700](https://github.com/magento/magento2/issues/1700) + + + +* Removed an unused `AdminAnalytics` test (`TrackingScriptTest`). _Fix submitted by Lukasz Bajsarowicz in pull request [28605](https://github.com/magento/magento2/pull/28605)_. [GitHub-28850](https://github.com/magento/magento2/issues/28850) + + + +* Issues with the serialization and unserialization of static properties when running consecutive tests have been resolved. _Fix submitted by Pavel Bystritsky in pull request [26175](https://github.com/magento/magento2/pull/26175)_. [GitHub-28319](https://github.com/magento/magento2/issues/28319), [GitHub-29313](https://github.com/magento/magento2/issues/29313) + +### URL rewrites + + + +* Moving a store view to a different website no longer resets URLs. Previously, Magento incorrectly regenerated CMS and product URL rewrites. + +* You can now successfully preview the staging schedule for a CMS block. Previously, Magento threw a fatal error. + + + +* Magento now preserves existing catalog URL rewrites as expected when a store view is assigned to a different store. Previously, Magento deleted the store-specific URL rewrites. + +### Varnish + + + +* Restarting Varnish no longer results in 503 errors. _Fix submitted by Ihor Sviziev in pull request [28137](https://github.com/magento/magento2/pull/28137)_. [GitHub-24353](https://github.com/magento/magento2/issues/24353) + +### Vault + + + +* Magento no longer saves credit card numbers when the **Save for later use** checkbox on the payment section of the checkout workflow is not selected. + +### Visual Merchandiser + + + +* Magento now displays source stock instead of the default product stock when you sort products in Visual Merchandiser and Inventory is enabled. + +### Web API framework + + + +* Invoices created using REST now include gift card information similar to the invoices that are created in the Admin. Previously, using POST `/V1/order/:id/invoice` to invoice the order did not display the gift card code or gift card amount applied. + + + +* Merchants with multiple websites can now use the REST API to create and update products while preserving image and image-role inheritance. Previously, when a merchant used the REST API to create and update products, and a product was updated for store view, and the default image roles were loaded and saved for that store view. As a result, the store-view image roles stopped inheriting from the default scope after update. + + + +* An unscoped integration user account can now access a resource through the REST API when resource permissions allow access. + + + +* Search criteria filters now work as expected for product attributes that are used during the creation of a configurable product. [GitHub-29126](https://github.com/magento/magento2/issues/29126) + + + +* Customer group ID is now validated for POST `/rest/V1/customers` requests. Previously, Magento did not display an error message when you used an invalid `group_id` in these requests. _Fix submitted by Vadim Malesh in pull request [28903](https://github.com/magento/magento2/pull/28903)_. [GitHub-28064](https://github.com/magento/magento2/issues/28064) + + + +* PHP sessions are not created by default for anonymous REST calls. Previously, sessions were started even when unnecessary. _Fix submitted by Maciej Pawłowski in pull request [26032](https://github.com/magento/magento2/pull/26032)_. [GitHub-7213](https://github.com/magento/magento2/issues/7213) + + + +* Using various REST endpoints to update orders that contain custom option no longer deletes the custom option information. Previously, values in `info_buyRequest` were deleted. _Fix submitted by Vadim Malesh in pull request [28483](https://github.com/magento/magento2/pull/28483)_. [GitHub-22431](https://github.com/magento/magento2/issues/22431) + + + +* Using GET `V1/customers/me` now honors **Share Customer Accounts** setting (Admin **Stores** > **Configuration** > **Customers** > **Customer Configuration** > **Account Sharing Options**) when retrieving user information. _Fix submitted by Pavel Bystritsky in pull request [28213](https://github.com/magento/magento2/pull/28213)_. [GitHub-26089](https://github.com/magento/magento2/issues/26089) + + + +* Address-related extension attributes can be set as data arrays. Previously, Magento threw an error when a POST request that contained  `extension_attributes` was sent to `estimate-shipping-methods`. This bug, which was introduced by a previous commit, affected any extension attribute set on `Magento\Quote\Api\Data\AddressInterface` that were not objects. _Fix submitted by Alexander Menk in pull request [27338](https://github.com/magento/magento2/pull/27338)_. [GitHub-26682](https://github.com/magento/magento2/issues/26682) + + + +* You can now specify a single field when updating a customer with the PUT `V1/customers/:id` endpoint. Previously, the endpoint required you to specify the customer email and other fields that are required to create a customer. _Fix submitted by Vadim Malesh in pull request [28332](https://github.com/magento/magento2/pull/28332)_. [GitHub-21237](https://github.com/magento/magento2/issues/21237) + +### Website restrictions + + + +* Enabling website restriction no longer blocks Varnish ESI requests for customers logged in as guest. Previously, these guests could not access the home page main menu. + + + +* Magento now loads the product home page as expected when website restrictions are enabled. + +### Wish list + + + +* You can now use the wish list search feature to find a product in a public wish list in deployments where support for multiple wish lists is enabled. Previously, after a customer used the wish list search to find a product, selecting it, and clicking **Add to cart**, Magento did not add the product to the cart and displayed this error: `Invalid Form Key. Please refresh the page`. + + + +* Customers can now change the quantity of a product in a wish list from the wish list itself. Previously, Magento did not update the product quantity and did not display a message. + + + +* Customers can now change the quantity of a grouped product in a wish list from the wish list itself. Previously, Magento did not update the product quantity or display a message. + + + +* The storefront Category page now displays the wish list search widget as expected. + + + +* Polyfills for `Map`, `WeakMap`, `FormData`, and `MutationObserver` are now loaded only as needed. _Fix submitted by Dmitry Tsymbal in pull request [28330](https://github.com/magento/magento2/pull/28330) and Mateusz Krzeszowiak in pull request [27618](https://github.com/magento/magento2/pull/27618)_. [GitHub-28377](https://github.com/magento/magento2/issues/28377), [GitHub-28382](https://github.com/magento/magento2/issues/28382) + + + +* The wish list update process now supports updating a wish list item and its description simultaneously. _Fix submitted by Eduard Chitoraga in pull request [28222](https://github.com/magento/magento2/pull/28222)_. [GitHub-28261](https://github.com/magento/magento2/issues/28261) + + + +* Magento now correctly validates the allowed maximum of wish lists that a shopper can create. _Fix submitted by Eduard Chitoraga in pull request 247 in private repo partners-magento2ee_. + + + +* Administrators can now configure a configurable product that has been added by a customer to a wish list from a non-default store. Previously, when the customer had also added the configurable product from a non-default store, Magento threw an error. + + + +* Added a test for sharing a customer's wish list with more than the allowed number of emails. _Fix submitted by Dmitry Tsymbal in pull request [28641](https://github.com/magento/magento2/pull/28641)_. [GitHub-28720](https://github.com/magento/magento2/issues/28720) + + + +* Added a test for deleting items from a customer’s wish list as an Admin user. _Fix submitted by Dmitry Tsymbal in pull request [28632](https://github.com/magento/magento2/pull/28632)_. [GitHub-28721](https://github.com/magento/magento2/issues/28721) + + + +* Added a test for disabling wish list functionality. _Fix submitted by Dmitry Tsymbal in pull request [28635](https://github.com/magento/magento2/pull/28635)_. [GitHub-28744](https://github.com/magento/magento2/issues/28744) + + + +* Added a test for using invalid email addresses when sharing customer wish lists. `StorefrontShareWishlistEntityTest` has been refactored. `StorefrontCustomerShareWishlistActionGroup` has been deprecated. _Fix submitted by Dmitry Tsymbal in pull request [28330](https://github.com/magento/magento2/pull/28330)_. [GitHub-28377](https://github.com/magento/magento2/issues/28377) + + + +* Added a test for sharing a customer's wish list that exceeds the allowed text length limit. _Fix submitted by Dmitry Tsymbal in pull request [28812](https://github.com/magento/magento2/pull/28812)_. [GitHub-28969](https://github.com/magento/magento2/issues/28969) + +## Known issues + +**Issue**: The new CAPTCHA feature for checkout does not work as expected on the Place Order page when using third-party payment providers. Merchants running Magento 2.3.6 or 2.4.1 who have enabled CAPTCHA protection on the Place Order storefront page will see this error when checking out using a third-party payment provider such as PayPal: `Please provide CAPTCHA code and try again`. A fix for this issue be available in the next few weeks, and will be included in our next quarterly patch (Q12021). Please contact Support for additional information. + +**Issue**: Users without administrator privileges cannot currently set up their personal 2FA access. 2FA as implemented in Magento includes two ACL roles. One role affects global system configuration and it is needed only when configuring the system. The second ACL role affects individual user 2FA accounts. An admin user must configure this second type of 2FA ACL. **Workaround**: After the user has logged in and seen the Access denied screen, they can visit `https:////tfa/tfa/requestconfig/` to force configuration. Note: We do not recommend disabling security settings. However, this workaround is effective only when Admin URL secret keys are disabled. + +**Issue**: Merchants cannot log in to dotdigital from the Admin in Safari when dotdigital is enabled. See the [It's impossible to login in the dotdigital via admin panel when dotdigital account is enabled](https://support.magento.com/hc/en-us/articles/360050092291) Knowledge Base article. + +**Issue**: Vertex address validation does not work during payment when the shopper selects a shipping address that differs from the billing address. The issue will be fixed in Magento 2.4.2. See the [Magento 2.4.1 known issue: Vertex Address Validation message does not disappear after updating address](https://support.magento.com/hc/en-us/articles/360050139631) Knowledge Base article. + +**Issue**: Magento displays an empty page when a merchant saves a dotdigital Page Builder form on the Safari browser. **Workaround**: Reload the page to apply your changes. See the [Magento 2.4.1 known issue: empty page after saving dotdigital Page Builder form](https://support.magento.com/hc/en-us/articles/360049819092) Knowledge Base article. + +**Issue**: Under certain conditions, Magento automatically signs in customers to previously used Amazon accounts rather prompting them to log in during checkout with Amazon Pay. See the [Magento 2.4.1 known issue: unable to change Amazon account in Google Chrome](https://support.magento.com/hc/en-us/articles/360049814152) Knowledge Base article. + +**Issue**: Magento briefly displays an error message on the billing page of the checkout workflow when PayPal Braintree payment and multiple addresses shipment are selected. See the [Magento 2.4.1 known issue: error popping up on Checkout with PayPal Braintree](https://support.magento.com/hc/en-us/articles/360050253211) Knowledge Base article. + +**Issue**: Magento displays a non-informative error message when a guest customer tries to place an order with PayPal through Braintree when guest checkout is disabled. See the [Magento 2.4.1 known issue: non-informative error message during guest checkout using Paypal through Braintree](https://support.magento.com/hc/en-us/articles/360050368111) Knowledge Base article. + +## Community contributions + +We are grateful to the wider Magento community and would like to acknowledge their contributions to this release. Check out the following ways you can learn about the community contributions to our current releases: + +* If a community member has provided a fix for this release, we identify the fix in the Fixed Issue section of these notes with the phrase, "*Fix provided by community member*". + +* The Magento Community Engineering team [Magento Contributors](https://magento.com/magento-contributors) maintains a list of top contributing individuals and partners by month, quarter, and year. From that Contributors page, you can follow links to their merged PRs on GitHub. + +### Partner contributions + +The following table highlights contributions made by Partners. This table lists the Partner who contributed the pull request, the external pull request, and the GitHub issue number associated with it (if available). + +{% include release-notes/engcomm-2-4-1-partner.md %} + +### Individual contributor contributions + +The following table identifies contributions from our community members. This table lists the external pull requests, the GitHub issue number associated with it (if available), and the community member who contributed the pull request. + +{% include release-notes/engcomm-2-4-1-issues.md %} + +### System requirements + +Our technology stack is built on PHP and MySQL. For more information, see [System Requirements]({{site.baseurl}}/system-requirements.html). + +### Installation and upgrade instructions + +You can install Magento Commerce 2.4.1 using Composer. + +## Migration tool kits + +The Data Migration Tool helps transfer existing Magento 1.x store data to Magento 2.x. This command-line interface includes verification, progress tracking, logging, and testing functions. For installation instructions, see [Install the Data Migration Tool]({{page.baseurl}}/migration/migration-tool-install.html). Consider exploring or contributing to the [Magento Data Migration repository](https://github.com/magento/data-migration-tool). + +The [Code Migration Toolkit](https://github.com/magento-commerce/code-migration) helps transfer existing Magento 1.x store extensions and customizations to Magento 2.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts. diff --git a/src/guides/v2.4/release-notes/open-source-2-4-1.md b/src/guides/v2.4/release-notes/open-source-2-4-1.md new file mode 100644 index 00000000000..37b72954373 --- /dev/null +++ b/src/guides/v2.4/release-notes/open-source-2-4-1.md @@ -0,0 +1,1699 @@ +--- +group: release-notes +title: Magento Open Source 2.4.1 Release Notes +--- + +Magento Open Source 2.4.1 introduces enhancements to performance and security. Security enhancements include support for the `SameSite` attribute for cookies and the addition of CAPTCHA protection for payment-related and order-related API endpoints and the Place Order storefront page. + +This release includes all improvements to core quality that were included in Magento 2.4.0, over 150 new fixes to core code, and over 15 security enhancements. It includes the resolution of almost 300 GitHub issues by our community members. These community contributions range from minor clean-up of core code to significant enhancements in GraphQL. + +All known issues identified in Magento 2.4.0 have been fixed in this release. + +{:.bs-callout-info} + +Quarterly releases may contain backward-incompatible changes (BIC). Magento 2.4.1 contains minor backward-incompatible changes. To review minor backward-incompatible changes, see [BIC reference]({{page.baseurl}}/release-notes/backward-incompatible-changes/reference.html). (Major backward-incompatible issues are described in [BIC highlights]({{page.baseurl}}/release-notes/backward-incompatible-changes/index.html). Not all releases introduce major BICs.) + +## Security-only patch available + +Merchants can now install time-sensitive security fixes without applying the hundreds of functional fixes and enhancements that a full quarterly release (for example, Magento 2.4.0-p1) provides. Patch 2.4.0.1 (Composer package 2.4.0-p1) is a security-only patch that provides fixes for vulnerabilities that have been identified in our previous quarterly release, Magento 2.4.0. All hot fixes that were applied to the 2.4.0 release are included in this security-only patch. (A *hot fix* provides a fix to a released version of Magento that addresses a specific problem or bug.) + +For general information about security-only patches, see the Magento DevBlog post [Introducing the New Security-only Patch Release](https://community.magento.com/t5/Magento-DevBlog/Introducing-the-New-Security-only-Patch-Release/ba-p/141287). For instructions on downloading and applying security-only patches (including patch 2.3.5-p2), see [Install Magento using Composer]({{page.baseurl}}/install-gde/composer.html). Security-only patches include security bug fixes only, not the additional security enhancements that are included in the full patch. + +## Other release information + +Although code for these features is bundled with quarterly releases of the Magento core code, several of these projects (for example, Progressive Web Applications (PWA) Studio) are also released independently. Bug fixes for these projects are documented in the separate, project-specific release information that is available in the documentation for each project. + +## Highlights + +Look for the following highlights in this release. + +### Substantial security enhancements + +This release includes over 15 security fixes and platform security improvements. All security fixes have been backported to Magento 2.4.0-p1 and Magento 2.3.6. + +#### Over 15 security enhancements that help close remote code execution (RCE) and cross-site scripting (XSS) vulnerabilities + +No confirmed attacks related to these issues have occurred to date. However, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. Most of these issues require that an attacker first obtains access to the Admin. As a result, we remind you to take all necessary steps to protect your Admin, including but not limited to these efforts: IP allowlisting, [two-factor authentication]({{page.baseurl}}/security/two-factor-authentication.html), use of a VPN, the use of a unique location rather than `/admin`, and good password hygiene. See [Security Updates Available for Magento](https://helpx.adobe.com/security/products/magento/apsb20-59.html) for a discussion of these fixed issues. + +#### Additional security enhancements + +Security improvements for this release include: + +* **CAPTCHA** protection has been added to the following product areas: + + * Place Order storefront page and REST and GraphQL endpoints + * Payment-related REST and GraphQL endpoints. + + CAPTCHA protection for these additional pages is disabled by default. It can be enabled on the Admin in the same way that other pages covered by CAPTCHA are. This protection has been added as an anti-brute force mechanism to protect stores against carding attacks. See [CAPTCHA](https://docs.magento.com/user-guide/stores/security-captcha.html). + +* **Support for the SameSite attribute for cookies**. To support the Google Chrome enforcement of the new cookie classification system, Magento classes that handle cookies have been updated to support the `SameSite` cookie attribute. This attribute is set to `Lax` by default but can be explicitly overridden. + +* **Enhanced Magento Scan Tool**. Adobe has partnered with [Sanguine Security](https://sansec.io/), a leader in preventing digital skimming, to integrate their database of over 8700 threat signatures into the Magento Security Scan Tool. This partnership will enable merchants to get real-time insights into the security status of their site through proactive detection of malware and reduction of false positives. Merchants can register for the tool by visiting https://account.magento.com/scanner. For more information, see the [Secure Your Storefront With the Enhanced Magento Security Scan Tool](https://magento.com/blog/magento-news/secure-your-storefront-enhanced-magento-security-scan-tool) blog post. + +{:.bs-callout-info} +Starting with the release of Magento Commerce 2.3.2, Magento will assign and publish indexed Common Vulnerabilities and Exposures (CVE) numbers with each security bug reported to us by external parties. This allows users of Magento Commerce to more easily identify unaddressed vulnerabilities in their deployment. You can learn more about CVE identifiers at [CVE](https://cve.mitre.org/). + +### Infrastructure improvements + +This release contains enhancements to core quality, which improve the quality of the Framework and these functional areas: Customer Account, Catalog, CMS, OMS, Import/Export, Promotions and Targeting, Cart and Checkout, and Staging and Preview. + +### Performance improvements + +* **Reduction in the size of network transfers between Redis and Magento**. Plugin list configuration is now generated during the execution of the `bin/magento di:compile` command. This configuration information is written to generated metadata folders based on scope. Previously, this information was stored in cache. Resulting performance improvements include a decrease in network cache size and execution time for many scenarios. + +* **Enhanced message queue consumer performance**. Three new configuration settings support a decrease in consumer queue CPU consumption. These optional parameters provide increased control over consumers and save server resources. See [Configure message queues]({{page.baseurl}}/extension-dev-guide/message-queues/config-mq.html) for a description of the `maxIdleTime`, `sleep`, and `onlySpawnWhenMessageAvailable` parameters. + +* **Improved execution time** for `bin/magento` commands. + +### Adobe Stock Integration + +This release includes Adobe Stock Integration v2.1.0. + +### New Media Gallery + +The New Media Gallery is now enabled by default in the Admin. Merchants can now perform these actions on images in the Media Gallery: + +* Delete images in bulk +* Optimize media storage by identifying duplicate images and images that are not used on the storefront +* Filter images by the storefront area they are used in, including product and category content and CMS blocks +* Work with image metadata + * View metadata from the images uploaded into Media Gallery + * Edit image metadata (title, description, and keywords) + * Search for images by their metadata + +### GraphQL + +This release adds GraphQL coverage for the following features: + +* **Product reviews**. Customers and guests can write product reviews. Customers can retrieve their product review histories. See [Create a product review]({{page.baseurl}}/graphql/mutations/create-product-review.html) and [productReviewRatingsMetadata query]({{page.baseurl}}/graphql/queries/product-review-ratings-metadata.html) for information on retrieving information about the reviews infrastructure. + +* **Gift options**. All customers and guests can add a gift message to their order. Customers can also add gift wrapping, gift receipts, and printed cards to the order. See [`setGiftOptionsOnCart` mutation]({{page.baseurl}}/graphql/mutations/set-gift-options.html) and [`updateCartItems` mutation]({{page.baseurl}}/graphql/mutations/update-cart-items.html) + +* **Order history**. All customers can view details about their order histories, including invoices, shipping, and refunds. + +* **Add to cart**. The [`addProductsToCart` mutation]({{page.baseurl}}/graphql/mutations/add-products-to-cart.html) allows you to add any type of product to the active cart. We recommend using this mutation instead of single-purpose mutations such as `addSimpleProductsToCart`. _Fix submitted by Yaroslav Rogoza in pull request [27914](https://github.com/magento/magento2/pull/27914)_. [GitHub-28524](https://github.com/magento/magento2/issues/28524) + +* **Stored payment methods**. Logged-in customers can now store payment details (including Braintree credit card and Braintree with PayPal) in My Account. + +* **Support for wish lists in Magento Open Source**. Added support for Open Source wish lists. You can [add items]({{page.baseurl}}/graphql/mutations/add-products-to-wishlist.html) to, [update items]({{page.baseurl}}/graphql/mutations/update-products-in-wishlist.html) in, and [remove items]({{page.baseurl}}/graphql/mutations/remove-products-from-wishlist.html) from a wish list. + +* **Improved management of customer accounts**. We have added the [`createCustomerV2`]({{page.baseurl}}/graphql/mutations/create-customer-v2.html) and [`updateCustomerV2`]({{page.baseurl}}/graphql/mutations/update-customer-v2.html) mutations to manage customer accounts. These new mutations require different input objects than the `createCustomer` and `updateCustomer` mutations. To change a customer's email address, use the new [`updateCustomerEmail`]({{page.baseurl}}/graphql/mutations/update-customer-email.html) mutation. + +* **Support for Payflow Pro Vault**. Added GraphQL Vault support for the [Payflow Pro Vault]({{page.baseurl}}/graphql/payment-methods/payflow-pro-vault.html) payment method. _Fix submitted by Oleh Usik in pull request [28821](https://github.com/magento/magento2/pull/28821)_. [GitHub-28520](https://github.com/magento/magento2/issues/28520) + +* Updated the GraphQL [`storeConfig` query]({{page.baseurl}}/graphql/queries/store-config.html) to include new customer configuration settings. _Fix submitted by Oleh Usik in pull request [27876](https://github.com/magento/magento2/pull/27876)_. [GitHub-28521](https://github.com/magento/magento2/issues/28521) + +* Added the [`requestPasswordResetEmail` mutation]({{page.baseurl}}/graphql/mutations/request-password-reset-email.html), which triggers the password reset email for the provided email address. _Fix submitted by Oleh Usik in pull request [27876](https://github.com/magento/magento2/pull/27876)_. [GitHub-28521](https://github.com/magento/magento2/issues/28521) + +* **Klarna GraphQL**. Added or updated topics on Klarna GraphQL in [Klarna's payment method]({{page.baseurl}}/graphql/payment-methods/klarna.html) and [`createKlarnaPaymentsSession`]({{page.baseurl}}/graphql/mutations/create-klarna-payments-session.html) + +See the [GraphQL Developer Guide]({{page.baseurl}}/graphql/) for details on these enhancements. + +### PWA Studio + +PWA Studio v8.0.0 introduces new features and enhancements: + +* Updates to the Venia style guide that apply to design tokens, typography, colors, core components, and page layouts. + +* Improvements to the Venia mini-cart experience + +* Initial support for multiple locales and localized content on the Venia storefront + +* Numerous improvements to the My Account experience of the Venia storefront + +See [Magento compatibility](https://magento.github.io/pwa-studio/technologies/magento-compatibility/) for a list of PWA Studio versions and their compatible Magento core versions. For information about enhancements and bug fixes, see [PWA Studio releases](https://github.com/magento/pwa-studio/releases). + +### Magento Functional Testing Framework (MFTF) + +MFTF 3.1.0 is now available. See [Magento Functional Testing Framework Changelog](https://github.com/magento/magento2-functional-testing-framework/blob/develop/CHANGELOG.md). + +### Vendor Developed Extensions + +See the following articles for updates on features and changes for this release: + +* [Amazon Pay](https://docs.magento.com/user-guide/payment/amazon-pay.html) + +* [Braintree](https://docs.magento.com/user-guide/payment/braintree.html) + +* [dotdigital Engagement Cloud](https://docs.magento.com/user-guide/marketing/dotdigital/engagement-cloud.html) + +* [Klarna](https://docs.magento.com/user-guide/payment/klarna.html) + +* [Vertex Cloud](https://docs.magento.com/user-guide/tax/vertex.html) + +* [Yotpo Product Reviews](https://docs.magento.com/user-guide/marketing/yotpo-reviews-intro.html) + +## Fixed issues + +We have fixed hundreds of issues in the Magento 2.4.1 core code. + +### Installation, upgrade, deployment + + + +* Installation of Magento with third-party extensions that have dependencies on APIs for the Store module in CLI commands no longer fails. Previously, Magento displayed this error message: `The default website isn't defined. Set the website and try again`. This was a known issue in Magento 2.4.0. + + + +* `bin/magento setup:di:compile` no longer throws a fatal error. Previously, Magento threw an error the first time you ran this command, but the second execution resulted in successful compilation. + + + +* Upgrade no longer fails when a plugin is declared on `Magento\Framework\Encryption\Encryptor`. + + + +* Magento now displays an informative error message when some themes are not deployed after running `bin/magento setup:static-content:deploy`. Previously, when deployment completed successfully but not all packages were deployed, Magento did not display an error. When the command is executed with enabled parallel processing and each theme requires more time to be deployed then the specified maximum execution time, this command can finish successfully, although themes are not deployed. + + + +* The **Use default** checkbox for Klarna payments (**Stores** > **Configuration** > **Sales** > **Payment methods** > **Klarna**) now remain checked as expected when website scope changes. + + + +* Upgrade no longer results in the sudden failure of the Galera cluster. Previously, the Galera cluster exited abruptly after re-indexing immediately after upgrade. During Magento upgrade, index tables are altered, and the engine is changed from `MEMORY` to `InnoDB`. At this point, the content of these tables became out-of-sync between the nodes of the Galera cluster. [GitHub-25334](https://github.com/magento/magento2/issues/25334) + + + +* Disabling the PageBuilder module no longer affects the rendering of the product page. Previously, custom layouts on the product page disappeared when the module was disabled, and Magento displayed a blank page. + + + +* You can now use `bin/magento sampledata:deploy` to deploy sample data as expected after installing Magento using Composer. Previously, Magento threw this error: `Git installations must deploy sample data from GitHub; see https://devdocs.magento.com/guides/v2.3/install-gde/install/sample-data-after-clone.html for more information`. _Fix submitted by Andrii Beziazychnyi in pull request [27481](https://github.com/magento/magento2/pull/27481)_. [GitHub-19481](https://github.com/magento/magento2/issues/19481) + + + +* Storefront performance has improved by eliminating the unnecessary loading of the `Datepicker` component. _Fix submitted by Mateusz Krzeszowiak in pull request [27860](https://github.com/magento/magento2/pull/27860)_. [GitHub-28823](https://github.com/magento/magento2/issues/28823) + + + +* Executing `bin/magento setup:upgrade` no longer displays extraneous information about caches. _Fix submitted by Sathish Subramanian in pull request [27567](https://github.com/magento/magento2/pull/27567)_. [GitHub-27091](https://github.com/magento/magento2/issues/27091) + + + +* Running `bin/magento config:show /general/value` now returns `0` or an empty string as expected. Previously, it returned `Configuration for path: "vendor_module/general/value" doesn't exist`. _Fix submitted by Vadim Malesh in pull request [28549](https://github.com/magento/magento2/pull/28549)_. [GitHub-23290](https://github.com/magento/magento2/issues/23290) + + + +* `bin/magento setup:static-content:deploy --language=all` now deploys all languages that are used on the storefront and all languages configured by Admin users when no language parameter is set. (`en_US` is always deployed by default.) _Fix submitted by Anton Evers in pull request [28922](https://github.com/magento/magento2/pull/28922)_. [GitHub-29218](https://github.com/magento/magento2/issues/29218) + + + +* Magento no longer displays the Backup menu when the Backup feature is disabled. _Fix submitted by Eden Duong in pull request [29222](https://github.com/magento/magento2/pull/29222)_. [GitHub-29280](https://github.com/magento/magento2/issues/29280) + + + +* Catalog image helper initialization now uses the product model instead of `DataObject`. _Fix submitted by jmonteros422 in pull request [29435](https://github.com/magento/magento2/pull/29435)_. [GitHub-1711](https://github.com/magento/adobe-stock-integration/issues/1711) + + + +* Admin users can now save an empty **Customer Token Lifetime (hours)** field (Admin **Stores** > **Configurations** > **Services** > **OAuth** > **Access Token Expiration**). [GitHub-29502](https://github.com/magento/magento2/issues/29502) + + + +* The **Create Permanent Redirect for old URL** setting is now disabled by default for categories. _Fix submitted by Vadim Malesh in pull request [28752](https://github.com/magento/magento2/pull/28752)_. [GitHub-24922](https://github.com/magento/magento2/issues/24922) + +### Adobe Stock Integration + + + +* Images in the Adobe Stock images grid are now properly aligned after filters have been cleared. _Fix submitted by Nazar Klovanych in pull request [28366](https://github.com/magento/magento2/pull/28366)_. [GitHub-824](https://github.com/magento/adobe-stock-integration/issues/824), [GitHub-972](https://github.com/magento/adobe-stock-integration/issues/972) + + + +* Added support for reading `exif_image.png` or `exif-image.jpeg` metadata. _Fix submitted by Nazar Klovanych in pull request [29576](https://github.com/magento/magento2/pull/29576)_. [GitHub-1449](https://github.com/magento/adobe-stock-integration/issues/1449) + + + +* The **Used in** field of the Adobe Stock gallery image details page now accurately identifies if the image is associated with a product. _Fix submitted by Nazar Klovanych in pull request [28798](https://github.com/magento/magento2/pull/28798)_. [GitHub-1474](https://github.com/magento/adobe-stock-integration/issues/1474) + + + +* `\Magento\MediaGallery\Model\ResourceModel\Keyword\SaveAssetsKeywords::execute` now deletes the links to the keywords that are not specified on the parameters and insert the new ones when deleting keyword tags while editing image details. _Fix submitted by jmonteros422 in pull request [29207](https://github.com/magento/magento2/pull/29207)_. [GitHub-1391](https://github.com/magento/adobe-stock-integration/issues/1391) + + + +* The `Login failed` message that Magento displays when a merchant clicks **License** for a previously saved, unlicensed Adobe Stock image no longer contains HTML tags. _Fix submitted by yolouiese in pull request [29398](https://github.com/magento/magento2/pull/29398)_. [GitHub-1684](https://github.com/magento/adobe-stock-integration/issues/1684) + + + +* Clicking on the links in the **Used in** section of the image Details page now displays a grid that displays all entities that are filtered by the image. The asset filter is also set and displayed correctly. Previously, Magento did not display the asset title in the **Applied filters** section. _Fix submitted by Nazar Klovanych in pull request [29367](https://github.com/magento/magento2/pull/29367)_. [GitHub-1694](https://github.com/magento/adobe-stock-integration/issues/1694) + + + +* Magento no longer displays the **Used in** section of the image Details page when the image is not in use. _Fix submitted by Nazar Klovanych in pull request [29367](https://github.com/magento/magento2/pull/29367)_. [GitHub-1699](https://github.com/magento/adobe-stock-integration/issues/1699) + + + +* Corrected display issues when adding a new image tag that exceeds the maximum number of characters. _Fix submitted by Nazar Klovanych in pull request [29367](https://github.com/magento/magento2/pull/29367)_. [GitHub-1702](https://github.com/magento/adobe-stock-integration/issues/1702) + + + +* Assets can now be checked as expected using the assets filter on the image Details **Used in** section. _Fix submitted by Nazar Klovanych in pull request [29367](https://github.com/magento/magento2/pull/29367)_. [GitHub-1704](https://github.com/magento/adobe-stock-integration/issues/1704) + + + +* Information about images that are used by different entities (for example, `page` and `category`) is now listed corrected in the image Details page. _Fix submitted by Nazar Klovanych in pull request [29367](https://github.com/magento/magento2/pull/29367)_. [GitHub-1747](https://github.com/magento/adobe-stock-integration/issues/1747) + + + +* Magento no longer throws an exception when a merchant tries to save a product with its associated image when the Media Gallery is disabled. _Fix submitted by Nazar Klovanych in pull request [29492](https://github.com/magento/magento2/pull/29492)_. [GitHub-1750](https://github.com/magento/adobe-stock-integration/issues/1750) + + + +* Clicking on links in the Used in section for an image in the Media Gallery now opens the grid of entities that are filtered by the image as expected. Previously, the image title was not displayed in the applied filters section of the grid. _Fix submitted by Nazar Klovanych in pull request [29429](https://github.com/magento/magento2/pull/29429)_. [GitHub-1694](https://github.com/magento/adobe-stock-integration/issues/1694) + + + +* Magento now adds tags correctly when you edit multiple images successively in the Media Gallery. _Fix submitted by Nazar Klovanych in pull request [29429](https://github.com/magento/magento2/pull/29429)_. [GitHub-1755](https://github.com/magento/adobe-stock-integration/issues/1755 + + + +* Magento now removes tags for Adobe Stock images after a merchant deletes the tags and saves the image details. Previously, tags were not deleted until the page was refreshed. _Fix submitted by Honeymay Louiese Ignacio in pull request [29400](https://github.com/magento/magento2/pull/29400)_. [GitHub-1703](https://github.com/magento/adobe-stock-integration/issues/1703) + +### Amazon Pay + +* Amazon Pay now checks whether a user is already logged in before rendering payment options. + +* Issues with multi-factor authentication and abandoned carts have been resolved. + +* Amazon Pay now correctly populates the `store name` in emails and other displayed locations.  If the **Store Name** field in Amazon Pay configuration is empty, the extension retrieves the store's default name (that is, the name you give your store in Magento Admin). + +* Localization/translation issues for Decline scenarios have been addressed. Displayed text is no longer always in English. + +### Bundle products + + + +* Magento no longer throws an exception when you try to create a product in a deployment in which Inventory is installed but the `Magento_InventoryBundleProduct` module is disabled. + + + +* Magento now correctly calculates offline refunds for orders that contain bundle products. + + + +* The mini cart now displays the correct prices for bundle products when tier prices are also assigned for simple products. [GitHub-22807](https://github.com/magento/magento2/issues/22807) + + + +* Merchants can now create a credit memo for bundle products that provides a refund without requiring the return of the product. Previously, Magento threw an error. _Fix submitted by Dzung Nguyen in pull request [27455](https://github.com/magento/magento2/pull/27455)_. [GitHub-23440](https://github.com/magento/magento2/issues/23440) + + + +* Magento no longer displays redundant validation messages when a shopper adds a bundle product to their cart without selecting a required option. _Fix submitted by Dzung Nguyen in pull request [27455](https://github.com/magento/magento2/pull/27455)_. [GitHub-23440](https://github.com/magento/magento2/issues/23440) + + + +_Fix submitted by Michał Derlatka in pull request [29256](https://github.com/magento/magento2/pull/29256)_. [GitHub-26110](https://github.com/magento/magento2/issues/26110) + +### Cache + + + +* Local cache storage is now retained for the period of time set in **Stores** > **Configuration** > **General** > **Web** > **Default Cookie Settings**. Previously, the expiry date of cookies was hard-coded to one day, which put it out of sync with this setting. As a result, welcome messages did not retain returning customer information for the expected duration. + + + +* The number of calls to page cache `config` has been reduced. _Fix submitted by Lukasz Bajsarowicz in pull request [28992](https://github.com/magento/magento2/pull/28992)_. [GitHub-29159](https://github.com/magento/magento2/issues/29159) + + + +* Varnish no longer throws a `Connection reset by peer` error when a large catalog is reindexed on schedule. _Fix submitted by Matthew O'Loughlin in pull request [26256](https://github.com/magento/magento2/pull/26256)_. [GitHub-8815](https://github.com/magento/magento2/issues/8815) + + + +* Full page cache is no longer cleared for unrelated products when a product has been edited in the Admin. [GitHub-25670](https://github.com/magento/magento2/issues/25670) + +### Cart and checkout + + + +* Direct SQL queries have been replaced by Data Provider, which has improved checkout performance. _Fix submitted by Lukasz Bajsarowicz in pull request [29376](https://github.com/magento/magento2/pull/29376)_. [GitHub-29453](https://github.com/magento/magento2/issues/29453) + + + +* The Products in the Comparison and the Recently Compared Products lists now work as expected. Previously, when the comparison list was expanded, Magento did not display products, even though the section indicated that the list contained products. + + + +* The **Delete** button on the **Add to Shopping Cart by SKU** section of a customer’s **Manage Shopping Cart** page now works as expected when multiple rows are selected. + + + +* Magento no longer throws an error when you try to order a product by SKU when the digits you enter match a valid SKU but the case of these digits differ. Previously, when you entered an SKU on **My Account** > **Order by SKU** that did not exactly match a valid SKU, Magento threw an error. + + + +* A customer’s shipping address is now selected by default at checkout when the address is located in the country identified on the Allow Countries list and that list includes only that country. Previously, Magento did not select the address as default and displayed this error message: `Please specify a regionId in shipping address`. + + + +* Merchants can now enable **Apply to Shipping Amount** in the Action tab of **Marketing** > **Cart Price Rules** > **Add New Rule** when **Fixed amount discount for whole cart** is applied. [GitHub-24422](https://github.com/magento/magento2/issues/24422) + + + +* Magento no longer throws an exception when a shopper tries to unset the persistence cookie after beginning checkout and then navigating to the storefront home page. Previously, when the shopper clicked the **Not you?** link on the home page, Magento threw this exception: `The shipping address is missing. Set the address and try again`. [GitHub-24218](https://github.com/magento/magento2/issues/24218) + + + +* Magento now displays an add-to-cart success message when a customer adds an out-of-stock product to their cart. Previously, the product was added, but Magento did not display a success message. + + + +* Custom address attributes are now included as expected in the form that displays for the payment step in the checkout workflow. + + + +* The **State/Province/Region** input box is now enabled as expected on **My account** > **Address Book** > **Add new address**. + + + +* Discounts are now applied as expected to shipping charges when **Apply to Shipping Amount** is enabled. _Fix submitted by Andrii Kalinich in pull request [28839](https://github.com/magento/magento2/pull/28839)_. [GitHub-26723](https://github.com/magento/magento2/issues/26723) + + + +* The code that supports closing the mini cart has been refactored to remove the `closeSidebar` function. The appropriate click binding has been added to the `[data-action="close"]` element. _Fix submitted by lumnn in pull request [28906](https://github.com/magento/magento2/pull/28906)_. [GitHub-29161](https://github.com/magento/magento2/issues/29161) + + + +* The new **Show "Clear Shopping Cart" button on the cart page** configuration setting provides control over displaying a **Clear Cart** button on the shopping cart view page. By default, this setting is disabled. _Fix submitted by Pavlo Sydorenko in pull request [27917](https://github.com/magento/magento2/pull/27917)_. [GitHub-28705](https://github.com/magento/magento2/issues/28705) + + + +* Validation has been added to the phone field in the checkout workflow. _Fix submitted by Oleh Usik in pull request [27537](https://github.com/magento/magento2/pull/27537)_. [GitHub-28800](https://github.com/magento/magento2/issues/28800) + + + +* Guest checkout is now disabled as expected when a cart contains downloadable products when the **Shareable** and **Disable Guest Checkout if Cart Contains Downloadable Items** settings are disabled. _Fix submitted by Rani Priya in pull request [23972](https://github.com/magento/magento2/pull/23972)_. [GitHub-23971](https://github.com/magento/magento2/issues/23971) + + + +* The success message that Magento displays when a shopper adds a product to their cart from the customer account sidebar now contains a link to the shopper’s shopping cart. _Fix submitted by Ajith in pull request [27977](https://github.com/magento/magento2/pull/27977)_. [GitHub-29097](https://github.com/magento/magento2/issues/29097) + + + +* Magento now selects an empty value by default for the prefix dropdown options menu on the checkout workflow. _Fix submitted by Vadim Malesh in pull request [28238](https://github.com/magento/magento2/pull/28238)_. [GitHub-18823](https://github.com/magento/magento2/issues/18823) + + + +* The pop-up message that Magento displays when you delete multiple items from a shopping cart now accurately describes the number and type of entities you have selected for deletion. _Fix submitted by Nazar Klovanych in pull request [29490](https://github.com/magento/magento2/pull/29490)_. [GitHub-1749](https://github.com/magento/adobe-stock-integration/issues/1749) + + + +* Magento now displays a customer registration form when a guest user completes checkout. + + + +* Custom customer address attributes fields are now displayed as expected in the storefront checkout workflow. + + + +* Magento now retrieves the current customer group for an active quote during checkout. Previously, Magento used the customer group that was active when the product was first added to the cart, and if that customer group was deleted before checkout, Magento threw an error. _Fix submitted by Konstantin in pull request [28902](https://github.com/magento/magento2/pull/28902)_. [GitHub-29327](https://github.com/magento/magento2/issues/29327) + +### Catalog + + + +* Magento now removes disabled products from a shopper’s cart before checkout. Previously, when a shopper added a product to their cart that was disabled before checkout completed, Magento removed the disabled product from the cart, but the product remained in the quote, and the shopper could not check out. [GitHub-26680](https://github.com/magento/magento2/issues/26680) + + + +* Magento now sorts bestselling products as expected. Previously, both product count and the pagination of sort results were incorrect. [GitHub-25955](https://github.com/magento/magento2/issues/25955) + + + +* Shoppers can now open a product’s detail page by clicking on the product name in the compare products sidebar. _Fix submitted by Eduard Chitoraga in pull request [27451](https://github.com/magento/magento2/pull/27451)_. [GitHub-21101](https://github.com/magento/magento2/issues/21101) + + + +* `children_count` values now remain positive when an administrator deletes categories. Previously, when an administrator deleted categories, the `children_count` for remaining categories was negative. _Fix submitted by Vitaliy Prokopov in pull request [28044](https://github.com/magento/magento2/pull/28044)_. [GitHub-27969](https://github.com/magento/magento2/issues/27969) + + + +* Magento now uses the default option (**Configuration** > **Web** > **Default Layouts** > **Default Product Layout**) that you have selected for the `page_layout` attribute when creating a new product. Previously, your selected default value was not applied. + + + +* You can now successfully perform mass actions on Inventory product stock. Previously, when you tried to perform a mass action on inventory product stock, Magento displayed a blank page. If you performed this action with Magento in developer mode, Magento threw this error: `Notice: Undefined offset: 32000 in /Users/kodithuw/sites/m23inventory/inventory/InventoryCatalogAdminUi/view/adminhtml/templates/catalog/product/edit/action/inventory.phtml on line 24`. + + + +* The total record count displayed when you click **Add Products** on the Products tab when adding products to a catalog category no longer changes based on product sort order. + + + +* The `{products(filter: {sku: {eq: "some sku"}}) {…}` query now returns values that have been converted into the expected currency. Previously, `price_tiers.final_price.value` displayed special prices in the base currency. _Fix submitted by Petkovski Marjan in pull request [28890](https://github.com/magento/magento2/pull/28890)_. [GitHub-26121](https://github.com/magento/magento2/issues/26121) + +### Cleanup + + + +* Corrected misalignment of the Admin Sales Order grid checkbox. _Fix submitted by Tu Nguyen in pull request [27642](https://github.com/magento/magento2/pull/27642)_. [GitHub-27633](https://github.com/magento/magento2/issues/27633) + + + +* Corrected a misspelling in the shipping address ID getter in the sales order address save handler. _Fix submitted by Konstantin in pull request [28810](https://github.com/magento/magento2/pull/28810)_. [GitHub-28982](https://github.com/magento/magento2/issues/28982) + + + +* Corrected the `getRegionNameExpresion` method name to `getRegionNameExpression`. _Fix submitted by Pierre Grimaud in pull request [28832](https://github.com/magento/magento2/pull/28832)_. [GitHub-28829](https://github.com/magento/magento2/issues/28829) + + + +* A redundant `init` method has been removed from `app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php` and `app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPriceType.php`. _Fix submitted by Oleh Usik in pull request [28650](https://github.com/magento/magento2/pull/28650)_. [GitHub-29009](https://github.com/magento/magento2/issues/29009) + + + +* `localStorage` polyfill has been moved from from `base` to `frontend`. _Fix submitted by Ihor Sviziev in pull request [28749](https://github.com/magento/magento2/pull/28749)_. [GitHub-28900](https://github.com/magento/magento2/issues/28900) + + + +* Updated the Magento Commerce logo and removed extraneous spaces from the main README file of the `magento/magento2` repository. _Fix submitted by Rafael Corr̻a Gomes in pull request [28891](https://github.com/magento/magento2/pull/28891)_. [GitHub-29056](https://github.com/magento/magento2/issues/29056) + + + +* The unnecessary `overflowed` class has been removed from the mini cart sidebar widget. _Fix submitted by lumnn in pull request [28963](https://github.com/magento/magento2/pull/28963)_. [GitHub-29160](https://github.com/magento/magento2/issues/29160) + + + +* An incorrect CSS selector in the Shipment page has been corrected. _Fix submitted by Tu Nguyen in pull request [28639](https://github.com/magento/magento2/pull/28639)_. [GitHub-29261](https://github.com/magento/magento2/issues/29261) + + + +* The `lib/internal/Magento/Framework/App/Request/Http.php` file has been simplified by optimizing logic and removing redundant variable assignments and over-usage of returns within a function. _Fix submitted by Chris Snedaker in pull request [28608](https://github.com/magento/magento2/pull/28608)_. [GitHub-29381](https://github.com/magento/magento2/issues/29381) + + + +* The `bin/magento module:status` command now accepts multiple module names as arguments. _Fix submitted by Chandru Rajendran in pull request [28250](https://github.com/magento/magento2/pull/28250)_. [GitHub-29344](https://github.com/magento/magento2/issues/29344) + + + +* Fixed a typo in the class description of `\Magento\Downloadable\Block\Sales\Order\Email\Items\Downloadable`. _Fix submitted by Benjamin Rosenberger in pull request [29451](https://github.com/magento/magento2/pull/29451)_. [GitHub-29470](https://github.com/magento/magento2/issues/29470) + + + +* The `TierPriceManagement` class has been refactored to remove redundant code. _Fix submitted by Lukasz Bajsarowicz in pull request [29202](https://github.com/magento/magento2/pull/29202)_. [GitHub-29477](https://github.com/magento/magento2/issues/29477) + + + +* `autoload.php` has been refactored to improve readability and return speed. _Fix submitted by Vitaliy Ryaboy in pull request [28923](https://github.com/magento/magento2/pull/28923)_. [GitHub-29527](https://github.com/magento/magento2/issues/29527) + +### CMS content + + + +* The Hierarchy tab for a selected default store view now displays the selected parent page as expected. + + + +* Magento no longer throws an error during store view creation when the new store view contains a CMS page with the same URL key as a page in a different store view. _Fix submitted by Vadim Malesh in pull request [28421](https://github.com/magento/magento2/pull/28421)_. [GitHub-28357](https://github.com/magento/magento2/issues/28357) + +### Configurable products + + + +* Pagination problems with the Configurable Product Edit Current Variations list have been corrected. + + + +* Magento no longer updates the Related Products price box whenever a shopper selects options for a configurable product. Previously, Magento updated the price box whenever a shopper selected an option for a configurable product. + + + +* Magento now displays the correct price for configurable products with customizable options on the Admin Create Order page. As expected, the displayed price is a sum of the child product's price and the custom option's price. Previously, Magento displayed only the custom option price. [GitHub-25766](https://github.com/magento/magento2/issues/25766) + + + +* The order summary now displays the correct discount amount when a cart price rule has been applied. Previously, the rule did not correctly round amounts when calculating shipping discounts. + + + +* Admin user accounts created from an admin account with a restricted scope can now create a configurable product with attributes as expected. Previously, Magento threw this error: `Notice: Undefined index: value_index in 23develop/app/code/Magento/ConfigurableProduct/Helper/Product/Options/Factory.php on line 101`. + + + +* Magento no longer throws a validation error when you use POST `/V1/products` to a configurable product with an `int` value of 0. Previously, Magento threw this error: `Product with id "%1" does not contain required attribute “%2”.”` _Fix submitted by Vadim Malesh in pull request [29001](https://github.com/magento/magento2/pull/29001)_. [GitHub-13210](https://github.com/magento/magento2/issues/13210) + + + +* The configuration options attribute of a parent product are no longer assigned to a new configurable product’s `size` attribute. _Fix submitted by Abel Truong in pull request [27339](https://github.com/magento/magento2/pull/27339)_. [GitHub-26449](https://github.com/magento/magento2/issues/26449) + +### Cookies + + + +* Magento now creates a maximum of one `mage-translation-file-version` and `mage-translation-storage` cookie per session. _Fix submitted by Ihor Sviziev in pull request [27364](https://github.com/magento/magento2/pull/27364)_. [GitHub-27355](https://github.com/magento/magento2/issues/27355) + +### cron + + + +* Message queue consumer configuration has been extended with new parameters that help control consumers and save server resources and that potentially decrease consumer queue CPU consumption: + + * `maxIdleTime` defines the maximum waiting time in seconds for a new message from the queue. + * `sleep` specifies time in seconds to sleep before checking if a new message is available in the queue. + * `onlySpawnWhenMessageAvailable` identifies whether a consumer should be spawned only when an available message exists in the related queue. This setting is enabled globally by default for all consumers but can be configured per consumer. + + + +* `cron` expressions such as  `3/10 * * * *` are now scheduled as expected. _Fix submitted by Anton Evers in pull request [28930](https://github.com/magento/magento2/pull/28930)_. [GitHub-29240](https://github.com/magento/magento2/issues/29240) + + + +*  `sales_clean_quotes` no longer loads all expired quotes at once. Previously, Magento failed with this fatal error because all expired quotes were loaded simultaneously: `PHP Fatal error: Allowed memory size of 2147483648 bytes exhausted (tried to allocate 20480 bytes) in /path/to/magento2/vendor/magento/framework/Model/AbstractModel.php on line 359`, + +### CSS + + + +* Magento no longer duplicates CSS when **Critical CSS** is enabled. _Fix submitted by Tu Nguyen in pull request [28480](https://github.com/magento/magento2/pull/28480)_. [GitHub-26498](https://github.com/magento/magento2/issues/26498) + + + +* The server-side LESS compiler now imports all remote CSS files as expected when you run `bin/magento setup:static-content:deploy -f`. Previously, Magento did not import the remote files and threw an error. [GitHub-25119](https://github.com/magento/magento2/issues/25119) + +### Customer + + + +* The region names in Admin customer addresses are now translated as expected. + + + +* The **State/Province** fields are now populated as expected on the Edit Address page (**My Account** > **Address book**). + + + +* Magento no longer throws an error when a customer clicks the **Submit** button multiple times on forms throughout the storefront for which invisible reCAPTCHA has been enabled. Previously, clicking this button multiple times resulted in an internal error similar to this: `Internal error: Make sure you are using reCaptcha V3 api keys`. + + + +* Saving a deleted customer from the Admin now generates an error message only. Previously, Magento displayed a blank page and generated a report that contains this string: `"0":"No such entity with customerId = 3","1":"#1 Magento\\Customer\\Model CustomerRegistry->retrieve() called at [app\/code\/Magento\/Customer\/Model\/ResourceModel\/CustomerRepository.php:340"`. + + + +* Magento now displays an error message as expected when an administrator tries to save an address for a customer whose account has just been deleted. Previously, Magento displayed a blank message box. + + + +* The labels for address fields in the checkout workflow and the address book have been edited for consistency. + + + +* Frontend labels now fall back to store labels if their values are not null. Previously, customer attributes used the default frontend labels. _Fix submitted by Toan Nguyen in pull request [27064](https://github.com/magento/magento2/pull/27064)_. [GitHub-27063](https://github.com/magento/magento2/issues/27063) + + + +* The `sortOrder`number of links in layout XML has been corrected. Previously, this order was reversed and used descending order. _Fix submitted by Tu Nguyen in pull request [27340](https://github.com/magento/magento2/pull/27340)_. [GitHub-27162](https://github.com/magento/magento2/issues/27162) + +### Directory + + + +* The format of the State/Province drop-down menu is now consistent across the Admin. + +### dotdigital + +* Order sync no long fails when an order contains product SKUs that no longer exist in the catalog. + +* Empty product categories are no longer included in web insight data. + +* Web behavior tracking now works for merchants with certain theme configurations. A new fallback selector addresses this. + +* The subscriber status data field no loner includes empty values when customer sync was run using cron. (App emulation addresses this issue.) + +* Address book mapping now works as expected when a dotdigital account is enabled at the default level but disabled for the main website. + +* Coupons are now generated (using the external dynamic content URL for coupon generation) for email addresses that contain plus ('+') signs. + +* Contacts are no longer resubscribed when their `last_subscribed_at` value is null. + +* Upgrade errors (dating from 4.5.2) that affected earlier Magento versions have been resolved. + +* A regression issue that was introduced in 4.5.3 that affected using a method to obtain the subscriber status when preparing subscriber export has been fixed. + +* The total figure for synced subscribers (presented in the logs and on screen) is now correctly calculated. + +### Downloadable + + + +* The My Downloadable Products area now displays links to purchased downloadable products that are part of a grouped product as expected. + + + +* Clicking on a downloadable product's **Sample** button from the Admin product page now downloads a sample as expected. Previously, when you clicked **Sample**, Magento displayed this error: `The product that was requested doesn't exist. Verify the product and try again`. + + + +* Shoppers can now download samples of downloadable products that are out-of-stock. Previously, when a shopper tried to download a sample, Magento opened a new tab, but did not display an informative message or begin the download process. _Fix submitted by Vadim Malesh in pull request [28898](https://github.com/magento/magento2/pull/28898)_. [GitHub-23638](https://github.com/magento/magento2/issues/23638) + + + +* The exception message that Magento displays when a shopper tries to set a shipping address for a downloadable product has been improved. _Fix submitted by Michał Derlatka in pull request [28904](https://github.com/magento/magento2/pull/28904)_. [GitHub-26107](https://github.com/magento/magento2/issues/26107) + + + +* A product’s `stock_item` data is updated and downloadable product links and samples are preserved as expected when you use a REST PUT call to update `stock_item` values. Previously, after the product update, the product no longer contained links to download content. _Fix submitted by Vadim Malesh in pull request [28799](https://github.com/magento/magento2/pull/28799)_. [GitHub-21811](https://github.com/magento/magento2/issues/21811) + + + +* Magento now displays a more informative message when a customer sets the shipping address for an order that contains only downloadable products. + +### Email + + + +* Magento now sends email notifications about order changes to the correct customer email if the customer email was changed after the order was created. + + + +* Order update emails that are sent to customers now include the correct order status. Previously, if an order status changed from `processing` to another state, the order email did not reflect the status change. + + + +* Magento no longer displays misleading messages about existing accounts during guest checkout. Previously, when a guest navigated to the checkout page, then navigated back to the shipping page, Magento displayed this error: `You already have an account with us. Sign in or continue as guest`. + + + +* Custom email templates now load the same elements as native default email templates. Previously, some elements were missing, including variable values. + + + +* Unnecessary CSS has been removed from the email Preview template. _Fix submitted by Tu Nguyen in pull request [27828](https://github.com/magento/magento2/pull/27828)_. [GitHub-27543](https://github.com/magento/magento2/issues/27543) + + + +* Text in the email template that duplicates text already displayed by the footer has been removed. _Fix submitted by Paweł Tylek in pull request [27356](https://github.com/magento/magento2/pull/27356)_. [GitHub-28433](https://github.com/magento/magento2/issues/28433) + + + +* Product alert emails are now sent from the store from which the alert is subscribed. Previously, this email was always sent from the default store. _Fix submitted by Maciej Pawłowski in pull request [26534](https://github.com/magento/magento2/pull/26534)_. [GitHub-28968](https://github.com/magento/magento2/issues/28968) + + + +* A duplicate `customer.name` variable has been removed from the email template. _Fix submitted by Paweł Tylek in pull request [29054](https://github.com/magento/magento2/pull/29054)_. [GitHub-29087](https://github.com/magento/magento2/issues/29087) + + + +* You can now create an email template that sends email with  `Content-Type: "text/plain”`. Previously, Magento ignored the content type specified in the template. _Fix submitted by twoonesixdigital in pull request [26474](https://github.com/magento/magento2/pull/26474)_. [GitHub-26471](https://github.com/magento/magento2/issues/26471) + +### Frameworks + + + +* The **Time of day to send data** field of the Admin **Stores** > **Configuration** > GENERAL > **Advanced Reporting** page is now rendered correctly. + + + +* Shoppers can now change the number of orders that are displayed per page when the Orders list spans multiple pages. Previously, Magento displayed the following message when the shopper navigated to the last page of orders and tried to change the number of orders displayed per page: `You have placed no orders`. This was a known issue for Magento 2.4.0. + + + +* You can now add products to a category when implementing Level 2 cache. + + + +* `X-Magento-Tags` headers no longer exceed the size permitted by the HTTP specification. Previously, category pages that contain many products returned an `X-Magento-Tag` header that resulted in a 503 error. + + + +* `sales_order_shipment_track_save_commit_after` is now triggered as expected when you used the REST API to create a shipment. + + + +* Magento now displays an informative error message when a `di compile` fails due to a nonexistent dependency. Previously, the message displayed did not identify the class in which the exception occurred. + + + +* Magento no longer throws the following fatal error when Redis uses all allowed memory: `report.CRITICAL: OOM command not allowed when used memory > 'maxmemory'.` + + + +* Shoppers can now add multiple products to their cart when the `Persistent` module is disabled. [GitHub-14486](https://github.com/magento/magento2/issues/14486) + +### General fixes + + + +* Sorting products on the Admin (**Stores** > **Attributes** > **Products**) now displays all products that meet your search criteria. Previously, Magento did not display records, and to sort the records, you had to navigate to the first page of search results. + + + +* Unnecessary quotation marks and escaping around a URL in `tracking.phtml` have been removed. + + + +* The `var/log/system.log` now displays a more accurate message when a user tries to access a non-existing resource file under the static directory and SCD OnDemand and production mode are enabled. Magento now logs a 404 error. Previously, Magento logged the same message that is logged when the error occurs in developer mode. + + + +* JavaScript minification now works correctly. The minification file resolver no longer leaks variables to global scope. Previously, `ctx`, `origNameToUrl`, and `baseUrl` variables under window were leaked. _Fix submitted by Mateusz Krzeszowiak in pull request [27622](https://github.com/magento/magento2/pull/27622)_. [GitHub-28110](https://github.com/magento/magento2/issues/28110) + + + +* When you debug an error that prevents object creation, Magento now prints as well as logs the original exception message. Previously, the message was only logged. _Fix submitted by Marvin Hinz in pull request [26572](https://github.com/magento/magento2/pull/26572)_. [GitHub-26550](https://github.com/magento/magento2/issues/26550) + + + +* Callback execution after database changes are committed has been improved. Previously, if one callback failed with an exception, all callbacks failed. _Fix submitted by Alok Patel in pull request [27134](https://github.com/magento/magento2/pull/27134)_. [GitHub-28167](https://github.com/magento/magento2/issues/28167) + + + +* Mixins for modules with no dependencies defined no longer throw this error: `TypeError: Cannot read property 'map' of null`. _Fix submitted by Mateusz Krzeszowiak in pull request [27690](https://github.com/magento/magento2/pull/27690)_. [GitHub-28340](https://github.com/magento/magento2/issues/28340) + + + +* Storage polyfill is now loaded and applied only when `localStorage` or `sessionStorage` are not available. _Fix submitted by Mateusz Krzeszowiak in pull request [27619](https://github.com/magento/magento2/pull/27619)_. [GitHub-28381](https://github.com/magento/magento2/issues/28381) + + + +* Multi-page storefront orders lists now behave as expected when a shopper changes the number of results displayed per page from the second or subsequent results page. Previously, Magento displayed this error when a shopper changed the number of search results displayed in the **My Account** > **My Orders** list: `You have placed no orders`. _Fix submitted by Vadim Malesh in pull request [28417](https://github.com/magento/magento2/pull/28417)_. [GitHub-28488](https://github.com/magento/magento2/issues/28488) + + + +* The deprecated `addWarning` method has been replaced with the `addWarningMessage` method in the Magento core security module. _Fix submitted by kishorekumarkesavan in pull request [28264](https://github.com/magento/magento2/pull/28264)_. [GitHub-28308](https://github.com/magento/magento2/issues/28308) + + + +* Code generated using the Magento command-line commands is now consistent with Magento requirements and coding standards. _Fix submitted by Lukasz Bajsarowicz in pull request [28351](https://github.com/magento/magento2/pull/28351)_. [GitHub-28376](https://github.com/magento/magento2/issues/28376) + + + +* Saving an attribute with `backend_type = static` no longer removes the content of the `frontend_class` field. _Fix submitted by jiten-patel in pull request [27369](https://github.com/magento/magento2/pull/27369)_. [GitHub-27051](https://github.com/magento/magento2/issues/27051) + + + +* Unnecessary code and `responsive.js` have been removed from files that are loaded by themes. _Fix submitted by Mateusz Krzeszowiak in pull request [27617](https://github.com/magento/magento2/pull/27617)_. [GitHub-28811](https://github.com/magento/magento2/issues/28811) + + + +* Validation has been added to the **Number of Symbols** field on the Admin CAPTCHA configuration page. _Fix submitted by Eden Duong in pull request [29199](https://github.com/magento/magento2/pull/29199)_. [GitHub-29198](https://github.com/magento/magento2/issues/29198) + + + +* The RSS feed now loads correctly. Previously, the feed did not load the first time, although it loaded as expected when the page was refreshed. _Fix submitted by Vadim Malesh in pull request [29455](https://github.com/magento/magento2/pull/29455)_. [GitHub-25211](https://github.com/magento/magento2/issues/25211) + + + +* An expired persistent session is now renewed as expected when the shopper logs back in. + + + +* Password lifetime as set in **Stores** > **Configuration** > **Advanced** > **Admin** is now honored. Previously, if you clicked **Forgot password?** when prompted to reset your password, you could bypass the password reset. + + + +* Coupon codes are now applied only to the specified product. Previously, Magento applied the coupon code to all products in the cart. [GitHub-28246](https://github.com/magento/magento2/issues/28246) + + + +* Cart expiry settings are no longer re-set when an inventory or price update occurs. Previously, when a cart was set to expire in 24 hours, and an inventory update or price update occurred, the indexers populated the `updated_at table`, which re-set the expiry time. + + + +* Magento no longer throws a fatal error when an administrator assigns a customer who has an active shopping cart to a customer group. + + + +* Selecting a toolbar option from **Developer tools** > **Network** on a product page when running the Chrome browser no longer initializes `toolbar.js` twice. _Fix submitted by Paweł Tylek in pull request [28838](https://github.com/magento/magento2/pull/28838)_. [GitHub-25934](https://github.com/magento/magento2/issues/25934) + + + +* Magento now adds an admin user’s ACL role ID to the product category tree cache ID. This will limit the category trees that an admin with limited scope can see as expected. _Fix submitted by quangdo-aligent in pull request [27429](https://github.com/magento/magento2/pull/27429)_. [GitHub-28306](https://github.com/magento/magento2/issues/28306) + +### GraphQL + + + +* Shoppers can select gift message options during checkout. GraphQL now covers gift message options for different types of cart items. See [`setGiftOptionsOnCart` mutation]({{page.baseurl}}/graphql/mutations/set-gift-options.html) and [`updateCartItems` mutation]({{page.baseurl}}/graphql/mutations/update-cart-items.html). _Fix submitted by Oleh Usik in pull requests [28519](https://github.com/magento/magento2/pull/28105), [27956](https://github.com/magento/magento2/pull/27956), [28072](https://github.com/magento/magento2/pull/28072), [28072](https://github.com/magento/magento2/pull/28072). [GitHub-28519](https://github.com/magento/magento2/issues/28519) + + + +* Customers and guests can write product reviews. Customers can also retrieve their product review histories. See [Create a product review]({{page.baseurl}}/graphql/mutations/create-product-review.html) and [productReviewRatingsMetadata query]({{page.baseurl}}/graphql/queries/product-review-ratings-metadata.html) for information on retrieving information about the reviews infrastructure. _Fix submitted by Eduard Chitoraga in pull request [27882](https://github.com/magento/magento2/pull/27882)_. [GitHub-28523](https://github.com/magento/magento2/issues/28523) + + + +* The [`addProductsToCart` mutation]({{page.baseurl}}/graphql/mutations/add-products-to-cart.html) allows you to add any type of product to the active cart. We recommend using this mutation instead of single-purpose mutations such as `addSimpleProductsToCart`. _Fix submitted by Yaroslav Rogoza in pull request [27914](https://github.com/magento/magento2/pull/27914)_. [GitHub-28524](https://github.com/magento/magento2/issues/28524) + + + +* The new `availableStores` query returns a list of configuration attributes for multiple stores available under the same website (based on the current store). It does not expose the list of websites. See [`availableStores` query]({{page.baseurl}}/graphql/queries/available-stores.html). _Fix submitted by Dmitriy Gallyamov in pull request [28794](https://github.com/magento/magento2/pull/28794)_. [GitHub-28569](https://github.com/magento/magento2/issues/28569) + + + +* GraphQL now uses only an authorization token to retrieve a type of user and its ID. Previously, GraphQL used an active customer's cookies to retrieve this information when the authorization token was empty. _Fix submitted by Alexander Taranovsky in pull request [27373](https://github.com/magento/magento2/pull/27373)_. [GitHub-28040](https://github.com/magento/magento2/issues/28040) + + + +* We have added the [`createCustomerV2`]({{page.baseurl}}/graphql/mutations/create-customer-v2.html) and [`updateCustomerV2`]({{page.baseurl}}/graphql/mutations/update-customer-v2.html) mutations to manage customer accounts. These new mutations require different input objects than the `createCustomer` and `updateCustomer` mutations. To change a customer's email address, use the new [`updateCustomerEmail`]({{page.baseurl}}/graphql/mutations/update-customer-email.html) mutation. _Fix submitted by Michał Derlatka in pull request [28888](https://github.com/magento/magento2/pull/28888)_. [GitHub-28570](https://github.com/magento/magento2/issues/28570) + + + +* The `updateCustomer` mutation no longer allows you to set an invalid `INT` value in the `gender` argument. _Fix submitted by Alexander Taranovsky in pull request [28487](https://github.com/magento/magento2/pull/28487)_. [GitHub-28481](https://github.com/magento/magento2/issues/28481) + + + +* You can use the `subscribeEmailToNewsletter` mutation to subscribe customers to a newsletter. See [`subscribeEmailToNewsletter` mutation]({{page.baseurl}}/graphql/mutations/subscribe-email-to-newsletter.html). _Fix submitted by Alexander Taranovsky in pull request [27586](https://github.com/magento/magento2/pull/27586)_. [GitHub-27337](https://github.com/magento/magento2/issues/27337) + + + +* Removed redundant logic in the `setShippingMethodsOnCart` mutation resolver. _Fix submitted by Alexander Taranovsky in pull request [27349](https://github.com/magento/magento2/pull/27349)_. [GitHub-28262](https://github.com/magento/magento2/issues/28262) + + + +* Added test coverage for the `Please provide Email of sender` error associated with the `sendEmailToFriend` mutation. _Fix submitted by Alexander Taranovsky in pull request [28034](https://github.com/magento/magento2/pull/28034)_. [GitHub-28138](https://github.com/magento/magento2/issues/28138) + + + +* The `products` query now returns product attribute option labels for the default store view as expected. Previously, this query returned the product attribute option labels that were set for the Admin. _Fix submitted by Dmitriy Gallyamov in pull request [28647](https://github.com/magento/magento2/pull/28647)_. [GitHub-28568](https://github.com/magento/magento2/issues/28568) + + + +* Custom attribute aggregations now return store-specific option values. _Fix submitted by Dmitriy Gallyamov in pull request [28647](https://github.com/magento/magento2/pull/28647)_. [GitHub-28572](https://github.com/magento/magento2/issues/28572) + + + +* Price intervals that are returned in a product aggregation can now be numeric only (no wildcards permitted). _Fix submitted by Dmitriy Gallyamov in pull request [28745](https://github.com/magento/magento2/pull/28745)_. [GitHub-28628](https://github.com/magento/magento2/issues/28628) + + + +* The `categoryList` query now returns the correct response when using fragments. _Fix submitted by Ulzii in pull request [28710](https://github.com/magento/magento2/pull/28710)_. [GitHub-28584](https://github.com/magento/magento2/issues/28584) + + + +* GraphQL product search now considers configured category permissions. Previously, product search ignored the **Enable** setting (**Stores** > **Configuration** > **Catalog** > **Catalog** > **Category Permissions**). _Fix submitted by Petkovski Marjan in pull request [28757](https://github.com/magento/magento2/pull/28757) and pull request 271 in private repo `partners-magento2ee`_. [GitHub-28563](https://github.com/magento/magento2/issues/28563 + + + +* You can now add a product to a cart using `addSimpleProductToCart` when other items in the cart are out-of-stock. Previously, Magento returned this error: `Some of the products are out of stock`. [GitHub-26683](https://github.com/magento/magento2/issues/26683) + +* The default GraphQL `Category` method now sorts by category position as expected. _Fix submitted by Derrik Nyomo in pull request [29301](https://github.com/magento/magento2/pull/29301)_. [GitHub-104](https://github.com/magento/catalog-storefront/issues/104) + +* Added support for wish lists in Magento Open Source. You can [add items]({{page.baseurl}}/graphql/mutations/add-products-to-wishlist.html) to, [update items]({{page.baseurl}}/graphql/mutations/update-products-in-wishlist.html) in, and [remove items]({{page.baseurl}}/graphql/mutations/remove-products-from-wishlist.html) from a wish list. _Fix submitted by Eduard Chitoraga in pull request [28205](https://github.com/magento/magento2/pull/28205)_. [GitHub-28551](https://github.com/magento/magento2/issues/28551) + +* We have added the [`createCustomerV2`]({{page.baseurl}}/graphql/mutations/create-customer-v2.html) and [`updateCustomerV2`]({{page.baseurl}}/graphql/mutations/update-customer-v2.html) mutations to manage customer accounts. These new mutations require different input objects than the `createCustomer` and `updateCustomer` mutations. To change a customer's email address, use the new [`updateCustomerEmail`]({{page.baseurl}}/graphql/mutations/update-customer-email.html) mutation. + +* Added GraphQL Vault support for the [Payflow Pro Vault]({{page.baseurl}}/graphql/payment-methods/payflow-pro-vault.html) payment method. _Fix submitted by Oleh Usik in pull request [28821](https://github.com/magento/magento2/pull/28821)_. [GitHub-28520](https://github.com/magento/magento2/issues/28520) + +* Updated the GraphQL [`storeConfig` query]({{page.baseurl}}/graphql/queries/store-config.html) to include new customer configuration settings. _Fix submitted by Oleh Usik in pull request [27876](https://github.com/magento/magento2/pull/27876)_. [GitHub-28521](https://github.com/magento/magento2/issues/28521) + +* Added the [`resetPassword` mutation]({{page.baseurl}}/graphql/mutations/reset-password.html). _Fix submitted by Oleh Usik in pull request [27876](https://github.com/magento/magento2/pull/27876)_. [GitHub-28521](https://github.com/magento/magento2/issues/28521) + +* Added the [`resetPassword` mutation]({{page.baseurl}}/graphql/mutations/reset-password.html). _Fix submitted by Oleh Usik in pull request [27876](https://github.com/magento/magento2/pull/27876)_. [GitHub-28521](https://github.com/magento/magento2/issues/28521) + +* Added the [`requestPasswordResetEmail` mutation]({{page.baseurl}}/graphql/mutations/request-password-reset-email.html), which triggers the password reset email for the provided email address. _Fix submitted by Oleh Usik in pull request [27876](https://github.com/magento/magento2/pull/27876)_. [GitHub-28521](https://github.com/magento/magento2/issues/28521) + +* Added or updated topics on Klarna GraphQL in [Klarna's payment method]({{page.baseurl}}/graphql/payment-methods/klarna.html) and[`createKlarnaPaymentsSession`]({{page.baseurl}}/graphql/mutations/create-klarna-payments-session.html) + +### Images + + + +* HTML markup for thumbnail images has been improved. _Fix submitted by Tu Nguyen in pull request [28642](https://github.com/magento/magento2/pull/28642)_. [GitHub-29468](https://github.com/magento/magento2/issues/29468) + +### Import/export + + + +* The `error_report.csv` file now downloads with content and is available inside the `var/import_history/` directory as expected. Previously, this file was not generated after import. + + + +* Importing a product by using a CSV file now generates an `error_report.csv` file as expected. Previously, Magento generated the file but removed it after the import completed. _Fix submitted by Vadim Malesh in pull request [28460](https://github.com/magento/magento2/pull/28460)_. [GitHub-28420](https://github.com/magento/magento2/issues/28420) + + + +* Removed redundant class imports throughout the code base. _Fix submitted by Oleh Usik in pull request [28696](https://github.com/magento/magento2/pull/28696)_. [GitHub-29012](https://github.com/magento/magento2/issues/29012) + + + +* Magento now successfully imports customer addresses that contain a region for a country that does not have defined regions. Previously, Magento threw this error: `Please enter a valid region`. + + + +* Magento now loads the correct entity attribute set when a merchant selects an entity type when scheduling a new export. + + + +* The position of products in the `catalog_category_product` table now updates as expected when an administrator creates a product in the Admin and assigns it to a category. Previously, the position of new products was always assigned a 0 value. + + + +* Customer data is now successfully exported from the Admin, and the export data grid displays customer data as expected. Previously, an error related to memory allocation occurred during export. + + + +* Imported CSV files now capture related product information as expected. Previously, related product information was not consistently uploaded the first time the CSV file was imported. + + + +* Removed unused construct parameters in `AdvancedPricing.php`. [GitHub-29531](https://github.com/magento/magento2/issues/29531) + +### Index + + + +* `Magento_CacheInvalidate` now handles large tag patterns correctly when doing a `PURGE`. `sendPurgeRequest` has been refactored to handle an array of tags instead of requiring the caller to use `implode()`. _Fix submitted by Matthew O'Loughlin in pull request [26256](https://github.com/magento/magento2/pull/26256)_. [GitHub-26255](https://github.com/magento/magento2/issues/26255) + + + +* Shared indexers now show a status of **valid** after you run `bin/magento indexer:status` after re-indexing. Previously, shared indexers had an **invalid** status after a full re-index. + +### Infrastructure + + + +* Problems loading catalog and product pages on deployments running PHP 7.4.9 no longer occur. Previously, Magento threw this error when you tried to load the catalog and product pages: `There has been an error processing your request. Exception printing is disabled by default for security reasons`. [GitHub-29502](https://github.com/magento/magento2/issues/29502) + + + +* All exceptions that occur when layouts are rendered in production mode are now logged in the exception log file (`var/report`). Previously, Magento logged these messages in the system log as critical issues. + + + +* Regular expressions now work properly for large pages as the result of an increase in `ipcre.backtrack_limi`t and `pcre.recursion_limit` to approximately 1000000. _Fix submitted by Mateusz Krzeszowiak in pull request [27270](https://github.com/magento/magento2/pull/27270)_. [GitHub-26026](https://github.com/magento/magento2/issues/26026) + + + +* Interceptor generation has been improved. `} else {` statements have been removed from interceptors, and `array_map` has replaced `foreach`. _Fix submitted by Lukasz Bajsarowicz in pull request [27902](https://github.com/magento/magento2/pull/27902)_. [GitHub-28383](https://github.com/magento/magento2/issues/28383) + + + +* Array creation is now consistent throughout the class (`app/code/Magento/Sales/Model/Order/Pdf/Items/Invoice/DefaultInvoice.php`). _Fix submitted by Nathan de Graaf in pull request [28515](https://github.com/magento/magento2/pull/28515)_. [GitHub-28795](https://github.com/magento/magento2/issues/28795) + + + +* Plugins have been migrated out of the Magento Framework to follow the Magento best practice of prohibiting plugins in the Framework namespace. _Fix submitted by Lukasz Bajsarowicz in pull request [27965](https://github.com/magento/magento2/pull/27965)_. [GitHub-27962](https://github.com/magento/magento2/issues/27962) + + + +* You can now use the new `UrlFilterApplier` component to apply filters on product,`cms_page`, and `cms_block` grids using the GET URL parameter. _Fix submitted by Gabriel da Gama in pull request [28932](https://github.com/magento/magento2/pull/28932)_. [GitHub-1501](https://github.com/magento/adobe-stock-integration/issues/1501) + + + +* Magento no longer throws an `Undefined class constant` error when an interceptor is generated. _Fix submitted by Vova Yatsyuk in pull request [28797](https://github.com/magento/magento2/pull/28797)_. [GitHub-28981](https://github.com/magento/magento2/issues/28981) + + + +* Form data now persists when Magento throws an integration exception when you save a integration using a name that is already in use. _Fix submitted by Aditya Yadav in pull request [26660](https://github.com/magento/magento2/pull/26660)_. [GitHub-28143](https://github.com/magento/magento2/issues/28143) + + + +* Magento no longer truncates `X-Forwarded-For` headers to 32 characters. _Fix submitted by Ihor Sviziev in pull request [27221](https://github.com/magento/magento2/pull/27221)_. [GitHub-28693](https://github.com/magento/magento2/issues/28693) + + + +* The logic that checks if a redirect is internal now works correctly in the Admin when using a custom Admin domain. Previously, problems with this logic resulted in many Admin redirects to the homepage of the default store. _Fix submitted by Vadim Malesh in pull request [29066](https://github.com/magento/magento2/pull/29066)_. [GitHub-28943](https://github.com/magento/magento2/issues/28943) + + + +* Problems with the `styles-old.less` file have been eliminated, and linting no longer identifies errors. _Fix submitted by Tu Nguyen in pull request [28895](https://github.com/magento/magento2/pull/28895)_. [GitHub-24004](https://github.com/magento/magento2/issues/24004) + + + +* `NonComposerComponentRegistration.php` has been refactored. _Fix submitted by Vitaliy Ryaboy in pull request [28975](https://github.com/magento/magento2/pull/28975)_. [GitHub-29308](https://github.com/magento/magento2/issues/29308) + + + +* `ResourceConnection.php` has been refactored to improve class readability. _Fix submitted by Lukasz Bajsarowicz in pull request [29341](https://github.com/magento/magento2/pull/29341)_. [GitHub-29389](https://github.com/magento/magento2/issues/29389) + + + +* The README file for the build-in web server has been updated to include all Elasticsearch parameters. _Fix submitted by Yevhenii Dumskyi in pull request [29300](https://github.com/magento/magento2/pull/29300)_. [GitHub-29299](https://github.com/magento/magento2/issues/29299) + + + +* The `Magento\CmsUrlRewrite\Plugin\Cms\Model\Store\View::aftersSave` plugin now returns a value as expected. Previously, this plugin did not return a value, and as a result, saving a store view resulted in an error. _Fix submitted by Pieter Hoste in pull request [29035](https://github.com/magento/magento2/pull/29035)_. [GitHub-29034](https://github.com/magento/magento2/issues/29034) + + + +* Added the following support for magic methods for `DataObject`: + + * new extension to support `get/set/has/uns` magic methods (with usage of `__call`) + * support for SessionManager, which forwards all calls to the DataObject container + * test coverage for extensions + * updated tests for Filtered Error check + * increased PHPStan check level from 0 to 1. _Fix submitted by Oleksandr Kravchuk in pull request [27905](https://github.com/magento/magento2/pull/27905)_. [GitHub-28303](https://github.com/magento/magento2/issues/28303) + + + +* `ScopeConfigInterface` can now be more than a string. The restriction of `magentoConfigFixture` to string only was the inadvertent result of a previous pull request and has been reverted. _Fix submitted by Kristof, Fooman in pull request [29305](https://github.com/magento/magento2/pull/29305)_. [GitHub-29345](https://github.com/magento/magento2/issues/29345) + + + +* The `convertConfigTimeToUtc` method no longer throws a fatal error due to sending incorrect parameters to the `Phrase` constructor. _Fix submitted by Kos Rafał in pull request [29483](https://github.com/magento/magento2/pull/29483)_. [GitHub-29525](https://github.com/magento/magento2/issues/29525) + + + +* Price filters now work as expected on grid data when `Magento\Backend\Block\Widget\Grid\Column\Filter\Price::getCondition` and `Magento\Backend\Block\Widget\Grid\Column\Filter\Price::getValue()` return an array with indexes that contain `from` or `to` string data. Previously, Magento threw this error: `Notice: A non well formed numeric value encountered in vendor/magento/module-backend/Block/Widget/Grid/Column/Filter/Price.php on line 197`. _Fix submitted by Nikita Sarychev in pull request [29214](https://github.com/magento/magento2/pull/29214)_. [GitHub-29213](https://github.com/magento/magento2/issues/29213) + + + +* Added an extension point to support adding HTML to the category page. This corrects a bug that was introduced by a previous pull request. _Fix submitted by iGerchak in pull request [29291](https://github.com/magento/magento2/pull/29291)_. [GitHub-29286](https://github.com/magento/magento2/issues/29286) + +### Layered navigation + + + +* The layered navigation sidebar now shows Boolean attributes with both options (**yes**/**no**) and matching product counts. Previously, layered navigation did not return a **no** option for Boolean attributes in deployments using Elasticsearch. + + + +* The swatch layered navigation filter is now consistent with standard filters used throughout Magento. _Fix submitted by Bartłomiej Szubert in pull request [28015](https://github.com/magento/magento2/pull/28015)_. [GitHub-28011](https://github.com/magento/magento2/issues/28011) + +### Logging + + + +* All broken reference errors are now logged when deployments are in developer mode only. Previously, one error was logged for deployments in production mode, too, which bloated error logs. _Fix submitted by Bartłomiej Szubert in pull request [28735](https://github.com/magento/magento2/pull/28735)_. [GitHub-26504](https://github.com/magento/magento2/issues/26504) + +### Media Gallery + + + +* The Media Gallery configuration UI (Admin **Stores** > **Configuration** > **Advanced** > **System** ) has been reorganized. _Fix submitted by Shankar Konar in pull request [29433](https://github.com/magento/magento2/pull/29433)_. [GitHub-28011](https://github.com/magento/adobe-stock-integration/issues/1738) + + + +* Added tests to cover the **Used In** links for an image in the Media gallery. _Fix submitted by Nazar Klovanych in pull request [29392](https://github.com/magento/magento2/pull/29392)_. [GitHub-1969](https://github.com/magento/adobe-stock-integration/issues/1693) + +### MFTF + + + +* The `AdminSubmitAdvancedInventoryFormActionGroup` , `AdminClickOnAdvancedInventoryLinkActionGroup`, and  `AdminSetStockStatusConfigActionGroup` action groups are now used within tests according to best practice. _Fix submitted by Oleh USIA in pull request [29386](https://github.com/magento/magento2/pull/29386)_. [GitHub-29420](https://github.com/magento/magento2/issues/29420) + + + +* `SearchProductGridByKeywordActionGroup` is now used for search in the product grid. _Fix submitted by Oleh Usik in pull request [29385](https://github.com/magento/magento2/pull/29385)_. [GitHub-29434](https://github.com/magento/magento2/issues/29434) + + + +* `AdminCategoriesClickDoneButtonOnPopupActionGroup` is now used to click **Done** on the Search Categories popup. _Fix submitted by Oleh Usik in pull request [28989](https://github.com/magento/magento2/pull/28989)_. [GitHub-29380](https://github.com/magento/magento2/issues/29380) + + + +* `LoginToStorefrontActionGroup` is now used to replace a sequence of actions that is used for store front customer login. _Fix submitted by Sathish Subramanian in pull request [28113](https://github.com/magento/magento2/pull/28113)_. [GitHub-28165](https://github.com/magento/magento2/issues/28165) + + + +* `AdminUpdateCustomURLRewritesPermanentTest` has been refactored to meet MFTF best practices. _Fix submitted by Kate Kyzyma in pull request [28361](https://github.com/magento/magento2/pull/28361)_. [GitHub-28393](https://github.com/magento/magento2/issues/28393) + + + +* Test names have been changed to meet MFTF conventions. _Fix submitted by Evgeny Levinsky in pull request [27839](https://github.com/magento/magento2/pull/27839)_. [GitHub-28305](https://github.com/magento/magento2/issues/28305) + +#### New action groups + + + +* `StorefrontCheckoutClickNextButtonActionGroup` _Fix submitted by Oleh Usik in pull request [29472](https://github.com/magento/magento2/pull/29472)_. [GitHub-29539](https://github.com/magento/magento2/issues/29539) + + + +* `AdminProductFormSaveActionGroup`_Fix submitted by Oleh Usik in pull request [29142](https://github.com/magento/magento2/pull/29142)_. [GitHub-29292](https://github.com/magento/magento2/issues/29292) + + + +* `AdminSaveCategoryActionGroup` _Fix submitted by Oleh Usik in pull request [28993](https://github.com/magento/magento2/pull/28993)_. [GitHub-29388](https://github.com/magento/magento2/issues/29388) + + + +* `AdminProductGridSectionClickFirstRowActionGroup` _Fix submitted by Oleh Usik in pull request [29000](https://github.com/magento/magento2/pull/29000)_. [GitHub-29295](https://github.com/magento/magento2/issues/29295) + + + +* `AdminProductFormCategoryExistInCategoryListActionGroup` and `AdminProductFormCategoryNotExistInCategoryListActionGroup` _Fix submitted by Alexander Steshuk in pull request [28287](https://github.com/magento/magento2/pull/28287)_. [GitHub-28392](https://github.com/magento/magento2/issues/28392) + + + +* `AdminExpandCategoryTreeActionGroup` _Fix submitted by Oleh Usik in pull request [29133](https://github.com/magento/magento2/pull/29133)_. [GitHub-29289](https://github.com/magento/magento2/issues/29289) + + + +* `AdminTaxRateGridOpenPageActionGroup` _Fix submitted by Oleh Usik in pull request [29007](https://github.com/magento/magento2/pull/29007)_. [GitHub-29281](https://github.com/magento/magento2/issues/29281) + + + +* `AdminNavigateNewCustomerActionGroup` _Fix submitted by Oleh Usik in pull request [29134](https://github.com/magento/magento2/pull/29134)_. [GitHub-29287](https://github.com/magento/magento2/issues/29287) + +#### New tests + + + +* Added test for deleting a CMS page as an Admin user. _Fix submitted by Dmitry Tsymbal in pull request [28112](https://github.com/magento/magento2/pull/28112)_. [GitHub-28202](https://github.com/magento/magento2/issues/28202) + +* Added the `StorefrontShareCustomerWishlistActionGroup` test for customer wish list sharing with invalid email addresses. The existing test for wish list sharing (`StorefrontShareWishlistEntityTest`) has been refactored. `StorefrontCustomerShareWishlistActionGroup` has been deprecated. + + + +* Added a test to check for the implementation of the **Only X left Threshold** configuration setting. _Fix submitted by Oleh Usik in pull request [27549](https://github.com/magento/magento2/pull/27549)_. [GitHub-28755](https://github.com/magento/magento2/issues/28755) + +### Newsletter + + + +* Exporting the Newsletter Subscribers list using the `EXCEL XML` option now results in the export of all rows as expected. Previously, exported data included only the page pagination value, not all rows. + + + +* Newsletter subscription emails now use the same HTML tags as other newsletter-related emails. _Fix submitted by Paweł Tylek in pull request [27357](https://github.com/magento/magento2/pull/27357)_. [GitHub-28165](https://github.com/magento/magento2/issues/28165) + + + +* Added a test for deleting a newsletter subscriber as an Admin user. _Fix submitted by Dmitry Tsymbal in pull request [28972](https://github.com/magento/magento2/pull/28972)_. [GitHub-29032](https://github.com/magento/magento2/issues/29032) + + + +* Added tests for newsletter subscription for guests with a disallowed option in config statements. This test replaces deprecated `VerifyRegistredLinkDisplayedForGuestSubscriptionNoTest` and `StorefrontCreateNewSubscriberActionGroup`. _Fix submitted by Dmitry Tsymbal in pull request [28872](https://github.com/magento/magento2/pull/28872)_. [GitHub-29039](https://github.com/magento/magento2/issues/29039) + +### Orders + + + +* The `GetAssetIdByContentFieldInterface` and its implementation on `MediaContent` modules now permits Adobe Stock Integration to extend `MediaGallery` filter functionality. _Fix submitted by Gabriel da Gama in pull request [29058](https://github.com/magento/magento2/pull/29058)_. [GitHub-1464](https://github.com/magento/magento2/issues/1464) + + + +* The `CustomerAddressId` values for a newly created customer are now validated in quotes. _Fix submitted by Andrii Kalinich in pull request [29139](https://github.com/magento/magento2/pull/29139)_. [GitHub-28793](https://github.com/magento/magento2/issues/28793) + + + +* The order status for a credit memo with zero total is now `Closed`. Previously, Magento reported its order status as `Complete`. _Fix submitted by Andrii Kalinich in pull request [29023](https://github.com/magento/magento2/pull/29023)_. [GitHub-22762](https://github.com/magento/magento2/issues/22762) + +### Payment methods + + + +* Magento now displays a message that prompts you to enter mandatory credit card data when you click **Submit** for an Admin order without entering valid payment information. Previously, the Braintree card validator did not throw an error when payment input fields were invalid and the page became inactive. + + + +* You can now change the shipping method for an order you create from the Admin for a customer whose account has a stored credit card (Braintree). Previously, when you selected a different shipping method, the stored card was not selected, and Magento did not place the order. + +#### PayPal + + + +* The Order Review page of the checkout workflow now displays the correct shipping amount for PayPal through Braintree orders for which the shipping method has been changed during checkout. Previously, when a customer changed the shipping method on the PayPal Order Review page of the checkout workflow, Magento did not update the order total with the correct method. + + + +* Merchants can now successfully cancel orders that were authorized using PayPal. Previously, Magento did not cancel the order and displayed this error: `Declined: 10601-Authorization has expired`. + + + +* Magento no longer empties your cart when you cancel an order by closing the PayPal payment popup window after first completing another order. + +### Performance + +* Three new configuration settings support a decrease in consumer queue CPU consumption. These optional parameters provide increased control over consumers and save server resources. See [Configure message queues]({{page.baseurl}}/extension-dev-guide/message-queues/config-mq.html) for a description of the `maxIdleTime`, `sleep`, and `onlySpawnWhenMessageAvailable` parameters. + + + +* Plugin list configuration is now generated during the execution of the `di:compile` command. This configuration information is written to generated metadata folders based on scope. Previously, this information was stored in cache. Resulting performance improvements include: + + * Network cache size has decreased + * Execution time for many scenarios has been improved. + + + +* Magento now loads the appropriate slider widget on demand, which has improved page loading. The touch slider widget customization has been moved to a separate file so it can be loaded only on compatible devices. The appropriate slider widget type is now loaded only when range binding is actually used on the page. _Fix submitted by Mateusz Krzeszowiak in pull request [27616](https://github.com/magento/magento2/pull/27616)_. [GitHub-28807](https://github.com/magento/magento2/issues/28807) + + + +* The performance of checkout with multiple simultaneous orders has been improved. + + + +* Deadlocks no longer occur when the import process executes a bulk insert and the re-index process simultaneously executes a large insert from select. Previously, Magento displayed this error: `PDOException: SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock`. [GitHub-8933](https://github.com/magento/magento2/issues/8933) + +### Reviews + + + +* A unique key for `entity_pk_value-entity_type-store_id` has been added to the `review_entity_summary` table, which prevents the creation of duplicate rows for the same product ID (`entity_pk_value`). Previously, this lack of unique key resulted in duplicate rows for the same product ID and SQL errors. + +### Sales + + + +* Magento no longer assigns a status of `Complete` after invoicing an order that requires zero payment. + + + +* The New Shipment email generated by the REST API now contains the same shipping and customer information as shipments that are created manually from the Admin. Previously, this email did not contain the customer name, tracking information, products ordered, and other order information. + + + +* Guest user names are now visible as expected in invoice- and shipment-related emails when the emails are loaded or customized from the Admin. + + + +* The PDF invoice is now translated into the language of the store view where the order has been placed. Previously, the PDF invoice was translated in the language of the Admin. + + + +* You can now issue a refund as expected from the credit memo page. [GitHub-29014](https://github.com/magento/magento2/issues/29014) + + + +* Localised region names that are displayed on the storefront Order page are now correctly translated. Previously, the region name was not based on the specified locale unless it was edited in the Admin. + + + +* Shipments created through the POST `/rest/V1/shipment` endpoint now update orders properly. Previously, Magento created a shipment, but shipment status remained in the processing state. + + + +* Credit memos now display the payment method that is derived from the scope of the store in which the order was made. Previously, credit memos displayed the name as defined the default store scope. _Fix submitted by Ledian Hymetllari in pull request [27582](https://github.com/magento/magento2/pull/27582)_. [GitHub-27570](https://github.com/magento/magento2/issues/27570) + +### Search + + + +* You can now search for products by attribute from the Admin Customer view using QuickSearch. Previously, an exception occurred on the catalog search result page. + + + +* Magento now displays configurable products on the category page as expected after you add a product attribute. + + + +* Elasticsearch results now include the correct values for each store view’s attribute options. If a `Dropdown` or `Multiple Select` attribute has a different option value in the non-default store view than in the default store view, Elasticsearch now indexes that value or returns the product with that value in the results. Previously, Elasticsearch did not index that value or return the product with that value in the results. + + + +* Searching by SKU now works as expected in advanced search with Elasticsearch. Previously, when you tried to search by SKU, Magento displayed this error message: `We can't find any items matching these search criteria. Modify your search`. + + + +* Advanced search no longer lets shoppers filter on negative prices. _Fix submitted by Rohan Hapani in pull request [27359](https://github.com/magento/magento2/pull/27359)_. [GitHub-27358](https://github.com/magento/magento2/issues/27358) + + + +* Scope values are now reset as expected on the New Synonym Group form. _Fix submitted by Sathish Subramanian in pull request [29206](https://github.com/magento/magento2/pull/29206)_. [GitHub-28947](https://github.com/magento/magento2/issues/28947) + +### Shipping + + + +* Magento now calculates shipping table rates correctly after upgrade. Previously, shipping table rates were calculated based on net price, which excluded VAT. + + + +* Magento now displays shipping rates in the correct currency in the checkout workflow for orders specifying FedEx as the shipping method. + + + +* Multi-page PDFs of shipping labels for orders shipped by UPS now display the correct count. + + + +* Problems with the JavaScript components of the Create Packages page have been resolved. Previously, Magento did not display the **Create Shipping Label** checkbox on this page, and you could not create a shipping label for an existing order. + +### Sitemap + + + +* The sitemap in `robots.txt` is now store-specific. _Fix submitted by Vadim Malesh in pull request [29331](https://github.com/magento/magento2/pull/29331)_. [GitHub-28901](https://github.com/magento/magento2/issues/28901) + + + +* Encoded values are now correctly escaped in the `sitemap.xml` file. Previously, when you included encoded characters in a product name or image title, the generated sitemap was invalid. + +### Store + + + +* Deleting a previously created store view no longer results in an error in deployments with a split database configuration. Previously, Magento threw an exception. + + + +* You can now export `config.php` and default website code from one website to install and configure Magento on a second website in a multi website deployment. Previously, the default store and view disappeared after the export, and errors occurred on the storefront. + +### Swagger + + + +* You can now generate a customer token with Swagger. Previously, Swagger did not generate a response code when valid customer access information was entered, and Magento displayed this error: `The account sign-in was incorrect or your account is disabled temporarily. Please wait and try again later`. _Fix submitted by Vadim Malesh in pull request [28822](https://github.com/magento/magento2/pull/28822)_. [GitHub-27098](https://github.com/magento/magento2/issues/27098) + +### Swatches + + + +* Configurable products with swatches now show tier pricing when a shopper clicks **Edit** in the cart. Previously, Magento did not display tier prices in the cart before checkout. _Fix submitted by Sathish Subramanian in pull request [29137](https://github.com/magento/magento2/pull/29137)_. [GitHub-28270](https://github.com/magento/magento2/issues/28270) + + + +* Magento now displays tier prices as expected for configurable product variations. + +### Tax + + + +* Magento no longer displays a fixed product tax attribute on the storefront for a product after a merchant has unassigned it from the product’s attribute set. + +### Test + + + +* PHPUnit 9 errors have been fixed in unit tests. _Fix submitted by Anton Evers in pull request [29244](https://github.com/magento/magento2/pull/29244)_. [GitHub-29329](https://github.com/magento/magento2/issues/29329) + + + +* Added unit tests for approving a purchase order that was made with a discount that has since expired will place an order at full amount and not update the purchase order total. _Fix submitted by Joan He in pull request [18](https://github.com/magento/partners-magento2-infrastructure/pull/18)_. [GitHub-204](https://github.com/magento/partners-magento2b2b/issues/204) + + + +* `SynchronizeFilesInterface` is now covered by integration tests. _Fix submitted by jmonteros422 in pull request [29493](https://github.com/magento/magento2/pull/29493)_. [GitHub-1742](https://github.com/magento/magento2/issues/1742) + + + +* A function has been added to `\Magento\TestFramework\TestCase\WebapiAbstract` that enables the comparison of large nested arrays of expected and actual outcomes in tests and permits testers to ignore irrelevant keys in the actual outcome. _Fix submitted by Jekabs in pull request [29458](https://github.com/magento/magento2/pull/29458)_. [GitHub-29498](https://github.com/magento/magento2/issues/29498) + + + +* Corrected the inversion of expected value with actual value in `app/code/Magento/Newsletter/Test/Unit/Model/SubscriptionManagerTest.php`. _Fix submitted by Lukasz Bajsarowicz in pull request [29271](https://github.com/magento/magento2/pull/29271)_. [GitHub-29283](https://github.com/magento/magento2/issues/29283) + + + +* Issues with the serialization and unserialization of static properties when running consecutive tests have been resolved. _Fix submitted by Pavel Bystritsky in pull request [26175](https://github.com/magento/magento2/pull/26175)_. [GitHub-28319](https://github.com/magento/magento2/issues/28319), [GitHub-29313](https://github.com/magento/magento2/issues/29313) + + + +* Using `ObjectManager` for instantiating classes during test has been replaced with the new keyword in unit tests. _Fix submitted by Lukasz Bajsarowicz in pull request [29272](https://github.com/magento/magento2/pull/29272)_. [GitHub-29346](https://github.com/magento/magento2/issues/29346) + + + +* Test coverage has been added for these cases of the `updateCustomer` mutation: invalid date of birth, invalid email address, and empty customer last name. _Fix submitted by Alexander Taranovsky in pull request [28304](https://github.com/magento/magento2/pull/28304)_. [GitHub-28394](https://github.com/magento/magento2/issues/28394 + + + +* The `ApiFunctional TestFramework` GraphQL client now parses headers correctly. [GitHub-26425](https://github.com/magento/magento2/issues/26425) + +### Theme + + + +* Themes that are added in User Agent Rules are now affected as expected when you run `bin/magento catalog:images:resize`. Previously, only themes that were assigned to stores were affected when `bin/magento catalog:images:resize` was run. + +### Translation and locales + + + +* Magento no longer throws an error when an administrator changes the **Date** field during Admin product creation or save when the Admin locale is Chinese or Japanese. [GitHub-24696](https://github.com/magento/magento2/issues/24696) + + + +* Magento now checks area (frontend or `adminhtml`) before rendering inline translation markup. Previously, making an API call to `POST /V1/integration/admin/token` with bad credentials while inline translation was enabled results in the inclusion of inline translation markup around the error message in the API response. _Fix submitted by Zach Nanninga in pull request [28856](https://github.com/magento/magento2/pull/28856)_. [GitHub-28656](https://github.com/magento/magento2/issues/28656) + + + +* Bulgarian regions have been added to the `directory_country_region` table. _Fix submitted by Nikola Lardev in pull request [27957](https://github.com/magento/magento2/pull/27957)_. [GitHub-28215](https://github.com/magento/magento2/issues/28215) + + + +* The titles and buttons on the Admin **Customers** > **Add New Address** and **Edit Product** > **Advanced Inventory** modals can now be translated. _Fix submitted by Sathish Subramanian in pull request [28174](https://github.com/magento/magento2/pull/28174)_. [GitHub-28201](https://github.com/magento/magento2/issues/28201) + + + +* The term FPT can now be translated on Admin **Stores** > **Configuration** > **Sales** > **Tax** > **Fixed Product Taxes**. _Fix submitted by Vadim Malesh in pull request [28108](https://github.com/magento/magento2/pull/28108)_. [GitHub-5477](https://github.com/magento/magento2/issues/5477) + + + +* The **Ship here** button label on the checkout workflow shipping address modal has been changed to match the camel case used for other buttons. This case now matches the case that is used in the translation files. Previously, because of the mismatch in case, this label was not translated. _Fix submitted by WK in pull request [28547](https://github.com/magento/magento2/pull/28547)_. [GitHub-28685](https://github.com/magento/magento2/issues/28685) + +### UI + + + +* The privacy and cookie policy link in the page footer is now displayed as an active link when the Privacy and Cookie Policy page is displayed. _Fix submitted by Sathish Subramanian in pull request [28004](https://github.com/magento/magento2/pull/28004)_. [GitHub-27985](https://github.com/magento/magento2/issues/27985) + + + +* Fixed misalignment of the cursor in the Invoice Comments text area of the invoice associated with an order you have selected from Admin **Sales** > **Orders**. + + + +* The Create New Order page now displays **Add Products By SKU** and **Add Products** buttons as expected. + + + +* Magento now displays the Edit Review page properly when a product rating is available for the selected product. + + + +* Magento now correctly displays the Admin customer edit page on an iPhone running Safari. + + + +* Corrected unnecessary scrolling on the Create New Order page. + + + +* Directly clicking on the **Export Tax Rates** button of the Add New Tax Rule page (**Stores** > **Tax Rules**) now downloads the `tax_rates.csv` file as expected. Previously, merchants had to click on the edge of the **Export Tax Rates** button. This was a known issue in Magento 2.4.0. + + + +* The **Add selections to my cart** button on the bottom of the shopping cart now works as expected. This was a known issue in Magento 2.4.0. + + + +* The **Refresh** button of the **Recently Viewed Products** section of the Customer's Activities page now works as expected. Previously, when you clicked **Refresh**, the product list was not refreshed, and the page scrolled. + + + +* Magento now correctly displays the calendar icon used for selecting a customer’s date of birth on the Conditions tab of **Customers** > **Segments** > **Add Segment**. + + + +* The checkout summary section of the checkout workflow no longer flickers when a shopper scrolls through this page on Internet Explorer 11.x. + + + +* Magento now correctly displays the Order by SKU widget on the storefront Category page. Previously, the HTML code for this widget was not rendered, and Magento did not display the **Load a list of SKUs** link. + + + +* UI components that have been disabled using `this.disabled(true)` no longer appear on the storefront. [GitHub-29098](https://github.com/magento/magento2/issues/29098) + + + +* Magento now displays the recently viewed products widget properly in mobile view. _Fix submitted by Tu Nguyen in pull request [27572](https://github.com/magento/magento2/pull/27572)_. [GitHub-27058](https://github.com/magento/magento2/issues/27058) + + + +* Changing the position of a product from the Admin is now reflected in the product position on the storefront. _Fix submitted by Oleg Aleksin in pull request [28150](https://github.com/magento/magento2/pull/28150)_. [GitHub-28149](https://github.com/magento/magento2/issues/28149) + + + +* The login form style are now consistent with the style on other forms in the Blank theme. Unnecessary styles that set the width for container control wrap input fields have been removed. _Fix submitted by Tu Nguyen in pull request [28084](https://github.com/magento/magento2/pull/28084)_. [GitHub-28059](https://github.com/magento/magento2/issues/28059) + + + +* The **OK** button on the mini cart delete product confirmation pop-up now behaves as expected. _Fix submitted by Tu Nguyen in pull request [28083](https://github.com/magento/magento2/pull/28083)_. [GitHub-27095](https://github.com/magento/magento2/issues/27095) + + + +* Product gallery elements no longer blink during page load. _Fix submitted by Mateusz Krzeszowiak in pull request [27871](https://github.com/magento/magento2/pull/27871)_. [GitHub-28339](https://github.com/magento/magento2/issues/28339) + + + +* The CSS class that controls field width is now applied as expected for the Start Time element throughout the Admin. _Fix submitted by Shankar Konar in pull request [29511](https://github.com/magento/magento2/pull/29511)_. [GitHub-29496](https://github.com/magento/magento2/issues/29496) + + + +* The Terms and Conditions text label can now display longer text strings properly. _Fix submitted by Bartłomiej Szubert in pull request [29413](https://github.com/magento/magento2/pull/29413)_. [GitHub-24060](https://github.com/magento/magento2/issues/24060) + + + +* The title of the order failure page has been rewritten for accuracy. Previously, when a shopper canceled an order, Magento displayed a page with this title: `We received your order!`. _Fix submitted by Angelo Romano in pull request [29410](https://github.com/magento/magento2/pull/29410)_. [GitHub-29416](https://github.com/magento/magento2/issues/29416) + + + +* The total number of canceled items on the canceled order view page is now correctly identified on the canceled order view page. Previously, this field was labeled **Total Due**. _Fix submitted by Madhu Rajawat in pull request [27516](https://github.com/magento/magento2/pull/27516)_. [GitHub-26191](https://github.com/magento/magento2/issues/26191) + + + +* The toggle button on the create configurable product page now works as expected. _Fix submitted by Tu Nguyen in pull request [28032](https://github.com/magento/magento2/pull/28032)_. [GitHub-22702](https://github.com/magento/magento2/issues/22702) + + + +* The advanced attribute properties block icon on the Advanced Attribute Properties page now behaves as expected. _Fix submitted by Tu Nguyen in pull request [28032](https://github.com/magento/magento2/pull/28032)_. [GitHub-26022](https://github.com/magento/magento2/issues/26022) + + + +* The Admin section of the system configuration page now expands to display required fields as expected when you try to save configuration settings for a new module. _Fix submitted by Bartłomiej Szubert in pull request [28285](https://github.com/magento/magento2/pull/28285)_. [GitHub-26427](https://github.com/magento/magento2/issues/26427) + + + +* Corrected behavior of the magnifier when mode is set to `inside`. _Fix submitted by Sean van Zuidam in pull request [29077](https://github.com/magento/magento2/pull/29077)_. [GitHub-29076](https://github.com/magento/magento2/issues/29076) + + + +* Corrected the distractingly long input field width that resulted when a shopper entered an invalid email address in the subscribe field of the page footer. _Fix submitted by Dipesh Rangani in pull request [27106](https://github.com/magento/magento2/pull/27106)_. [GitHub-27099](https://github.com/magento/magento2/issues/27099) + + + +* An `Uncaught ReferenceError` error no longer appears in the dev console when you add a new tag and move the mouse cursor over it. _Fix submitted by Nazar Klovanych in pull request [29392](https://github.com/magento/magento2/pull/29392)_. [GitHub-1700](https://github.com/magento/magento2/issues/1700) + +### URL rewrites + + + +* Moving a store view to a different website no longer resets URLs. Previously, Magento incorrectly regenerated CMS and product URL rewrites. + + + +* Magento now preserves existing catalog URL rewrites as expected when a store view is assigned to a different store. Previously, Magento deleted the store-specific URL rewrites. + +### Varnish + + + +* Restarting Varnish no longer results in 503 errors. _Fix submitted by Ihor Sviziev in pull request [28137](https://github.com/magento/magento2/pull/28137)_. [GitHub-24353](https://github.com/magento/magento2/issues/24353) + +### Vault + + + +* Magento no longer saves credit card numbers when the **Save for later use** checkbox on the payment section of the checkout workflow is not selected. + +### Web API framework + + + +* Merchants with multiple websites can now use the REST API to create and update products while preserving image and image-role inheritance. Previously, when a merchant used the REST API to create and update products, and a product was updated for store view, the default image roles were loaded and saved for that store view. As a result, the store-view image roles stopped inheriting from the default scope after update. + + + +* An unscoped integration user account can now access a resource through the REST API when resource permissions allow access. + + + +* Search criteria filters now work as expected for product attributes that are used during the creation of a configurable product. [GitHub-29126](https://github.com/magento/magento2/issues/29126) + + + +* Customer group ID is now validated for POST `/rest/V1/customers` requests. Previously, Magento did not display an error message when you used an invalid `group_id` in these requests. _Fix submitted by Vadim Malesh in pull request [28903](https://github.com/magento/magento2/pull/28903)_. [GitHub-28064](https://github.com/magento/magento2/issues/28064) + + + +* PHP sessions are not created by default for anonymous REST calls. Previously, sessions were started even when unnecessary. _Fix submitted by Maciej Pawłowski in pull request [26032](https://github.com/magento/magento2/pull/26032)_. [GitHub-7213](https://github.com/magento/magento2/issues/7213) + + + +* Using various REST endpoints to update orders that contain custom option no longer deletes the custom option information. Previously, values in `info_buyRequest` were deleted. _Fix submitted by Vadim Malesh in pull request [28483](https://github.com/magento/magento2/pull/28483)_. [GitHub-22431](https://github.com/magento/magento2/issues/22431) + + + +* Using GET `V1/customers/me` now honors **Share Customer Accounts** setting (Admin **Stores** > **Configuration** > **Customers** > **Customer Configuration** > **Account Sharing Options**) when retrieving user information. _Fix submitted by Pavel Bystritsky in pull request [28213](https://github.com/magento/magento2/pull/28213)_. [GitHub-26089](https://github.com/magento/magento2/issues/26089) + + + +* Address-related extension attributes can be set as data arrays. Previously, Magento threw an error when a POST request that contained  `extension_attributes` was sent to `estimate-shipping-methods`. This bug, which was introduced by a previous commit, affected any extension attribute set on `Magento\Quote\Api\Data\AddressInterface` that were not objects. _Fix submitted by Alexander Menk in pull request [27338](https://github.com/magento/magento2/pull/27338)_. [GitHub-26682](https://github.com/magento/magento2/issues/26682) + + + +* You can now specify a single field when updating a customer with the PUT `V1/customers/:id` endpoint. Previously, the endpoint required you to specify the customer email and other fields that are required to create a customer. _Fix submitted by Vadim Malesh in pull request [28332](https://github.com/magento/magento2/pull/28332)_. [GitHub-21237](https://github.com/magento/magento2/issues/21237) + +### Wish list + + + +* Customers can now change the quantity of a product in a wish list from the wish list itself. Previously, Magento did not update the product quantity and did not display a message. + + + +* Customers can now change the quantity of a grouped product in a wish list from the wish list itself. Previously, Magento did not update the product quantity or display a message. + + + +* Polyfills for `Map`, `WeakMap`, `FormData`, and `MutationObserver` are now loaded only as needed. _Fix submitted by Dmitry Tsymbal in pull request [28330](https://github.com/magento/magento2/pull/28330)_. [GitHub-28377](https://github.com/magento/magento2/issues/28377) + + + +* The wish list update process now supports updating a wish list item and its description simultaneously. _Fix submitted by Eduard Chitoraga in pull request [28222](https://github.com/magento/magento2/pull/28222)_. [GitHub-28261](https://github.com/magento/magento2/issues/28261) + + + +* Added a test for sharing a customer's wish list with more than the allowed number of emails. _Fix submitted by Dmitry Tsymbal in pull request [28641](https://github.com/magento/magento2/pull/28641)_. [GitHub-28720](https://github.com/magento/magento2/issues/28720) + + + +* Administrators can now configure a configurable product that has been added by a customer to a wish list from a non-default store. Previously, when the customer had also added the configurable product from a non-default store, Magento threw an error. + + + +* Added a test for sharing a customer's wish list with more than the allowed number of emails. _Fix submitted by Dmitry Tsymbal in pull request [28641](https://github.com/magento/magento2/pull/28641)_. [GitHub-28720](https://github.com/magento/magento2/issues/28720) + + + +* Added a test for deleting items from a customer’s wish list as an Admin user. _Fix submitted by Dmitry Tsymbal in pull request [28632](https://github.com/magento/magento2/pull/28632)_. [GitHub-28721](https://github.com/magento/magento2/issues/28721) + + + +* Added a test for disabling wish list functionality. _Fix submitted by Dmitry Tsymbal in pull request [28635](https://github.com/magento/magento2/pull/28635)_. [GitHub-28744](https://github.com/magento/magento2/issues/28744) + + + +* Added a test for using invalid email addresses when sharing customer wish lists. `StorefrontShareWishlistEntityTest` has been refactored. `StorefrontCustomerShareWishlistActionGroup` has been deprecated. _Fix submitted by Dmitry Tsymbal in pull request [28330](https://github.com/magento/magento2/pull/28330)_. [GitHub-28377](https://github.com/magento/magento2/issues/28377) + + + +* Added a test for sharing a customer's wish list that exceeds the allowed text length limit. _Fix submitted by Dmitry Tsymbal in pull request [28812](https://github.com/magento/magento2/pull/28812)_. [GitHub-28969](https://github.com/magento/magento2/issues/28969) + +## Known issues + +**Issue**: The new CAPTCHA feature for checkout does not work as expected on the Place Order page when using third-party payment providers. Merchants running Magento 2.3.6 or 2.4.1 who have enabled CAPTCHA protection on the Place Order storefront page will see this error when checking out using a third-party payment provider such as PayPal: `Please provide CAPTCHA code and try again`. A fix for this issue be available in the next few weeks, and will be included in our next quarterly patch (Q12021). Please contact Support for additional information. + +**Issue**: Users without administrator privileges cannot currently set up their personal 2FA access. 2FA as implemented in Magento includes two ACL roles. One role affects global system configuration and it is needed only when configuring the system. The second ACL role affects individual user 2FA accounts. An admin user must configure this second type of 2FA ACL. **Workaround**: After the user has logged in and seen the Access denied screen, they can visit `https:////tfa/tfa/requestconfig/` to force configuration. Note: We do not recommend disabling security settings. However, this workaround is effective only when Admin URL secret keys are disabled. + +**Issue**: Merchants cannot log in to dotdigital from the Admin in Safari when dotdigital is enabled. See the [It's impossible to login in the dotdigital via admin panel when dotdigital account is enabled](https://support.magento.com/hc/en-us/articles/360050092291) Knowledge Base article. + +**Issue**: Vertex address validation does not work during payment when the shopper selects a shipping address that differs from the billing address. The issue will be fixed in Magento 2.4.2. See the [Magento 2.4.1 known issue: Vertex Address Validation message does not disappear after updating address](https://support.magento.com/hc/en-us/articles/360050139631) Knowledge Base article. + +**Issue**: Magento displays an empty page when a merchant saves a dotdigital Page Builder form on the Safari browser. **Workaround**: Reload the page to apply your changes. See the [Magento 2.4.1 known issue: empty page after saving dotdigital Page Builder form](https://support.magento.com/hc/en-us/articles/360049819092) Knowledge Base article. + +**Issue**: Under certain conditions, Magento automatically signs in customers to previously used Amazon accounts rather prompting them to log in during checkout with Amazon Pay. See the [Magento 2.4.1 known issue: unable to change Amazon account in Google Chrome](https://support.magento.com/hc/en-us/articles/360049814152) Knowledge Base article. + +**Issue**: Magento briefly displays an error message on the billing page of the checkout workflow when PayPal Braintree payment and multiple addresses shipment are selected. See the [Magento 2.4.1 known issue: error popping up on Checkout with PayPal Braintree](https://support.magento.com/hc/en-us/articles/360050253211) Knowledge Base article. + +**Issue**: Magento displays a non-informative error message when a guest customer tries to place an order with PayPal through Braintree when guest checkout is disabled. See the [Magento 2.4.1 known issue: non-informative error message during guest checkout using Paypal through Braintree](https://support.magento.com/hc/en-us/articles/360050368111) Knowledge Base article. + +## Community contributions + +We are grateful to the wider Magento community and would like to acknowledge their contributions to this release. Check out the following ways you can learn about the community contributions to our current releases: + +* If a community member has provided a fix for this release, we identify the fix in the Fixed Issue section of these notes with the phrase, "*Fix provided by community member*". + +* The Magento Community Engineering team [Magento Contributors](https://magento.com/magento-contributors) maintains a list of top contributing individuals and partners by month, quarter, and year. From that Contributors page, you can follow links to their merged PRs on GitHub. + +### Partner contributions + +The following table highlights contributions made by Partners. This table lists the Partner who contributed the pull request, the external pull request, and the GitHub issue number associated with it (if available). + +{% include release-notes/engcomm-2-4-1-partner.md %} + +### Individual contributor contributions + +The following table identifies contributions from our community members. This table lists the external pull requests, the GitHub issue number associated with it (if available), and the community member who contributed the pull request. + +{% include release-notes/engcomm-2-4-1-issues.md %} + +### System requirements + +Our technology stack is built on PHP and MySQL. For more information, see [System Requirements]({{site.baseurl}}/system-requirements.html). + +### Installation and upgrade instructions + +You can install Magento Open Source 2.4.1 using Composer. + +## Migration toolkits + +The Data Migration Tool helps transfer existing Magento 1.x store data to Magento 2.x. This command-line interface includes verification, progress tracking, logging, and testing functions. For installation instructions, see [Install the Data Migration Tool]({{page.baseurl}}/migration/migration-tool-install.html). Consider exploring or contributing to the [Magento Data Migration repository](https://github.com/magento/data-migration-tool). + +The [Code Migration Toolkit](https://github.com/magento-commerce/code-migration) helps transfer existing Magento 1.x store extensions and customizations to Magento 2.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts. diff --git a/src/guides/v2.4/rest/protected-endpoints.md b/src/guides/v2.4/rest/protected-endpoints.md new file mode 120000 index 00000000000..395078c7de8 --- /dev/null +++ b/src/guides/v2.4/rest/protected-endpoints.md @@ -0,0 +1 @@ +../../v2.3/rest/protected-endpoints.md \ No newline at end of file