/** * Get payflow transaction id from parent transaction * * @param Varien_Object $payment * @return string */ protected function _getParentTransactionId(Varien_Object $payment) { if ($payment->getParentTransactionId()) { return $payment->getTransaction($payment->getParentTransactionId())->getAdditionalInformation(Mage_PaypalUk_Model_Pro::TRANSPORT_PAYFLOW_TXN_ID); } return $payment->getParentTransactionId(); }
public function wasLastTxnLessThan24HrsAgo(Varien_Object $payment) { $lastTxnId = $payment->getLastTransId(); $lastTxn = $payment->getTransaction($lastTxnId); $timeOfLastTxn = $lastTxn->getData('created_at'); //check if last txn was less than 24 hrs ago (86400 seconds == 24 hrs) return time() - strtotime($timeOfLastTxn) < 86400; }
/** * 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'); } }
/** * Cancel payment * @param Varien_Object $payment * @return $this */ public function cancel(Varien_Object $payment) { Mage::helper('payex/tools')->addToDebug('Action: Cancel'); if (!$payment->getLastTransId()) { Mage::throwException(Mage::helper('paygate')->__('Invalid transaction ID.')); } // Load transaction Data $transactionId = $payment->getLastTransId(); $transaction = $payment->getTransaction($transactionId); if (!$transaction) { Mage::throwException(Mage::helper('payex')->__('Can\'t load last transaction.')); } // Get Transaction Details $details = $this->fetchTransactionInfo($payment, $transactionId); // Not to execute for Sale transactions if ((int) $details['transactionStatus'] !== 3) { Mage::throwException(Mage::helper('payex')->__('Unable to execute cancel.')); } $transactionNumber = $details['transactionNumber']; $order_id = $details['orderId']; if (!$order_id) { $order_id = $payment->getOrder()->getId(); } // Call PXOrder.Cancel2 $params = array('accountNumber' => '', 'transactionNumber' => $transactionNumber); $result = Mage::helper('payex/api')->getPx()->Cancel2($params); Mage::helper('payex/tools')->addToDebug('PxOrder.Cancel2:' . $result['description'], $order_id); // Check Results if ($result['code'] === 'OK' && $result['errorCode'] === 'OK' && $result['description'] === 'OK') { // Add Cancel Transaction $payment->setStatus(self::STATUS_DECLINED)->setTransactionId($result['transactionNumber'])->setIsTransactionClosed(1); // Closed // Add Transaction fields $payment->setAdditionalInformation(Mage_Sales_Model_Order_Payment_Transaction::RAW_DETAILS, $result); return $this; } // Show Error Mage::helper('payex/tools')->throwPayExException($result, 'PxOrder.Cancel2'); return $this; }
/** * CardSave VOID functionality * Note: if a transaction (payment) is once voided (canceled) it isn't possible to redo this action * * @param Varien_Object $payment * @return unknown */ public function csvVoid(Varien_Object $payment) { $error = false; $szTransactionType = "VOID"; $orderStatus = "csv_voided"; $arAdditionalInformationArray; // attempt a VOID and accordingly to the last saved transaction id (CrossReference) set the new message $szLastTransId = $payment->getLastTransId(); $transaction = $payment->getTransaction($szLastTransId); $szMagentoTxnType = $transaction->getTxnType(); $szMessage = "Payment voided"; if ($szMagentoTxnType == "capture") { $szMessage = "Payment voided"; } else { if ($szMagentoTxnType == "authorization") { $szMessage = "PreAuthorization voided"; } else { if ($szMagentoTxnType == "refund") { $szMessage = "Refund voided"; } else { // general message $szMessage = "Payment voided"; } } } $error = $this->_runCrossReferenceTransaction($payment, $szTransactionType); if ($error === false) { $order = $payment->getOrder(); $invoices = $order->getInvoiceCollection(); $payment = $order->getPayment(); $arAdditionalInformationArray = $payment->getAdditionalInformation(); $arAdditionalInformationArray["Voided"] = 1; $payment->setAdditionalInformation($arAdditionalInformationArray); $payment->save(); // cancel the invoices foreach ($invoices as $invoice) { $invoice->cancel(); $invoice->save(); } // udpate the order $order->setActionBy($payment->getLggdInAdminUname())->setActionDate(date('Y-m-d H:i:s'))->setVoided(1)->setState('canceled', $orderStatus, $szMessage, false); $order->save(); $result = "0"; } else { $result = $error; } return $result; }