/** * 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'); } }