/** * Ping AvaTax using configured live/production mode * * @param $scopeId * @param $scopeType * @return array */ protected function sendPing($scopeId, $scopeType) { $errors = []; if (!$this->config->isModuleEnabled($scopeId, $scopeType)) { return $errors; } $message = ''; $type = $this->config->getLiveMode() ? Config::API_PROFILE_NAME_PROD : Config::API_PROFILE_NAME_DEV; try { $result = $this->interactionTax->getTaxService($type, $scopeId, $scopeType)->ping(); if (is_object($result) && $result->getResultCode() != \AvaTax\SeverityLevel::$Success) { foreach ($result->getMessages() as $messages) { $message .= $messages->getName() . ': ' . $messages->getSummary() . "\n"; } } elseif (is_object($result) && $result->getResultCode() == \AvaTax\SeverityLevel::$Success) { $this->messageManager->addSuccess(__('Successfully connected to AvaTax using the ' . '<a href="#row_tax_avatax_connection_settings_header">%1 credentials</a>', $type)); } } catch (\Exception $exception) { $message = $exception->getMessage(); } if ($message) { $errors[] = __('Error connecting to AvaTax using the ' . '<a href="#row_tax_avatax_connection_settings_header">%1 credentials</a>: %2', $type, $message); } return $errors; }
/** * Convert quote/order/invoice/creditmemo to the AvaTax object and request tax from the Get Tax API * * @param \Magento\Quote\Model\Quote $quote * @param \Magento\Tax\Api\Data\QuoteDetailsInterface $taxQuoteDetails * @param \Magento\Tax\Api\Data\QuoteDetailsInterface $baseTaxQuoteDetails * @param \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment * @return \Magento\Tax\Api\Data\TaxDetailsInterface[] * @throws \ClassyLlama\AvaTax\Exception\TaxCalculationException * @throws \Exception */ public function getTaxDetailsForQuote(\Magento\Quote\Model\Quote $quote, \Magento\Tax\Api\Data\QuoteDetailsInterface $taxQuoteDetails, \Magento\Tax\Api\Data\QuoteDetailsInterface $baseTaxQuoteDetails, \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment) { $storeId = $quote->getStoreId(); $taxService = $this->taxService; try { // Total quantity of an item can be determined by multiplying parent * child quantity, so it's necessary // to calculate total quantities on a list of all items $this->taxCalculation->calculateTotalQuantities($taxQuoteDetails->getItems()); $this->taxCalculation->calculateTotalQuantities($baseTaxQuoteDetails->getItems()); // Taxes need to be calculated on the base prices/amounts, not the current currency prices. As a result of this, // only the $baseTaxQuoteDetails will have taxes calculated for it. The taxes for the current currency will be // calculated by multiplying the base tax rates * currency conversion rate. /** @var $getTaxRequest GetTaxRequest */ $getTaxRequest = $this->interactionTax->getGetTaxRequestForQuote($quote, $baseTaxQuoteDetails, $shippingAssignment); if (is_null($getTaxRequest)) { $message = __('$quote was empty or address was not valid so not running getTax request.'); throw new \ClassyLlama\AvaTax\Exception\TaxCalculationException($message); } $getTaxResult = $taxService->getTax($getTaxRequest, $storeId, true); if ($getTaxResult->getResultCode() == \AvaTax\SeverityLevel::$Success) { $store = $quote->getStore(); $baseTaxDetails = $this->taxCalculation->calculateTaxDetails($baseTaxQuoteDetails, $getTaxResult, true, $store); /** * If quote is using a currency other than the base currency, calculate tax details for both quote * currency and base currency. Otherwise use the same tax details object. */ if ($quote->getBaseCurrencyCode() != $quote->getQuoteCurrencyCode()) { $taxDetails = $this->taxCalculation->calculateTaxDetails($taxQuoteDetails, $getTaxResult, false, $store); } else { $taxDetails = $baseTaxDetails; } return [self::KEY_TAX_DETAILS => $taxDetails, self::KEY_BASE_TAX_DETAILS => $baseTaxDetails]; } else { $message = __('Bad result code: %1', $getTaxResult->getResultCode()); $this->avaTaxLogger->warning($message, ['request' => var_export($getTaxRequest, true), 'result' => var_export($getTaxResult, true)]); throw new \ClassyLlama\AvaTax\Exception\TaxCalculationException($message); } } catch (\SoapFault $exception) { $message = "Exception: \n"; if ($exception) { $message .= $exception->faultstring; } $message .= $taxService->__getLastRequest() . "\n"; $message .= $taxService->__getLastResponse() . "\n"; $this->avaTaxLogger->error("Exception: \n" . $exception ? $exception->faultstring : "", ['request' => var_export($taxService->__getLastRequest(), true), 'result' => var_export($taxService->__getLastResponse(), true)]); throw new \ClassyLlama\AvaTax\Exception\TaxCalculationException($message); } catch (\Exception $exception) { $message = $exception->getMessage(); $this->avaTaxLogger->error($message); throw new \ClassyLlama\AvaTax\Exception\TaxCalculationException($message); } }
/** * Pass all undefined method calls through to Tax Service * * @param $name * @param array $arguments * @return mixed */ public function __call($name, array $arguments) { return call_user_func_array([$this->taxInteraction->getTaxService($this->type), $name], $arguments); }