Esempio n. 1
0
 /**
  * Returns the currency compliant to ISO 4217 (3 char code)
  * @return string 3 Character long currency code
  *
  * @param Mage_Sales_Model_Quote|Mage_Sales_Model_Order|Mage_Sales_Model_Order_Invoice|Mage_Sales_Model_Order_Creditmemo $object
  * @return string
  */
 public function getCurrency($object)
 {
     $currency = $object->getBaseCurrencyCode();
     if (!Mage::helper('paymill/optionHelper')->isBaseCurrency()) {
         if ($object instanceof Mage_Sales_Model_Quote) {
             $currency = $object->getQuoteCurrencyCode();
         } else {
             $currency = $object->getOrderCurrencyCode();
         }
     }
     return $currency;
 }
 public function collect(Mage_Sales_Model_Order_Invoice $invoice)
 {
     $currencyFrom = Mage::getModel('directory/currency')->load($invoice->getOrderCurrencyCode());
     $currencyTo = $invoice->getStore()->getBaseCurrency();
     /* @var $helper Dutycalculator_Charge_Helper_Data */
     $helper = Mage::helper('dccharge');
     $invoice->setImportDutyTax(0);
     $invoice->setBaseImportDutyTax(0);
     $invoice->setImportDuty(0);
     $invoice->setBaseImportDuty(0);
     $invoice->setSalesTax(0);
     $invoice->setBaseSalesTax(0);
     $invoice->setDeliveryDutyType($invoice->getOrder()->getDeliveryDutyType());
     $invoice->setFailedCalculation($invoice->getOrder()->getFailedCalculation());
     $invoice->setDcOrderId(0);
     foreach ($invoice->getAllItems() as $invoiceItem) {
         $invoiceItem->setImportDutyTax(0);
         $invoiceItem->setBaseImportDutyTax(0);
         $invoiceItem->setImportDuty(0);
         $invoiceItem->setBaseImportDuty(0);
         $invoiceItem->setSalesTax(0);
         $invoiceItem->setBaseSalesTax(0);
     }
     if ($invoice->getOrder()->getDcOrderId()) {
         $result = Dutycalculator_Charge_Model_Importdutytaxes::invoiceCalculation($invoice);
         if ($result) {
             $amountToInvoice = $result['total'];
             $baseAmountToInvoice = $helper->convertPrice($currencyFrom, $currencyTo, $result['total']);
             $invoice->setImportDutyTax($result['total']);
             $invoice->setBaseImportDutyTax($helper->convertPrice($currencyFrom, $currencyTo, $result['total']));
             $invoice->setImportDuty($result['duty']);
             $invoice->setBaseImportDuty($helper->convertPrice($currencyFrom, $currencyTo, $result['duty']));
             $invoice->setSalesTax($result['sales_tax']);
             $invoice->setBaseSalesTax($helper->convertPrice($currencyFrom, $currencyTo, $result['sales_tax']));
             $invoice->setDeliveryDutyType($invoice->getOrder()->getDeliveryDutyType());
             $invoice->setFailedCalculation($invoice->getOrder()->getFailedCalculation());
             $invoice->setDcOrderId($result['dc_order_id']);
             if ($invoice->getOrder()->getDeliveryDutyType() == Dutycalculator_Charge_Helper_Data::DC_DELIVERY_TYPE_DDP) {
                 $invoice->setGrandTotal($invoice->getGrandTotal() + $amountToInvoice);
                 $invoice->setBaseGrandTotal($invoice->getBaseGrandTotal() + $baseAmountToInvoice);
                 $aggregatedItemsValues = array();
                 foreach ($invoice->getAllItems() as $invoiceItem) {
                     if ($invoiceItem->getOrderItem()->getParentItemId()) {
                         continue;
                     }
                     $id = $invoiceItem->getOrderItem()->getQuoteItemId();
                     if (isset($result['items'][$id])) {
                         $invoiceItem->setImportDutyTax($result['items'][$id]['total']);
                         $invoiceItem->setBaseImportDutyTax($helper->convertPrice($currencyFrom, $currencyTo, $result['items'][$id]['total']));
                         $invoiceItem->setImportDuty($result['items'][$id]['duty']);
                         $invoiceItem->setBaseImportDuty($helper->convertPrice($currencyFrom, $currencyTo, $result['items'][$id]['duty']));
                         $invoiceItem->setSalesTax($result['items'][$id]['sales_tax']);
                         $invoiceItem->setBaseSalesTax($helper->convertPrice($currencyFrom, $currencyTo, $result['items'][$id]['sales_tax']));
                     } else {
                         foreach ($result['aggregated_items'] as $key => $_items) {
                             if (in_array($id, $_items['items'])) {
                                 $aggregatedItemsValues[$key][$id] = $invoiceItem->getRowTotal();
                             }
                         }
                     }
                 }
                 $totals = array();
                 $totalDuty = array();
                 $totalSalesTaxes = array();
                 foreach ($aggregatedItemsValues as $key => $aggregatedItemsValue) {
                     $aggregatedTotal = $result['aggregated_items'][$key]['aggregated_total'];
                     $aggregatedDuty = $result['aggregated_items'][$key]['aggregated_duty'];
                     $aggregatedSalesTax = $result['aggregated_items'][$key]['aggregated_sales_tax'];
                     $totalAggregatedItemsValue = array_sum($aggregatedItemsValue);
                     foreach ($aggregatedItemsValue as $itemId => $value) {
                         $totals[$itemId] = round($value / $totalAggregatedItemsValue * $aggregatedTotal, 2);
                         $totalDuty[$itemId] = round($value / $totalAggregatedItemsValue * $aggregatedDuty, 2);
                         $totalSalesTaxes[$itemId] = round($value / $totalAggregatedItemsValue * $aggregatedSalesTax, 2);
                     }
                 }
                 foreach ($invoice->getAllItems() as $invoiceItem) {
                     if ($invoiceItem->getOrderItem()->getParentItemId()) {
                         continue;
                     }
                     $id = $invoiceItem->getOrderItem()->getQuoteItemId();
                     if (isset($taxes[$id])) {
                         $invoiceItem->setImportDutyTax($totals[$id]);
                         $invoiceItem->setBaseImportDutyTax($helper->convertPrice($currencyFrom, $currencyTo, $totals[$id]));
                         $invoiceItem->setImportDuty($totalDuty[$id]);
                         $invoiceItem->setBaseImportDuty($helper->convertPrice($currencyFrom, $currencyTo, $totalDuty[$id]));
                         $invoiceItem->setSalesTax($totalSalesTaxes[$id]);
                         $invoiceItem->setBaseSalesTax($helper->convertPrice($currencyFrom, $currencyTo, $totalSalesTaxes[$id]));
                     }
                     if ($invoiceItem->getQty() == 0) {
                         $invoiceItem->setImportDutyTax(0);
                         $invoiceItem->setBaseImportDutyTax(0);
                         $invoiceItem->setImportDuty(0);
                         $invoiceItem->setBaseImportDuty(0);
                         $invoiceItem->setSalesTax(0);
                         $invoiceItem->setBaseSalesTax(0);
                     }
                 }
             }
         }
     }
     return $this;
 }
 public static function invoiceCalculation(Mage_Sales_Model_Order_Invoice $invoice)
 {
     $params = array();
     /* @var $helper Dutycalculator_Charge_Helper_Data */
     $helper = Mage::helper('dccharge');
     $invoiceItems = $invoice->getAllItems();
     $params['calculation_id'] = $invoice->getOrder()->getDcOrderId();
     $orderShippingAmount = (double) $invoice->getOrder()->getShippingAmount();
     if ($orderShippingAmount) {
         foreach ($invoice->getOrder()->getInvoiceCollection() as $previusInvoice) {
             if ($previusInvoice->getShippingAmount() && $previusInvoice->getDcOrderId() != 0 && !$previusInvoice->isCanceled()) {
                 $orderShippingAmount = 0;
             }
         }
     } else {
         $orderShippingAmount = 0;
     }
     $params['shipping'] = $orderShippingAmount;
     $params['output_currency'] = $invoice->getOrderCurrencyCode();
     $params['cat'] = array();
     $params['qty'] = array();
     $params['reference'] = array();
     $idx = 0;
     $itemsToSend = 0;
     foreach ($invoiceItems as $invoiceItem) {
         $orderItem = $invoiceItem->getOrderItem();
         $product = Mage::getModel('catalog/product')->load($orderItem->getProductId());
         $qty = $invoiceItem->getQty();
         if ($orderItem->getParentItemId() || !$orderItem->getQuoteItemId() || $product->isVirtual() || $qty <= 0) {
             continue;
         }
         $itemsToSend++;
         /* @var $invoiceItem Mage_Sales_Model_Order_Invoice_Item */
         /* @var $product Mage_Catalog_Model_Product */
         $params['qty'][$idx] = (double) $qty;
         $params['reference'][$idx] = $orderItem->getQuoteItemId();
         if ($product->getDcProductId()) {
             $params['cat'][$idx] = $product->getDcProductId();
         } else {
             $params['cat'][$idx] = '';
         }
         $idx++;
     }
     if ($itemsToSend > 0) {
         $rawXml = $helper->sendRequest('invoice_calculation', $params);
         try {
             if (stripos($rawXml, '<?xml') === false) {
                 throw new Exception($rawXml);
             }
             $answer = new SimpleXMLElement($rawXml);
             $answerAttributes = $answer->attributes();
             $dcOrderId = (int) $answerAttributes['id'];
             $totals = current($answer->xpath('total-charges'));
             $items = $answer->xpath('item');
             $result = array();
             $result['dc_order_id'] = $dcOrderId;
             $result['total'] = (double) $totals->total->amount;
             $result['duty'] = (double) $totals->duty->amount;
             $additionalTaxes = $totals->xpath('additional-import-taxes');
             if ($additionalTaxes) {
                 $additionalTaxes = current($additionalTaxes);
                 foreach ($additionalTaxes->tax as $additionalTax) {
                     $result['duty'] += (double) $additionalTax->amount;
                 }
             }
             $result['sales_tax'] = (double) current($totals->xpath('sales-tax'))->amount;
             $result['items'] = array();
             $result['aggregated_items'] = array();
             foreach ($items as $item) {
                 $attributes = $item->attributes();
                 $references = explode(',', (string) $attributes->reference);
                 if (count($references) > 1) {
                     $total = (double) $item->total->amount;
                     $duty = (double) $item->duty->amount;
                     $additionalTaxes = $item->xpath('additional-import-taxes');
                     if ($additionalTaxes) {
                         $additionalTaxes = current($additionalTaxes);
                         foreach ($additionalTaxes->tax as $additionalTax) {
                             $duty += (double) $additionalTax->amount;
                         }
                     }
                     $salesTax = (double) current($item->xpath('sales-tax'))->amount;
                     $result['aggregated_items'][(string) $attributes->reference] = array('items' => $references, 'aggregated_total' => $total, 'aggregated_duty' => $duty, 'aggregated_sales_tax' => $salesTax);
                 } else {
                     $total = (double) $item->total->amount;
                     $duty = (double) $item->duty->amount;
                     $additionalTaxes = $item->xpath('additional-import-taxes');
                     if ($additionalTaxes) {
                         $additionalTaxes = current($additionalTaxes);
                         foreach ($additionalTaxes->tax as $additionalTax) {
                             $duty += (double) $additionalTax->amount;
                         }
                     }
                     $salesTax = (double) current($item->xpath('sales-tax'))->amount;
                     $result['items'][(string) $attributes->reference] = array('total' => $total, 'duty' => $duty, 'sales_tax' => $salesTax);
                 }
             }
             return $result;
         } catch (Exception $ex) {
             $result = array();
             $result['failed_calculation'] = 1;
             $result['dc_order_id'] = 0;
             $result['total'] = 0;
             $result['duty'] = 0;
             $result['sales_tax'] = 0;
             $result['items'] = array();
             $result['aggregated_items'] = array();
             return $result;
         }
     } else {
         return false;
     }
 }
