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