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