/**
  * notification about status change
  */
 public function notificationAction()
 {
     set_error_handler('sofort_notification_error');
     // prevent to submit confirm/cancel back
     $GLOBALS['isNotificationAction'] = true;
     $response = $this->getRequest()->getParams();
     $orderId = $response['orderId'];
     $secret = $response['secret'];
     // read notofication
     $sofort = new SofortLib_Notification();
     $transaction = $sofort->getNotification();
     //no valid parameters/xml
     if (empty($orderId) || empty($transaction)) {
         Mage::log('Notification invalid: ' . __CLASS__ . ' ' . __LINE__ . " - " . $orderId . " - " . $transaction);
         return;
     }
     if ($sofort->isError()) {
         Mage::log($sofort->getError(), Zend_Log::ERR, 'sofort_error.log');
     }
     // load current transaction data
     $transData = new SofortLib_TransactionData(Mage::getStoreConfig('payment/sofort/configkey'));
     $transData->setTransaction($transaction)->sendRequest();
     if ($transData->isError()) {
         Mage::log('Notification invalid: ' . __CLASS__ . ' ' . __LINE__ . $transData->getError());
         return;
     }
     $order = Mage::getModel('sales/order');
     $order->loadByIncrementId($orderId);
     $paymentObj = $order->getPayment()->getMethodInstance();
     $payment = $order->getPayment();
     //data of transaction doesn't match order
     if ($payment->getAdditionalInformation('sofort_transaction') != $transaction || $payment->getAdditionalInformation('sofort_secret') != $secret) {
         Mage::log('Notification invalid: ' . __CLASS__ . ' ' . __LINE__);
         return;
     }
     // BUGFIX
     // if notification for confirm + refund got the same, we need to confirm first
     if ($transData->isSofortrechnung() && $transData->isRefunded() && !$order->hasInvoices()) {
         $this->_transactionConfirmed($transData, $order, true);
         // reload order
         $order = Mage::getModel('sales/order');
         $order->loadByIncrementId($orderId);
     }
     // check if order was edit
     $sofortRechnung = Mage::getModel('pnsofortueberweisung/sofortrechnung');
     $sofortRechnung->updateOrderFromTransactionData($transData, $order);
     // check if something other change
     if ($payment->getAdditionalInformation('sofort_lastchanged') === $this->_getLastChanged($transData)) {
         return;
     }
     $payment->setAdditionalInformation('sofort_lastchanged', $this->_getLastChanged($transData))->save();
     // kauf auf Rechnung
     if ($transData->isSofortrechnung()) {
         if ($transData->isLoss()) {
             $this->_transactionLoss($transData, $order);
         } elseif ($transData->isPending() && $transData->getStatusReason() == 'confirm_invoice') {
             $this->_transactionUnconfirmed($transData, $order);
         } elseif ($transData->isPending()) {
             $this->_transactionConfirmed($transData, $order);
         } elseif ($transData->isReceived()) {
             //don't do anything
         } elseif ($transData->isRefunded()) {
             $this->_transactionRefunded($transData, $order);
         } else {
             //uups
             $order->addStatusHistoryComment($transData->getStatus() . " " . $transData->getStatusReason());
         }
         // sofortueberweisung, lastschrift
     } else {
         if ($transData->isLoss()) {
             $this->_transactionLoss($transData, $order);
         } elseif ($transData->isPending()) {
             $this->_transactionConfirmed($transData, $order);
         } elseif ($transData->isReceived()) {
             // no status change on received
             $this->_transactionReceived($transData, $order);
         } elseif ($transData->isRefunded()) {
             $this->_transactionRefunded($transData, $order);
         } else {
             //uups
             $order->addStatusHistoryComment($transData->getStatus() . " " . $transData->getStatusReason());
         }
     }
     $order->save();
 }