Esempio n. 4
0
 /**
  * Gets all needed Informations for shopping-basket Block of the Request
  *
  * @param Mage_Sales_Model_Quote|Mage_Sales_Model_Order|Mage_Sales_Model_Order_Invoice|Mage_Sales_Model_Order_Creditmemo $object
  * @param float $amount
  * @param array $articleList
  * @return array
  */
 public function getRequestBasket($object, $amount = '', $articleList = '')
 {
     $basket = array();
     if ($object instanceof Mage_Sales_Model_Order) {
         $basket['currency'] = $object->getOrderCurrencyCode();
     } else {
         if ($object instanceof Mage_Sales_Model_Quote) {
             $basket['currency'] = $object->getQuoteCurrencyCode();
         } else {
             $basket['currency'] = $object->getOrder()->getOrderCurrencyCode();
         }
     }
     if ($articleList != '') {
         $basket['items'] = $articleList;
     } else {
         $basket['items'] = $this->getArticles($object);
     }
     // If no positiv item is remained in basket clear basket
     if (!$this->_anyPositiveItems($basket['items'])) {
         $basket['items'] = array();
     }
     if (is_numeric($amount)) {
         $basket['amount'] = $amount;
     } else {
         if ($object->getGrandTotal() > 0) {
             $basket['amount'] = $object->getGrandTotal();
         } elseif (count($basket['items']) == 0) {
             $basket['amount'] = 0;
         } else {
             $basket['amount'] = $this->getAmountByItems($basket['items']);
         }
     }
     // Ensure that the basket amount is never less than zero
     // In certain cases (i.e. in case of maloperation) the amount can become < 0
     if ($basket['amount'] < 0) {
         $basket['amount'] = 0;
     }
     return $basket;
 }