Example #1
0
 /**
  * Capture payment through Paynova api
  *
  * @param Varien_Object $payment
  * @param decimal $amount
  * @return Paynova_Paynovapayment_Model_Abstract
  */
 public function captureInvoice(Varien_Object $payment)
 {
     $transaction = Mage::getModel('sales/order_payment_transaction')->getCollection()->addAttributeToFilter('order_id', array('eq' => $payment->getOrder()->getEntityId()))->getLastItem();
     $addData = $transaction->getAdditionalInformation(Mage_Sales_Model_Order_Payment_Transaction::RAW_DETAILS);
     $transaction_id = $addData['transID'];
     if (empty($transaction_id)) {
         $transaction_id = Mage::getSingleton('core/session')->getTransactionID();
     }
     if (empty($transaction_id)) {
         Mage::helper('paynovapayment')->log("Error. Missing transaction ID from order and cannot do capture.");
         Mage::throwException(Mage::helper('paynovapayment')->__('Error. Missing transaction ID.'));
     }
     $invoice = $payment->getCurrentInvoice();
     $transInformation = $payment->getTransaction($transaction_id)->getAdditionalInformation();
     $order_id = $transInformation['raw_details_info']['order_id'];
     $order_number = $transInformation['raw_details_info']['order_number'];
     $order = Mage::getModel('sales/order');
     $order->loadByIncrementId($order_number);
     $res['orderId'] = $order_id;
     $res['transactionId'] = $transaction_id;
     $res['totalAmount'] = $invoice->getGrandTotal();
     $res['invoiceId'] = $transaction_id;
     $items = $invoice->getAllItems();
     $itemcount = count($items);
     $data = array();
     $i = 0;
     $linenumber = 1;
     $unitMeasure = Mage::getStoreConfig('paynovapayment/advanced_settings/product_unit');
     if (empty($unitMeasure)) {
         $unitMeasure = "pcs";
     }
     $shippingname = Mage::getStoreConfig('paynovapayment/advanced_settings/shipping_name');
     if (empty($shippingname)) {
         $shippingname = "Shipping";
     }
     $shippingsku = Mage::getStoreConfig('paynovapayment/advanced_settings/shipping_sku');
     if (empty($shippingsku)) {
         $shippingsku = "Shipping";
     }
     foreach ($items as $itemId => $item) {
         $orderItem = $item->getOrderItem();
         $product = Mage::helper('catalog/product')->getProduct($item->getSku(), Mage::app()->getStore()->getId(), 'sku');
         $productUrl = Mage::getUrl($product->getUrlPath());
         $description = $product->getShortDescription();
         if (empty($description)) {
             $description = $orderItem->getName();
         }
         $itemtype = $orderItem->getProductType();
         $lineqty = intval($item->getQty());
         // if product has parent - get parent qty
         if ($item->getParentItemID() and $item->getParentItemID() > 0) {
             $parentQuoteItem = Mage::getModel("sales/quote_item")->load($item->getParentItemID());
             $parentqty = intval($parentQuoteItem->getQty());
             $lineqty = $lineqty * $parentqty;
         }
         $lineprice = $orderItem->getPrice();
         $linetax = $orderItem->getTaxPercent();
         $unitAmountExcludingTax = $orderItem->getPrice();
         $linetaxamount = $lineqty * $lineprice * ($linetax / 100);
         $linetotalamount = $lineqty * $unitAmountExcludingTax + $linetaxamount;
         // If item has discount
         if ($orderItem->getDiscountAmount() and $orderItem->getDiscountAmount() > 0) {
             $linediscountamount = $orderItem->getDiscountAmount();
             $itemdiscount = $linediscountamount / $lineqty;
             $unitAmountExcludingTax = $lineprice - $itemdiscount;
             $linetaxamount = $lineqty * $unitAmountExcludingTax * ($linetax / 100);
             $total1 = $lineqty * $unitAmountExcludingTax;
             $linetotalamount = $total1 + $linetaxamount;
             $linetax1 = $lineqty * $unitAmountExcludingTax;
             $linetax2 = $linetax / 100;
             $linetaxamount = $linetax1 * $linetax2;
         }
         $res['lineItems'][$itemId]['id'] = $linenumber;
         $res['lineItems'][$itemId]['articleNumber'] = substr($orderItem->getSku(), 0, 50);
         $res['lineItems'][$itemId]['name'] = $item->getName();
         $res['lineItems'][$itemId]['quantity'] = $lineqty;
         $res['lineItems'][$itemId]['unitMeasure'] = $unitMeasure;
         $res['lineItems'][$itemId]['description'] = $description;
         $res['lineItems'][$itemId]['productUrl'] = $productUrl;
         if ($itemtype == "bundle") {
             $res['lineItems'][$itemId]['unitAmountExcludingTax'] = 0;
             $res['lineItems'][$itemId]['taxPercent'] = 0;
             $res['lineItems'][$itemId]['totalLineTaxAmount'] = 0;
             $res['lineItems'][$itemId]['totalLineAmount'] = 0;
         } else {
             $res['lineItems'][$itemId]['unitAmountExcludingTax'] = round($unitAmountExcludingTax, 2);
             $res['lineItems'][$itemId]['taxPercent'] = round($linetax, 2);
             $res['lineItems'][$itemId]['totalLineTaxAmount'] = round($linetaxamount, 2);
             $res['lineItems'][$itemId]['totalLineAmount'] = round($linetotalamount, 2);
         }
         $i++;
         $linenumber++;
     }
     if ($order->getShippingAmount() and $order->getShippingAmount() > 0) {
         $quoteid = $order->getQuoteId();
         $quote = Mage::getModel('sales/quote')->load($quoteid);
         $itemId++;
         $res['lineItems'][$itemId]['id'] = $linenumber;
         $res['lineItems'][$itemId]['articleNumber'] = substr($shippingsku, 0, 50);
         $res['lineItems'][$itemId]['name'] = $shippingname;
         $res['lineItems'][$itemId]['quantity'] = 1;
         $res['lineItems'][$itemId]['unitMeasure'] = $unitMeasure;
         $res['lineItems'][$itemId]['unitAmountExcludingTax'] = round($order->getShippingAmount(), 2);
         $res['lineItems'][$itemId]['taxPercent'] = Mage::helper('paynovapayment')->getShippingTaxPercentFromQuote($quote);
         $res['lineItems'][$itemId]['totalLineTaxAmount'] = round($order->getShippingTaxAmount(), 2);
         $res['lineItems'][$itemId]['totalLineAmount'] = round($order->getShippingInclTax(), 2);
         $res['lineItems'][$itemId]['description'] = $description;
         $res['lineItems'][$itemId]['productUrl'] = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);
     }
     $output = $this->setCurlCall($res, '/orders/' . $order_id . '/transactions/' . $transaction_id . '/finalize/' . $res['totalAmount']);
     $order->save();
     $status = $output->status;
     if ($status->statusKey == 'PAYMENT_COMPLETED') {
         $status->isSuccess = true;
         $output->transactionId = 'Order has been finalized';
     }
     if ($status->isSuccess) {
         $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING);
         $order->save();
         $payment->setStatus(self::STATUS_APPROVED)->setTransactionId($output->transactionId)->setIsTransactionClosed(0);
         return $status->isSuccess;
     } else {
         $error = $status->statusMessage;
         $order->setState(Mage_Sales_Model_Order::STATE_PENDING_PAYMENT, Mage_Sales_Model_Order::STATE_PENDING_PAYMENT, Mage::helper('paynovapayment')->__($error));
         $order->save();
         Mage::throwException("{$error}");
         $this->_redirect('checkout/onepage');
     }
 }