/** *Set additional information for shipping address * * @param \Magento\Checkout\Model\ShippingInformationManagement $subject * @param callable $proceed * * @return \Magento\Checkout\Api\Data\PaymentDetailsInterface $paymentDetails * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function aroundSaveAddressInformation(\Magento\Checkout\Model\ShippingInformationManagement $subject, $proceed, $cartId, \Magento\Checkout\Api\Data\ShippingInformationInterface $addressInformation) { try { $carrierCode = $addressInformation->getShippingCarrierCode(); $methodCode = $addressInformation->getShippingMethodCode(); $shippingMethod = $carrierCode . '_' . $methodCode; $quote = $this->quoteRepository->getActive($cartId); $address = $quote->getShippingAddress(); $validation = $this->checkoutSession->getShipAddressValidation(); if (is_array($validation) && isset($validation['key'])) { if (isset($validation['validation_status'])) { $additionalDetail['address_valid'] = $validation['validation_status']; $address->setValidationStatus($validation['validation_status']); } if (isset($validation['destination_type'])) { $additionalDetail['destination_type'] = $validation['destination_type']; $address->setDestinationType($validation['destination_type']); } $this->checkoutSession->setShipAddressValidation(null); } $address->save(); $additionalDetail = new \Magento\Framework\DataObject(); $extAttributes = $addressInformation->getShippingAddress()->getExtensionAttributes(); //push out event so other modules can save their data TODO add carrier_group_id $this->eventManager->dispatch('shipperhq_additional_detail_checkout', ['address_extn_attributes' => $extAttributes, 'additional_detail' => $additionalDetail, 'carrier_code' => $carrierCode]); $additionalDetailArray = $additionalDetail->convertToArray(); $this->shipperLogger->postDebug('ShipperHQ Shipper', 'processing additional detail ', $additionalDetail); $this->carrierGroupHelper->saveCarrierGroupInformation($address, $shippingMethod, $additionalDetailArray); } catch (\Exception $e) { $this->shipperLogger->postCritical('Shipperhq_Shipper', 'Shipping Information Plugin', 'Exception raised ' . $e->getMessage()); } $result = $proceed($cartId, $addressInformation); if ($address->getCustomerId()) { $customerAddresses = $quote->getCustomer()->getAddresses(); foreach ($customerAddresses as $oneAddress) { if ($oneAddress->getId() == $address->getCustomerAddressId()) { if ($address->getValidationStatus()) { $oneAddress->setCustomAttribute('validation_status', $address->getValidationStatus()); } if ($address->getDestinationType()) { $oneAddress->setCustomAttribute('destination_type', $address->getDestinationType()); } $this->addressRepository->save($oneAddress); } } } return $result; }
/** * Prepare and set request to this instance * * @param \Magento\Quote\Model\Quote\Address\RateRequest $request * @return $this */ public function setRequest(\Magento\Quote\Model\Quote\Address\RateRequest $request) { if (is_array($request->getAllItems())) { $item = current($request->getAllItems()); if ($item instanceof QuoteItem) { $request->setQuote($item->getQuote()); $this->quote = $item->getQuote(); } } //SHQ16-1261 - further detail as values not on shipping address if (!$this->quote) { $this->quote = $this->shipperDataHelper->getQuote(); } $shippingAddress = $this->quote->getShippingAddress(); $key = $this->shipperDataHelper->getAddressKey($shippingAddress); $existing = $this->checkoutSession->getShipAddressValidation(); $validate = true; if (is_array($existing)) { if (isset($existing['key']) && $existing['key'] == $key) { $validate = false; } } else { $validate = $this->shipperRateHelper->shouldValidateAddress($shippingAddress->getValidationStatus(), $shippingAddress->getDestinationType()); } $request->setValidateAddress($validate); $request->setSelectedOptions($this->getSelectedOptions($shippingAddress)); $isCheckout = $this->shipperDataHelper->isCheckout($this->quote); $cartType = !is_null($isCheckout) && $isCheckout != 1 ? "CART" : "STD"; if ($this->quote->getIsMultiShipping()) { $cartType = 'MAC'; } $request->setCartType($cartType); $this->eventManager->dispatch('shipperhq_carrier_set_request', ['request' => $request]); $this->shipperRequest = $this->shipperMapper->getShipperTranslation($request); $this->rawRequest = $request; return $this; }