From 843bc6229ba141cd1f326eeb90013c342c2d2983 Mon Sep 17 00:00:00 2001
From: Vinay Shah <vinay.sudhir@gmail.com>
Date: Sun, 7 Jan 2018 14:12:04 +0530
Subject: [PATCH] magento/magento2#12705: Integrity constraint violation error
 after reordering product with custom options

- Fixed issue by updating options if parent item is same for more than one product
- Fixed issue for reorder in admin while checking the availability of product, which is not available in case of associate product.
---
 .../Model/Order/Reorder/OrderedProductAvailabilityChecker.php  | 2 +-
 app/code/Magento/Quote/Model/Quote/Item.php                    | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/app/code/Magento/ConfigurableProductSales/Model/Order/Reorder/OrderedProductAvailabilityChecker.php b/app/code/Magento/ConfigurableProductSales/Model/Order/Reorder/OrderedProductAvailabilityChecker.php
index dceb5767eda..45874494589 100644
--- a/app/code/Magento/ConfigurableProductSales/Model/Order/Reorder/OrderedProductAvailabilityChecker.php
+++ b/app/code/Magento/ConfigurableProductSales/Model/Order/Reorder/OrderedProductAvailabilityChecker.php
@@ -45,7 +45,7 @@ class OrderedProductAvailabilityChecker implements OrderedProductAvailabilityChe
     public function isAvailable(Item $item)
     {
         $buyRequest = $item->getBuyRequest();
-        $superAttribute = $buyRequest->getData()['super_attribute'];
+        $superAttribute = isset($buyRequest->getData()['super_attribute']) ? $buyRequest->getData()['super_attribute'] : [];
         $connection = $this->getConnection();
         $select = $connection->select();
         $orderItemParentId = $item->getParentItem()->getProductId();
diff --git a/app/code/Magento/Quote/Model/Quote/Item.php b/app/code/Magento/Quote/Model/Quote/Item.php
index d8177ddfe52..fe6d712500b 100644
--- a/app/code/Magento/Quote/Model/Quote/Item.php
+++ b/app/code/Magento/Quote/Model/Quote/Item.php
@@ -745,6 +745,9 @@ class Item extends \Magento\Quote\Model\Quote\Item\AbstractItem implements \Mage
                 unset($this->_options[$index]);
                 unset($this->_optionsByCode[$option->getCode()]);
             } else {
+                if (!$option->getItem() || !$option->getItem()->getId()) {
+                    $option->setItem($this);
+                }
                 $option->save();
             }
         }
-- 
GitLab