protected function handleTransactionHook(IPkgShopPaymentIPNHandler $oHandler, TPkgShopPaymentIPNRequest $oRequest)
    {
        $oOrder = $oRequest->getOrder();
        if (null === $oOrder) {
            return;
        }

        $oTransactionDetails = $oHandler->getIPNTransactionDetails($oRequest);
        if (null === $oTransactionDetails) {
            return;
        }

        $oTransactionManager = new TPkgShopPaymentTransactionManager($oOrder);

        $sStatus = '';
        $oStatus = $oRequest->getIpnStatus();
        if (null !== $oStatus) {
            $sStatus = $oStatus->fieldCode;
        }

        $oTransaction = null;
        // try to update the corresponding transaction first
        if (null !== $oTransactionDetails->getSequenceNumber()) {
            $oTransaction = $oTransactionManager->confirmTransaction(
                $oTransactionDetails->getSequenceNumber(),
                $oTransactionDetails->getTransactionTimestamp()
            );
        }

        if (null === $oTransaction) {
            \ChameleonSystem\CoreBundle\ServiceLocator::get('monolog.logger.order_payment_ipn')->warning(
                "IPN had transaction data but no matching transaction was found. order-id: {$oOrder->id}, ordernumber: {$oOrder->fieldOrdernumber}",
                array('request' => $oRequest->getRequestPayload())
            );
        }
    }