示例#1
0
文件: Fraud.php 项目: arbi/MyCode
 /**
  * @param int $reservationId
  * @return array
  * @throws \Exception
  */
 public function getFraudForReservation($reservationId)
 {
     if (!$reservationId) {
         throw new \Exception('Invalid Data for Fraud detection');
     }
     $fraudValue = $blackListValue = 0;
     $fraudText = '';
     $linkTicket = '<a href="/booking/edit/%s" target="_blank">%s</a>' . "\n";
     /**
      * @var $fraudDetectionDao FraudDetection
      */
     // No Real Time Detection. Fraud Detection for Credit Card and HolderName <-> FullName
     $fraudDetectionDao = $this->getServiceLocator()->get('dao_booking_fraud_detection');
     $fraudCCData = $fraudDetectionDao->getFraudByReservationId($reservationId);
     if ($fraudCCData->count()) {
         foreach ($fraudCCData as $row) {
             switch ($row['type']) {
                 case self::FRAUD_TYPE_FULLNAME_HOLDERNAME:
                     $fraudText .= TextConstants::FRAUD_NAME_HOLDER . '<br>';
                     $fraudValue += Objects::getFraudValue()['name_holder'];
                     break;
             }
         }
     }
     // credit cards with status "Fraud"
     // if there is one cc with status "Fraud" fraud score will be incremented by 100
     $reservationsDao = new BookingDao($this->getServiceLocator(), '\\ArrayObject');
     $customerId = $reservationsDao->getCustomerIdByReservationId($reservationId);
     /**
      * @var Token $tokenDao
      */
     $tokenDao = $this->getServiceLocator()->get('dao_cc_token');
     $customerFraudCreditCards = $tokenDao->fetchAll(['customer_id' => $customerId, 'status' => CardService::CC_STATUS_FRAUD], ['id']);
     if ($customerFraudCreditCards->count()) {
         $fraudText .= TextConstants::FRAUD_CREDIT_CARD . '<br>';
         $fraudValue += Objects::getFraudValue()['credit_card'];
     }
     // Real Time Fraud Detection from blacklist
     $data = $this->getFraudCombinationAndData($reservationId);
     /**
      * @var $blackListDao BlackList
      */
     $blackListDao = $this->getServiceLocator()->get('dao_booking_black_list');
     $blackListResult = $blackListDao->getBlackList(['fullName' => $data['fullName'], 'fullNamePhone' => $data['fullNamePhone'], 'fullNameAddress' => $data['fullNameAddress'], 'email' => $data['guest_email'], 'phone' => $data['phone']]);
     if ($blackListResult->count()) {
         $blackListArr = [];
         foreach ($blackListResult as $row) {
             $blackListArr[$row['type']] = $row;
         }
         // Filtering duplicates.
         if (!empty($blackListArr[self::FRAUD_TYPE_FULLNAME_PHONE])) {
             unset($blackListArr[self::FRAUD_TYPE_PHONE]);
             unset($blackListArr[self::FRAUD_TYPE_FULLNAME]);
         }
         foreach ($blackListArr as $row) {
             switch ($row['type']) {
                 case self::FRAUD_TYPE_EMAIL:
                     $fraudText .= $reservationId != $row['reservation_id'] ? sprintf($linkTicket, $row['res_number'], TextConstants::FRAUD_BLACKLIST_EMAIL) : TextConstants::FRAUD_BLACKLIST_EMAIL . "\n";
                     $fraudText .= '<br>';
                     $blackListValue = Objects::getFraudValue()['black_list'];
                     break;
                 case self::FRAUD_TYPE_FULLNAME_PHONE:
                     $fraudText .= $reservationId != $row['reservation_id'] ? sprintf($linkTicket, $row['res_number'], TextConstants::FRAUD_BLACKLIST_NSP) : TextConstants::FRAUD_BLACKLIST_NSP . "\n";
                     $fraudText .= '<br>';
                     $blackListValue = Objects::getFraudValue()['black_list'];
                     break;
                 case self::FRAUD_TYPE_FULLNAME_ADDRESS:
                     $fraudText .= $reservationId != $row['reservation_id'] ? sprintf($linkTicket, $row['res_number'], TextConstants::FRAUD_BLACKLIST_NSA) : TextConstants::FRAUD_BLACKLIST_NSA . "\n";
                     $fraudText .= '<br>';
                     $blackListValue = Objects::getFraudValue()['black_list'];
                     break;
                 case self::FRAUD_TYPE_FULLNAME:
                     $fraudText .= $reservationId != $row['reservation_id'] ? sprintf($linkTicket, $row['res_number'], TextConstants::FRAUD_BLACKLIST_NS) : TextConstants::FRAUD_BLACKLIST_NS . "\n";
                     $fraudText .= '<br>';
                     $blackListValue = Objects::getFraudValue()['full_name'];
                     break;
                 case self::FRAUD_TYPE_PHONE:
                     $fraudText .= $reservationId != $row['reservation_id'] ? sprintf($linkTicket, $row['res_number'], TextConstants::FRAUD_BLACKLIST_PHONE) : TextConstants::FRAUD_BLACKLIST_PHONE . "\n";
                     $fraudText .= '<br>';
                     $blackListValue = Objects::getFraudValue()['phone'];
                     break;
             }
         }
     }
     // Fraud Detection Country IP
     $ipAddress = long2ip($data['reservation']['ip_address']);
     if (filter_var($ipAddress, FILTER_VALIDATE_IP) && $ipAddress != '127.0.0.1') {
         $geoLocationDao = $this->getServiceLocator()->get('dao_geolite_country_geolite_country');
         $countryID = $geoLocationDao->getCountryIDByIp(ip2long($ipAddress));
         if ($data['reservation']['guest_country_id'] != $countryID) {
             $fraudValue += Objects::getFraudValue()['country_ip'];
             $fraudText .= TextConstants::FRAUD_COUNTRY_IP . '<br>';
         }
     }
     $fraudValue += $blackListValue;
     if ($fraudValue < self::FRAUD_VALUE_GREEN) {
         $class = 'label-default';
     } elseif ($fraudValue >= self::FRAUD_VALUE_GREEN && $fraudValue < self::FRAUD_VALUE_ORANGE) {
         $class = 'label-warning';
     } else {
         $class = 'label-danger';
     }
     if ($fraudValue == 0) {
         $fraudText = TextConstants::FRAUD_NONE . '<br>';
         $fraudValue = TextConstants::FRAUD_NONE;
     }
     return ['value' => $fraudValue, 'text' => $fraudText, 'class' => $class];
 }