/**
  * Validate PayPal transaction
  *
  * @param array  $data
  * @param string $currency
  * @param Crowdfunding\Payment\Session  $paymentSession
  *
  * @return array|null
  */
 protected function validateData($data, $currency, $paymentSession)
 {
     $parentId = Joomla\Utilities\ArrayHelper::getValue($data, 'parent_txn_id', '', 'string');
     if ($parentId !== '') {
         $transaction = new Crowdfunding\Transaction(JFactory::getDbo());
         $transaction->load(array('txn_id' => $parentId));
         $investorId = (int) $transaction->getInvestorId();
         $projectId = (int) $transaction->getProjectId();
         $rewardId = (int) $transaction->getRewardId();
     } else {
         $investorId = (int) $paymentSession->getUserId();
         $projectId = (int) $paymentSession->getProjectId();
         $rewardId = $paymentSession->isAnonymous() ? 0 : (int) $paymentSession->getRewardId();
     }
     $txnDate = Joomla\Utilities\ArrayHelper::getValue($data, 'payment_date');
     $date = new JDate($txnDate);
     // Get additional information from transaction.
     $extraData = $this->prepareExtraData($data);
     // Prepare transaction data
     $transaction = array('investor_id' => $investorId, 'project_id' => $projectId, 'reward_id' => $rewardId, 'service_provider' => $this->serviceProvider, 'service_alias' => $this->serviceAlias, 'txn_id' => Joomla\Utilities\ArrayHelper::getValue($data, 'txn_id', '', 'string'), 'parent_txn_id' => $parentId, 'txn_amount' => Joomla\Utilities\ArrayHelper::getValue($data, 'mc_gross', 0, 'float'), 'txn_currency' => Joomla\Utilities\ArrayHelper::getValue($data, 'mc_currency', '', 'string'), 'txn_status' => JString::strtolower(Joomla\Utilities\ArrayHelper::getValue($data, 'payment_status', '', 'string')), 'txn_date' => $date->toSql(), 'status_reason' => $this->getStatusReason($data), 'extra_data' => $extraData);
     // Check Project ID and Transaction ID
     if (!$transaction['project_id'] or !$transaction['txn_id']) {
         // Log data in the database
         $this->log->add(JText::_($this->textPrefix . '_ERROR_INVALID_TRANSACTION_DATA'), $this->debugType, $transaction);
         return null;
     }
     // Check currency
     if (strcmp($transaction['txn_currency'], $currency) !== 0) {
         // Log data in the database
         $this->log->add(JText::_($this->textPrefix . '_ERROR_INVALID_TRANSACTION_CURRENCY'), $this->debugType, array('TRANSACTION DATA' => $transaction, 'CURRENCY' => $currency));
         return null;
     }
     // Check receiver
     $allowedReceivers = array(JString::strtolower(Joomla\Utilities\ArrayHelper::getValue($data, 'business')), JString::strtolower(Joomla\Utilities\ArrayHelper::getValue($data, 'receiver_email')), JString::strtolower(Joomla\Utilities\ArrayHelper::getValue($data, 'receiver_id')));
     if ($this->params->get('paypal_sandbox', 1)) {
         $receiver = JString::strtolower(JString::trim($this->params->get('paypal_sandbox_business_name')));
     } else {
         $receiver = JString::strtolower(JString::trim($this->params->get('paypal_business_name')));
     }
     if (!in_array($receiver, $allowedReceivers, true)) {
         // Log data in the database
         $this->log->add(JText::_($this->textPrefix . '_ERROR_INVALID_RECEIVER'), $this->debugType, array('TRANSACTION DATA' => $data, 'RECEIVER' => $receiver, 'RECEIVER DATA' => $allowedReceivers));
         return null;
     }
     return $transaction;
 }