/**
  * Void/Cancel
  */
 protected function _void(Varien_Object $payment)
 {
     $orderTransaction = $payment->lookupTransaction(false, Mage_Sales_Model_Order_Payment_Transaction::TYPE_ORDER);
     if (!$orderTransaction) {
         $orderTransactionId = $payment->getAdditionalInformation('order_reference');
     } else {
         $orderTransactionId = $orderTransaction->getTxnId();
     }
     if ($orderTransaction) {
         $this->_getApi()->cancelOrderReference($orderTransactionId);
     }
     return $this;
 }
 /**
  * Void payment
  *
  * @param Mage_Sales_Model_Order_Payment $payment
  * @return Mage_Paypal_Model_Express
  */
 public function void(Varien_Object $payment)
 {
     //Switching to order transaction if needed
     if ($payment->getAdditionalInformation($this->_isOrderPaymentActionKey) && !$payment->getVoidOnlyAuthorization()) {
         $orderTransaction = $payment->lookupTransaction(false, Mage_Sales_Model_Order_Payment_Transaction::TYPE_ORDER);
         if ($orderTransaction) {
             $payment->setParentTransactionId($orderTransaction->getTxnId());
             $payment->setTransactionId($orderTransaction->getTxnId() . '-void');
         }
     }
     $this->_pro->void($payment);
     return $this;
 }
 /**
  * Refund the last successful transaction
  *
  * @param Varien_Object|Mage_Sales_Model_Order_Payment $payment
  * @param float $amount
  *
  * @return EMerchantPay_Genesis_Model_Direct
  */
 public function refund(Varien_Object $payment, $amount)
 {
     Mage::log('Refund transaction for order #' . $payment->getOrder()->getIncrementId());
     try {
         $this->getHelper()->initClient($this->getCode());
         $capture = $payment->lookupTransaction(null, Mage_Sales_Model_Order_Payment_Transaction::TYPE_CAPTURE);
         $reference_id = $capture->getTxnId();
         $genesis = new \Genesis\Genesis('Financial\\Refund');
         $genesis->request()->setTransactionId($this->getHelper()->genTransactionId($payment->getOrder()->getIncrementId()))->setRemoteIp($this->getHelper('core/http')->getRemoteAddr(false))->setReferenceId($reference_id)->setCurrency($payment->getOrder()->getBaseCurrencyCode())->setAmount($amount);
         $genesis->execute();
         $payment->setTransactionId($genesis->response()->getResponseObject()->unique_id)->setParentTransactionId($reference_id)->setShouldCloseParentTransaction(true)->setTransactionAdditionalInfo(array(Mage_Sales_Model_Order_Payment_Transaction::RAW_DETAILS => $this->getHelper()->getArrayFromGatewayResponse($genesis->response()->getResponseObject())), null);
         $payment->save();
     } catch (Exception $exception) {
         Mage::logException($exception);
         Mage::throwException($exception->getMessage());
     }
     return $this;
 }