public function testEnableQtyIncrements()
 {
     $productId = 48;
     $result = true;
     $stockItemModel = $this->getStockItemModel($productId);
     $stockItemModel->expects($this->once())->method('getEnableQtyIncrements')->will($this->returnValue($result));
     $this->assertEquals($result, $this->model->getEnableQtyIncrements($productId));
 }
예제 #2
0
파일: Carrier.php 프로젝트: aiesh/magento2
 /**
  * Prepare items to pieces
  *
  * @return array
  */
 protected function _getAllItems()
 {
     $allItems = $this->_request->getAllItems();
     $fullItems = array();
     foreach ($allItems as $item) {
         if ($item->getProductType() == Type::TYPE_BUNDLE && $item->getProduct()->getShipmentType()) {
             continue;
         }
         $qty = $item->getQty();
         $changeQty = true;
         $checkWeight = true;
         $decimalItems = array();
         if ($item->getParentItem()) {
             if (!$item->getParentItem()->getProduct()->getShipmentType()) {
                 continue;
             }
             if ($item->getIsQtyDecimal()) {
                 $qty = $item->getParentItem()->getQty();
             } else {
                 $qty = $item->getParentItem()->getQty() * $item->getQty();
             }
         }
         $itemWeight = $item->getWeight();
         if ($item->getIsQtyDecimal() && $item->getProductType() != Type::TYPE_BUNDLE) {
             $productId = $item->getProduct()->getId();
             $isDecimalDivided = $this->stockItemService->getStockItem($productId)->getIsDecimalDivided();
             if ($isDecimalDivided) {
                 if ($this->stockItemService->getEnableQtyIncrements($productId) && $this->stockItemService->getQtyIncrements($productId)) {
                     $itemWeight = $itemWeight * $this->stockItemService->getQtyIncrements($productId);
                     $qty = round($item->getWeight() / $itemWeight * $qty);
                     $changeQty = false;
                 } else {
                     $itemWeight = $this->_getWeight($itemWeight * $item->getQty());
                     $maxWeight = $this->_getWeight($this->_maxWeight, true);
                     if ($itemWeight > $maxWeight) {
                         $qtyItem = floor($itemWeight / $maxWeight);
                         $decimalItems[] = array('weight' => $maxWeight, 'qty' => $qtyItem);
                         $weightItem = $this->mathDivision->getExactDivision($itemWeight, $maxWeight);
                         if ($weightItem) {
                             $decimalItems[] = array('weight' => $weightItem, 'qty' => 1);
                         }
                         $checkWeight = false;
                     }
                 }
             } else {
                 $itemWeight = $itemWeight * $item->getQty();
             }
         }
         if ($checkWeight && $this->_getWeight($itemWeight) > $this->_getWeight($this->_maxWeight, true)) {
             return array();
         }
         if ($changeQty && !$item->getParentItem() && $item->getIsQtyDecimal() && $item->getProductType() != Type::TYPE_BUNDLE) {
             $qty = 1;
         }
         if (!empty($decimalItems)) {
             foreach ($decimalItems as $decimalItem) {
                 $fullItems = array_merge($fullItems, array_fill(0, $decimalItem['qty'] * $qty, $decimalItem['weight']));
             }
         } else {
             $fullItems = array_merge($fullItems, array_fill(0, $qty, $this->_getWeight($itemWeight)));
         }
     }
     sort($fullItems);
     return $fullItems;
 }
