diff --git a/vendor/magento/module-grouped-requisition-list/Plugin/Model/RequisitionListItem/SaveHandler.php b/vendor/magento/module-grouped-requisition-list/Plugin/Model/RequisitionListItem/SaveHandler.php index eb9e9450f011..8b4f3d379f29 100644 --- a/vendor/magento/module-grouped-requisition-list/Plugin/Model/RequisitionListItem/SaveHandler.php +++ b/vendor/magento/module-grouped-requisition-list/Plugin/Model/RequisitionListItem/SaveHandler.php @@ -1,12 +1,26 @@ getTypeId() !== Grouped::TYPE_CODE) { return $proceed($productData, $options, $itemId, $listId); } - $options = $productData->getOptions(); + $requisitionList = $this->prepareItem($parentProduct, $productData->getOptions(), $itemId, (int)$listId); + $message = __( + 'Product %1 has been added to the requisition list %2.', + $parentProduct->getName(), + $requisitionList->getName() + ); + $this->requisitionListRepository->save($requisitionList); + + return $message; + } + + /** + * Save requisition list for grouped products. + * + * @param SaveHandlerModel $subject + * @param \Closure $proceed + * @param array $requisitionListItems + * @param int $listId + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function aroundSaveItems( + SaveHandlerModel $subject, + \Closure $proceed, + array $requisitionListItems, + int $listId + ) { + $requisitionList = $this->requisitionListRepository->get($listId); + foreach ($requisitionListItems as $key => $itemData) { + $productData = $itemData['productData']; + $parentProduct = $this->requisitionListProduct->getProduct((string)$productData->getSku()); + if ($parentProduct->getTypeId() !== Grouped::TYPE_CODE) { + continue; + } + $this->prepareItem($parentProduct, $productData->getOptions(), $itemData['itemId'], $listId); + unset($requisitionListItems[$key]); + } + $this->requisitionListRepository->save($requisitionList); + if (count($requisitionListItems) > 0) { + return $proceed($requisitionListItems, $listId); + } + } + + /** + * Prepare grouped product for requisition list. + * + * @param ProductInterface|bool $parentProduct + * @param array $options + * @param int|null $itemId + * @param int $listId + * @return RequisitionListInterface + */ + private function prepareItem( + $parentProduct, + array $options, + ?int $itemId, + int $listId + ): RequisitionListInterface { $buyRequest = new DataObject($options); $cartCandidates = $parentProduct->getTypeInstance()->prepareForCartAdvanced( $buyRequest, @@ -130,14 +203,7 @@ public function aroundSaveItem( $items[] = $item; } } - $message = __( - 'Product %1 has been added to the requisition list %2.', - $parentProduct->getName(), - $requisitionList->getName() - ); $this->requisitionListManagement->setItemsToList($requisitionList, $items); - $this->requisitionListRepository->save($requisitionList); - - return $message; + return $requisitionList; } } diff --git a/vendor/magento/module-requisition-list/Model/RequisitionListItem/SaveHandler.php b/vendor/magento/module-requisition-list/Model/RequisitionListItem/SaveHandler.php index fd4a01f780b7..b453aa53ebca 100644 --- a/vendor/magento/module-requisition-list/Model/RequisitionListItem/SaveHandler.php +++ b/vendor/magento/module-requisition-list/Model/RequisitionListItem/SaveHandler.php @@ -1,7 +1,19 @@ requisitionListRepository->get($listId); + $item = $this->requisitionListItemLocator->getItem($itemId); + $items = $this->prepareSaveItems($productData, $requisitionList, $options, $itemId, $item); + $product = $this->requisitionListProduct->getProduct($productData->getSku()); + if ($item->getId()) { + $message = __('%1 has been updated in your requisition list.', $product->getName()); + } else { + $message = __( + 'Product %1 has been added to the requisition list %2.', + $product->getName(), + $requisitionList->getName() + ); + } + + $this->requisitionListManagement->setItemsToList($requisitionList, $items); + $this->requisitionListRepository->save($requisitionList); + + return $message; + } + + /** + * Set options and save requisition list items. + * + * @param array $requisitionListItems + * @param int $listId + * @return void + */ + public function saveItems(array $requisitionListItems, int $listId): void + { + $requisitionList = $this->requisitionListRepository->get($listId); + foreach ($requisitionListItems as $itemData) { + $item = $this->requisitionListItemLocator->getItem($itemData['itemId']); + $items = $this->prepareSaveItems( + $itemData['productData'], + $requisitionList, + $itemData['optionsData'], + $itemData['itemId'], + $item + ); + $this->requisitionListManagement->setItemsToList($requisitionList, $items); + } + $this->requisitionListRepository->save($requisitionList); + } + + /** + * Prepare requisition list items to save. + * + * @param DataObject $productData + * @param RequisitionListInterface $requisitionList + * @param array $options + * @param int $itemId + * @param RequisitionListItemInterface $item + * @return array + */ + private function prepareSaveItems( + DataObject $productData, + RequisitionListInterface $requisitionList, + array $options, + ?int $itemId, + RequisitionListItemInterface $item + ): array { $sku = (string)$productData->getSku(); $qty = $this->retrieveQty($productData); if (!$this->isDecimalQtyUsed($sku)) { $qty = (int)$qty; } - $requisitionList = $this->requisitionListRepository->get($listId); $itemOptions = $this->optionsBuilder->build($options, $itemId, false); - $item = $this->requisitionListItemLocator->getItem($itemId); $item->setQty($qty); $item->setOptions($itemOptions); $item->setSku($sku); @@ -108,21 +181,7 @@ public function saveItem(DataObject $productData, array $options, $itemId, $list $items[] = $item; } - $product = $this->requisitionListProduct->getProduct($productData->getSku()); - if ($item->getId()) { - $message = __('%1 has been updated in your requisition list.', $product->getName()); - } else { - $message = __( - 'Product %1 has been added to the requisition list %2.', - $product->getName(), - $requisitionList->getName() - ); - } - - $this->requisitionListManagement->setItemsToList($requisitionList, $items); - $this->requisitionListRepository->save($requisitionList); - - return $message; + return $items; } /** diff --git a/vendor/magento/module-requisition-list-graph-ql/Model/RequisitionList/Item/AddItemsToRequisitionList.php b/vendor/magento/module-requisition-list-graph-ql/Model/RequisitionList/Item/AddItemsToRequisitionList.php index da73912bc50b..5c9f3dbc3d45 100755 --- a/vendor/magento/module-requisition-list-graph-ql/Model/RequisitionList/Item/AddItemsToRequisitionList.php +++ b/vendor/magento/module-requisition-list-graph-ql/Model/RequisitionList/Item/AddItemsToRequisitionList.php @@ -1,7 +1,19 @@ getSku(); $qty = $item->getQuantity(); $options = $this->requestBuilder->build($item); @@ -88,13 +102,12 @@ public function execute( } $itemOptions = $this->prepareOptions($itemOptions, $product, $qty); - $productData = $this->prepareProductData($itemOptions); - $optionsData = $itemOptions['options']; - $listId = (int)$requisitionList->getId(); - $itemId = (int)$itemOptions['options']['item_id']; - - $this->requisitionSaveHandler->saveItem($productData, $optionsData, $itemId, $listId); + $itemData['productData'] = $this->prepareProductData($itemOptions); + $itemData['optionsData'] = $itemOptions['options']; + $itemData['itemId'] = (int)$itemOptions['options']['item_id']; + $requisitionListItems[] = $itemData; } + $this->requisitionSaveHandler->saveItems($requisitionListItems, (int)$requisitionList->getId()); } /** diff --git a/vendor/magento/module-requisition-list-graph-ql/Model/Resolver/RequisitionList/AddProducts.php b/vendor/magento/module-requisition-list-graph-ql/Model/Resolver/RequisitionList/AddProducts.php index faaec63b7946..ede22f88c018 100755 --- a/vendor/magento/module-requisition-list-graph-ql/Model/Resolver/RequisitionList/AddProducts.php +++ b/vendor/magento/module-requisition-list-graph-ql/Model/Resolver/RequisitionList/AddProducts.php @@ -1,7 +1,19 @@ getRequisitionListForUser = $getRequisitionListForUser; $this->addItemsToRequisitionList = $addItemsToRequisitionList; $this->dataObjectConverter = $dataObjectConverter; $this->idEncoder = $idEncoder; $this->moduleConfig = $moduleConfig; + $this->requisitionListFactory = $requisitionListFactory; } /** @@ -109,8 +130,10 @@ public function resolve( $requisitionListItems[] = (new CartItemFactory())->create($itemData); } - $requisitionList = $this->getRequisitionListForUser->execute($customerId, $requisitionListId); + $requisitionList = $this->requisitionListFactory->create(); + $requisitionList->setId($requisitionListId); $this->addItemsToRequisitionList->execute($requisitionList, $requisitionListItems); + $requisitionList = $this->getRequisitionListForUser->execute($customerId, $requisitionListId); $data = $this->dataObjectConverter->toFlatArray($requisitionList, [], RequisitionListInterface::class); $data['uid'] = $this->idEncoder->encode((string)$requisitionList->getId());