Exemple #1
0
 /**
  * Returns currency code
  *
  * @return string
  */
 public function getCurrencyCode()
 {
     return $this->quote->getCurrency()->getBaseCurrencyCode();
 }
 /**
  * Convert Tax Quote Details into data to be converted to a GetTax Request
  *
  * @param \Magento\Tax\Api\Data\QuoteDetailsInterface $taxQuoteDetails
  * @param \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment
  * @param \Magento\Quote\Api\Data\CartInterface $quote
  * @return array|null
  */
 protected function convertTaxQuoteDetailsToData(\Magento\Tax\Api\Data\QuoteDetailsInterface $taxQuoteDetails, \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment, \Magento\Quote\Api\Data\CartInterface $quote)
 {
     $lines = [];
     $items = $taxQuoteDetails->getItems();
     $keyedItems = $this->taxCalculation->getKeyedItems($items);
     $childrenItems = $this->taxCalculation->getChildrenItems($items);
     /** @var \Magento\Tax\Api\Data\QuoteDetailsItemInterface $item */
     foreach ($keyedItems as $item) {
         /**
          * If a quote has children and they are calculated (e.g., Bundled products with dynamic pricing)
          * @see \Magento\Tax\Model\Sales\Total\Quote\CommonTaxCollector::mapItems
          * then we only need to pass child items to AvaTax. Due to the logic in
          * @see \ClassyLlama\AvaTax\Framework\Interaction\TaxCalculation::calculateTaxDetails
          * the parent tax gets calculated based on children items
          */
         //
         if (isset($childrenItems[$item->getCode()])) {
             /** @var \Magento\Tax\Api\Data\QuoteDetailsItemInterface $childItem */
             foreach ($childrenItems[$item->getCode()] as $childItem) {
                 $line = $this->interactionLine->getLine($childItem);
                 if ($line) {
                     $lines[] = $line;
                 }
             }
         } else {
             $line = $this->interactionLine->getLine($item);
             if ($line) {
                 $lines[] = $line;
             }
         }
     }
     // Shipping Address not documented in the interface for some reason
     // they do have a constant for it but not a method in the interface
     //
     // If quote is virtual, getShipping will return billing address, so no need to check if quote is virtual
     $shippingAddress = $shippingAssignment->getShipping()->getAddress();
     $address = $this->address->getAddress($shippingAddress);
     $store = $this->storeRepository->getById($quote->getStoreId());
     $currentDate = $this->getFormattedDate($store);
     // Quote created/updated date is not relevant, so just pass the current date
     $docDate = $currentDate;
     $customerUsageType = $quote->getCustomer() ? $this->taxClassHelper->getAvataxTaxCodeForCustomer($quote->getCustomer()) : null;
     return ['StoreId' => $store->getId(), 'Commit' => false, 'CurrencyCode' => $quote->getCurrency()->getQuoteCurrencyCode(), 'CustomerCode' => $this->getCustomerCode($quote), 'CustomerUsageType' => $customerUsageType, 'DestinationAddress' => $address, 'DocCode' => self::AVATAX_DOC_CODE_PREFIX . $quote->getId(), 'DocDate' => $docDate, 'DocType' => DocumentType::$SalesOrder, 'ExchangeRate' => $this->getExchangeRate($store, $quote->getCurrency()->getBaseCurrencyCode(), $quote->getCurrency()->getQuoteCurrencyCode()), 'ExchangeRateEffDate' => $currentDate, 'Lines' => $lines, 'DetailLevel' => DetailLevel::$Line, 'PurchaseOrderNo' => $quote->getReservedOrderId()];
 }