예제 #3
0
 /**
  * Compose Packages For Carrier.
  * Divides order into items and items into parts if it's necessary
  *
  * @param \Magento\Shipping\Model\Carrier\AbstractCarrier $carrier
  * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
  * @return array [int, float]
  */
 public function composePackagesForCarrier($carrier, $request)
 {
     $allItems = $request->getAllItems();
     $fullItems = array();
     $maxWeight = (double) $carrier->getConfigData('max_package_weight');
     /** @var $item \Magento\Sales\Model\Quote\Item */
     foreach ($allItems as $item) {
         if ($item->getProductType() == \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE && $item->getProduct()->getShipmentType()) {
             continue;
         }
         $qty = $item->getQty();
         $changeQty = true;
         $checkWeight = true;
         $decimalItems = array();
         if ($item->getParentItem()) {
             if (!$item->getParentItem()->getProduct()->getShipmentType()) {
                 continue;
             }
             $qty = $item->getIsQtyDecimal() ? $item->getParentItem()->getQty() : $item->getParentItem()->getQty() * $item->getQty();
         }
         $itemWeight = $item->getWeight();
         if ($item->getIsQtyDecimal() && $item->getProductType() != \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE) {
             $productId = $item->getProduct()->getId();
             if ($this->stockItemService->getStockItem($productId)->getIsDecimalDivided()) {
                 if ($this->stockItemService->getEnableQtyIncrements($productId) && $this->stockItemService->getQtyIncrements($productId)) {
                     $itemWeight = $itemWeight * $this->stockItemService->getQtyIncrements($productId);
                     $qty = round($item->getWeight() / $itemWeight * $qty);
                     $changeQty = false;
                 } else {
                     $itemWeight = $itemWeight * $item->getQty();
                     if ($itemWeight > $maxWeight) {
                         $qtyItem = floor($itemWeight / $maxWeight);
                         $decimalItems[] = array('weight' => $maxWeight, 'qty' => $qtyItem);
                         $weightItem = $this->mathDivision->getExactDivision($itemWeight, $maxWeight);
                         if ($weightItem) {
                             $decimalItems[] = array('weight' => $weightItem, 'qty' => 1);
                         }
                         $checkWeight = false;
                     } else {
                         $itemWeight = $itemWeight * $item->getQty();
                     }
                 }
             } else {
                 $itemWeight = $itemWeight * $item->getQty();
             }
         }
         if ($checkWeight && $maxWeight && $itemWeight > $maxWeight) {
             return array();
         }
         if ($changeQty && !$item->getParentItem() && $item->getIsQtyDecimal() && $item->getProductType() != \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE) {
             $qty = 1;
         }
         if (!empty($decimalItems)) {
             foreach ($decimalItems as $decimalItem) {
                 $fullItems = array_merge($fullItems, array_fill(0, $decimalItem['qty'] * $qty, $decimalItem['weight']));
             }
         } else {
             $fullItems = array_merge($fullItems, array_fill(0, $qty, $itemWeight));
         }
     }
     sort($fullItems);
     return $this->_makePieces($fullItems, $maxWeight);
 }
예제 #4
0
 /**
  * Processing additional validation to check if carrier applicable.
  *
  * @param RateRequest $request
  * @return $this|bool|Error
  */
 public function proccessAdditionalValidation(RateRequest $request)
 {
     //Skip by item validation if there is no items in request
     if (!count($this->getAllItems($request))) {
         return $this;
     }
     $maxAllowedWeight = (double) $this->getConfigData('max_package_weight');
     $errorMsg = '';
     $configErrorMsg = $this->getConfigData('specificerrmsg');
     $defaultErrorMsg = __('The shipping module is not available.');
     $showMethod = $this->getConfigData('showmethod');
     /** @var $item \Magento\Sales\Model\Quote\Item */
     foreach ($this->getAllItems($request) as $item) {
         $product = $item->getProduct();
         if ($product && $product->getId()) {
             $weight = $product->getWeight();
             $stockItemData = $this->stockItemService->getStockItem($product->getId());
             $doValidation = true;
             if ($stockItemData->getIsQtyDecimal() && $stockItemData->getIsDecimalDivided()) {
                 if ($this->stockItemService->getEnableQtyIncrements($product->getId()) && $this->stockItemService->getQtyIncrements($product->getId())) {
                     $weight = $weight * $this->stockItemService->getQtyIncrements($product->getId());
                 } else {
                     $doValidation = false;
                 }
             } elseif ($stockItemData->getIsQtyDecimal() && !$stockItemData->getIsDecimalDivided()) {
                 $weight = $weight * $item->getQty();
             }
             if ($doValidation && $weight > $maxAllowedWeight) {
                 $errorMsg = $configErrorMsg ? $configErrorMsg : $defaultErrorMsg;
                 break;
             }
         }
     }
     if (!$errorMsg && !$request->getDestPostcode() && $this->isZipCodeRequired($request->getDestCountryId())) {
         $errorMsg = __('This shipping method is not available. Please specify the zip code.');
     }
     if ($errorMsg && $showMethod) {
         $error = $this->_rateErrorFactory->create();
         $error->setCarrier($this->_code);
         $error->setCarrierTitle($this->getConfigData('title'));
         $error->setErrorMessage($errorMsg);
         return $error;
     } elseif ($errorMsg) {
         return false;
     }
     return $this;
 }