scopeConfig = $scopeConfig; } /** * Plugin for before collectRates method. * * @param \WebShopApps\MatrixRate\Model\Carrier\Matrixrate $subject * @param \Magento\Quote\Model\Quote\Address\RateRequest $request */ public function beforeCollectRates(Matrixrate $subject, RateRequest $request) { // Store the RateRequest, so we can use it in afterCollectRates. $this->rateRequest = $request; $itemQty = (int) $request->getPackageQty(); if ($itemQty <= 0) { return [$request]; } $weightToAdd = 0; if ($itemQty >= 1 && $itemQty <= 5) { $weightToAdd = (float) $this->scopeConfig->getValue(self::XML_PATH_1_5, ScopeInterface::SCOPE_STORE); } elseif ($itemQty >= 6 && $itemQty <= 10) { $weightToAdd = (float) $this->scopeConfig->getValue(self::XML_PATH_6_10, ScopeInterface::SCOPE_STORE); } elseif ($itemQty > 10) { $weightToAdd = (float) $this->scopeConfig->getValue(self::XML_PATH_11_PLUS, ScopeInterface::SCOPE_STORE); } if ($weightToAdd <= 0) { return [$request]; } $originalWeight = $request->getPackageWeight(); $adjustedWeight = $originalWeight + $weightToAdd; $request->setPackageWeight($adjustedWeight); $request->setData('package_weight', $adjustedWeight); $request->setFreeMethodWeight($adjustedWeight); $request->setData('weight', $adjustedWeight); if (method_exists($request, 'setWeight')) { $request->setWeight($adjustedWeight); } return [$request]; } /** * Plugin for after collectRates method. * * @param \WebShopApps\MatrixRate\Model\Carrier\Matrixrate $subject * @param \Magento\Shipping\Model\Rate\Result $result */ public function afterCollectRates(Matrixrate $subject, $result) { if (!$result instanceof \Magento\Shipping\Model\Rate\Result) { return $result; } if (!$this->rateRequest instanceof RateRequest) { return $result; } $itemCount = (int) $this->rateRequest->getPackageQty(); if ($itemCount <= 0) { return $result; } // Determine correct per-item adjustment based on quantity if ($itemCount >= 1 && $itemCount <= 5) { $adjustment = (float) $this->scopeConfig ->getValue(self::XML_PATH_PRICE_ADJ_1_5, ScopeInterface::SCOPE_STORE); } elseif ($itemCount >= 6 && $itemCount <= 10) { $adjustment = (float) $this->scopeConfig ->getValue(self::XML_PATH_PRICE_ADJ_6_10, ScopeInterface::SCOPE_STORE); } else { $adjustment = (float) $this->scopeConfig ->getValue(self::XML_PATH_PRICE_ADJ_11_PLUS, ScopeInterface::SCOPE_STORE); } if ($adjustment <= 0) { return $result; } foreach ($result->getAllRates() as $method) { $originalPrice = $method->getPrice(); $originalCost = $method->getCost(); $method->setPrice($originalPrice + $adjustment); $method->setCost($originalCost + $adjustment); } return $result; } }