/**
  * Send void request to MerchantWare gateway
  *
  * @param Mage_Payment_Model_Info $payment
  * @return $result
  * @throws Mage_Core_Exception
  */
 private function _void($payment)
 {
     $error = false;
     $soapClient = $this->getSoapApi();
     $this->iniRequest();
     //Add token
     if ($payment->getParentTransactionId() !== FALSE) {
         $this->_request->token = $payment->getParentTransactionId();
     } else {
         //Cannot void
         $error = Mage::helper('merchantware_directpost')->__('No previous transactions could be found.  Cannot void this transaction.');
         Mage::throwException($error);
     }
     //Add order info
     $order = $payment->getOrder();
     $this->_request->merchantTransactionId = $order->getIncrementId();
     $additionalInfo = array();
     try {
         $result = $soapClient->Void($this->_request);
         $result = $result->VoidResult;
         if (!empty($result->ErrorMessage)) {
             $additionalInfo['ErrorMessage'] = $result->ErrorMessage;
         }
         //Authorization is approved.
         $additionalInfo['ApprovalStatus'] = $result->ApprovalStatus;
         $additionalInfo['Amount'] = $result->Amount;
         $additionalInfo['AuthorizationCode'] = $result->AuthorizationCode;
         if (!empty($result->Cardholder)) {
             $additionalInfo['Cardholder'] = $result->Cardholder;
         }
         if (!empty($result->AvsResponse)) {
             $additionalInfo['AvsResponse'] = $result->AvsResponse;
         }
         if (!empty($result->CvResponse)) {
             $additionalInfo['CvResponse'] = $result->AvsResponse;
         }
         $additionalInfo['CardType'] = $result->CardType;
         if (!empty($result->InvoiceNumber)) {
             $additionalInfo['InvoiceNumber'] = $result->InvoiceNumber;
         }
         $additionalInfo['Token'] = $result->Token;
         $additionalInfo['TransactionDate'] = $result->TransactionDate;
         $additionalInfo['TransactionType'] = $result->TransactionType;
         if (!empty($result->ExtraData)) {
             $additionalInfo['ExtraData'] = $result->ExtraData;
         }
         switch ($this->_parseApprovalStatus($result->ApprovalStatus)) {
             case self::APPROVAL_STATUS_APPROVED:
                 //Void Approved.
                 $message = 'Type: Void | ApprovalStatus: ' . $result->ApprovalStatus . ' |  Amount: ' . $result->Amount;
                 $payment->setSkipTransactionCreation(false);
                 $payment->setTransactionId($result->Token)->addTransaction(Mage_Sales_Model_Order_Payment_Transaction::TYPE_VOID, null, false, $message)->setTransactionAdditionalInfo(Mage_Sales_Model_Order_Payment_Transaction::RAW_DETAILS, $additionalInfo)->setIsTransactionClosed(1)->save();
                 break;
             case self::APPROVAL_STATUS_DECLINED:
             case self::APPROVAL_STATUS_DECLINED_DUPLICATE:
             case self::APPROVAL_STATUS_FAILED:
                 $error = Mage::helper('merchantware_directpost')->__('Void request failed.  Gateway error response: %s', $result->ApprovalStatus, $result->ErrorMessage);
                 Mage::throwException($error);
                 break;
             case self::APPROVAL_STATUS_REFERRAL:
             default:
                 $error = Mage::helper('merchantware_directpost')->__('Unable to void this transaction. Gateway approval status: %s | Gateway error response: %s', $result->ApprovalStatus, $result->ErrorMessage);
                 Mage::throwException($error);
                 break;
         }
         return $result;
     } catch (Exception $e) {
         Mage::throwException(Mage::helper('merchantware_directpost')->__('Gateway request error: %s', $e->getMessage()));
     }
     if ($error !== false) {
         Mage::throwException($error);
     }
     return false;
 }