public function trackEvent()
 {
     // return '';
     // ignore_user_abort(true);
     $this->layout = null;
     $response = null;
     $responseType = '';
     $expandFields = array();
     $deliveryStatus = '';
     $event = strtolower(Input::get('evt', ''));
     $requestType = Input::get('rt', Delivery::REQUEST_TYPE_TRACKING_BEACON);
     $checksum = Input::get('cs', '');
     $flightWebsiteID = Input::get('fpid', 0);
     $zoneID = Input::get('zid', 0);
     $isOverReport = Input::get('ovr');
     $platform = Input::get('plf', '');
     $beacon = Input::get('bc', '');
     $hostReferer = Input::get('ref', '');
     //custom code for VIB 068 Relaunch form complete tracking
     if (Input::get('wid') == 48 && $event == 'complete') {
         $flightWebsiteID = 172;
         $event = "impression";
     }
     $trackingModel = new Tracking();
     $deliveryModel = new Delivery();
     //ghi log trước khi xử lý
     //$logPreProcess = $trackingModel->logPreProcess($requestType, Input::get());
     // if($logPreProcess){
     if (1) {
         //kiểm tra referrer
         if (empty($hostReferer)) {
             $hostReferer = $trackingModel->getRequestReferer();
         }
         $responseType = $trackingModel->checkPreProcess($requestType, $hostReferer, $zoneID);
         if (empty($responseType)) {
             $adZone = $deliveryModel->getAdzone($zoneID);
             if ($adZone) {
                 $publisherSite = $deliveryModel->getPublisherSite($adZone->publisher_site_id);
                 $domainCheck = isset($publisherSite->domain_checking) ? $publisherSite->domain_checking : 1;
                 if (!$domainCheck || isSameDomain($hostReferer, getWebDomain($adZone->site->url)) || isLocal() || $adZone->id == 241 || $platform === 'mobile_app') {
                     //    if ($platform == '') {
                     //     $platform = $deliveryModel->getPlatform();
                     // }
                     $platform = '';
                     $flightWebsite = $deliveryModel->getFullFlightWebsite($flightWebsiteID, $adZone->publisher_site_id, $adZone->ad_format_id, $platform);
                     if ($flightWebsite) {
                         //checksum
                         if ($flightWebsite->flight->ad_format_id == Delivery::TRACKING_CODE_ADID) {
                             $responseType = Delivery::RESPONSE_TYPE_TRACKING_BEACON_SUCCESS;
                         } elseif ($trackingModel->isValidTrackingBeacon($checksum, $event)) {
                             $responseType = Delivery::RESPONSE_TYPE_TRACKING_BEACON_SUCCESS;
                         } else {
                             $responseType = Delivery::RESPONSE_TYPE_CHECKSUM_ERROR;
                         }
                     }
                     //else invalid
                 }
             }
         }
         if (empty($responseType)) {
             $responseType = Delivery::RESPONSE_TYPE_INVALID;
         } elseif ($responseType == Delivery::RESPONSE_TYPE_TRACKING_BEACON_SUCCESS) {
             $expandFields = array('flight_id' => $flightWebsite->flight_id, 'ad_format_id' => $adZone->ad_format_id, 'ad_id' => $flightWebsite->flight->ad_id, 'campaign_id' => $flightWebsite->flight->campaign_id, 'publisher_ad_zone_id' => $adZone->id, 'flight_website_id' => $flightWebsite->id, 'website_id' => $flightWebsite->website_id, 'publisher_base_cost' => $flightWebsite->publisher_base_cost);
             $expandFields['checksum'] = $checksum;
             $eventChecksum = $event;
             $trackingModel->setChecksumTrackingEvent($checksum, $event);
             //update tracking summary
             $rawTrackingSummary = new RawTrackingSummary();
             if ('impression' == $event && !empty($beacon) && !empty($flightWebsite->ad->third_impression_track)) {
                 $thirdImpressionTrackArr = explode("\n", $flightWebsite->ad->third_impression_track);
                 $arrCurl = array();
                 foreach ($thirdImpressionTrackArr as $item) {
                     array_push($arrCurl, trim($this->replaceParam($item)));
                 }
                 multipleThreadsRequest($arrCurl);
             }
             $rawTrackingSummary->addSummary($event, $flightWebsite->website_id, $adZone->id, $adZone->ad_format_id, $flightWebsite->flight_id, $flightWebsite->id, $flightWebsite->flight->ad_id, $flightWebsite->flight->campaign_id, $flightWebsite->publisher_base_cost, $isOverReport);
             $uuid = $trackingModel->getVisitorId();
             if ('impression' === $event || 'click' === $event) {
                 $time = time();
                 //Collection data
                 if (!empty($flightWebsite->ad->audience_id)) {
                     $audience_id = $flightWebsite->ad->audience_id;
                     $cookie = isset($_COOKIE["yoAu_{$audience_id}"]) ? $_COOKIE["yoAu_{$audience_id}"] : '';
                     if (!$cookie || substr($cookie, 0, 2) === "0." || $cookie === '1') {
                         setcookie("yoAu_{$audience_id}", "1." . $time, $time + 86400 * 365, '/', getWebDomain(DOMAIN_COOKIE));
                         $redis = new RedisBaseModel(env('REDIS_HOST', '127.0.0.1'), env('REDIS_PORT_6', '6379'), false);
                         $redis->pfadd("au.{$audience_id}", array($uuid));
                     }
                     if (substr($cookie, 0, 2) === '1.') {
                         $time = substr($cookie, 2);
                     }
                     $rawTrackingAudience = new RawTrackingAudience();
                     $rawTrackingAudience->addAudience($uuid, $audience_id, $flightWebsite->ad->id, $time, $event);
                 }
                 //Tracking audience
                 if (!empty($flightWebsite->flight->audience)) {
                     $audience = json_decode($flightWebsite->flight->audience, true);
                     $cookie = isset($_COOKIE["yoAu_{$audience['audience_id']}"]) ? $_COOKIE["yoAu_{$audience['audience_id']}"] : '';
                     if (substr($cookie, 0, 2) === '1.' || substr($cookie, 0, 2) === '0.') {
                         $time = substr($cookie, 2);
                     }
                     if ($cookie === '1') {
                         setcookie("yoAu_{$audience['audience_id']}", "1." . $time, $time + 86400 * 365, '/', getWebDomain(DOMAIN_COOKIE));
                     }
                     if ($audience['operator'] == 'not in') {
                         setcookie("yoAu_{$audience['audience_id']}", "0." . $time, $time + 86400 * 365, '/', getWebDomain(DOMAIN_COOKIE));
                     }
                     $rawTrackingAudience = new RawTrackingAudience();
                     $rawTrackingAudience->addAudience($uuid, $audience['audience_id'], $flightWebsite->ad->id, $time, $event);
                 }
             }
             //udpate inventory
             //$inventoryMetric = $trackingModel->getTrackingEventType($flightWebsite->flight->cost_type);
             $inventoryMetric = $trackingModel->getTrackingEventType($flightWebsite->flight->cost_type);
             if ($event == $inventoryMetric) {
                 //$trackingModel->updateInventory($flightWebsite->flight->id, $flightWebsite->id, $inventoryMetric, $isOverReport);
                 $rawTrackingSummary->updateInventory($flightWebsite->flight->id, $flightWebsite->id, $inventoryMetric, $isOverReport);
             }
             if (isset($flightWebsite->flight->event) && $flightWebsite->flight->event != '') {
                 $flightEvent = $flightWebsite->flight->event;
             } else {
                 // Truong hop nhung flight truoc day khong co setting event
                 $flightEvent = $inventoryMetric;
             }
             if ($event == $flightEvent) {
                 //incre today capped this ad by 1
                 $trackingModel->incFreCap($flightWebsite->flight);
             }
             $uniqueEvent = '';
             //unique impression
             if ($event == 'impression') {
                 $uniqueEvent = 'unique_impression';
                 $expandFields['unique_impression'] = $trackingModel->isUniqueImpression($flightWebsite->id);
                 // update number show retargeting
                 // $deliveryModel->updateRetargeting($flightWebsite->flight, $trackingModel->getVisitorId());
             }
             //unique click
             if ($event == 'click') {
                 $uniqueEvent = 'unique_click';
                 $expandFields['unique_click'] = $trackingModel->isUniqueClick($flightWebsite->id);
             }
             //add summary unique click or impression
             if (!empty($expandFields[$uniqueEvent])) {
                 $rawTrackingSummary->addSummary($uniqueEvent, $flightWebsite->website_id, $adZone->id, $adZone->ad_format_id, $flightWebsite->flight_id, $flightWebsite->id, $flightWebsite->flight->ad_id, $flightWebsite->flight->campaign_id, $flightWebsite->publisher_base_cost, $isOverReport);
             }
         }
     }
     //ghi log process
     //$logAfterProcess = $trackingModel->logAfterProcess($responseType, $expandFields, $logPreProcess);
     //response to client
     pr($expandFields);
     pr($responseType, 1);
     if ($event == 'click' && Input::get('to')) {
         //redirect to ad's destination url on click event
         if (!empty($beacon) && !empty($flightWebsite->ad->third_click_track)) {
             $thirdClickTrackArr = explode("\n", $flightWebsite->ad->third_click_track);
             $arrCurl = array();
             foreach ($thirdClickTrackArr as $item) {
                 array_push($arrCurl, trim($this->replaceParam($item)));
             }
             multipleThreadsRequest($arrCurl);
         }
         $conversionModel = new Conversion();
         $conversionCampaign = array();
         if (!empty($expandFields['campaign_id'])) {
             $conversionCampaign = $conversionModel->getCampaignConversion($expandFields['campaign_id']);
         }
         if (!empty($conversionCampaign)) {
             $infoConversion = array('wid' => $expandFields['website_id'], 'bid' => $expandFields['ad_id']);
             $cookieKey = "Conv_{$expandFields['campaign_id']}";
             return redirect(urldecode(Input::get('to')))->withCookie(cookie($cookieKey, json_encode($infoConversion), 60));
         } else {
             return redirect(urldecode(Input::get('to')));
         }
     } else {
         //return 1x1 transparent GIF
         $response = $trackingModel->outputTransparentGif();
         // exit();
     }
 }
Exemple #2
0
 /**
  * check delivery status and condition of requested flight
  */
 public function deliveredAdStatus($adID, $flightWebsite, $flight, $dateRange)
 {
     $trackingModel = new Tracking();
     //kiểm tra độ tuổi
     if ($flight->age && !$this->checkAge(json_decode($flight->age), Input::get('age')) && !isLocal()) {
         return self::RESPONSE_TYPE_AGE_LIMIT;
     }
     //kiểm tra giới tính
     if ($flight->sex && !$this->checkGender($flight->sex, Input::get('g')) && !isLocal()) {
         return self::RESPONSE_TYPE_GENDER_LIMIT;
     }
     //kiểm tra vị trí địa lí
     if ($flight->country && $flight->province && !$this->checkGeo($flight->country, $flight->province)) {
         return self::RESPONSE_TYPE_GEO_LIMIT;
     }
     //kiểm tra frequency capping
     if (!empty($dateRange) && !$this->checkFrequencyCap($flight, $dateRange, $flightWebsite->id) && !isLocal()) {
         return self::RESPONSE_TYPE_FREQUENCY_CAPPED;
     }
     //TODO : kiểm tra channel
     // to do kiểm tra theo loại campaign : CPC hay CPM
     //if( $flight->cost_type == 'cpm' || $flight->cost_type == 'cpc' ){
     $event = Tracking::getTrackingEventType($flight->cost_type);
     $overReport = FALSE;
     $checkInventory = $this->checkInventory($flight, $flightWebsite, $event, $dateRange);
     if ($checkInventory !== TRUE) {
         //full inventory trong ngày
         // $checkOverInventory = $this->checkOverInventory($flight, $flightWebsite, $event);
         // if($checkOverInventory !== TRUE){
         return $checkInventory;
         // }
         // else{
         // 	$overReport = TRUE;
         // }
     } else {
         $checkOvrInventory = $this->checkOverInventory($flight, $flightWebsite, $event);
         pr($checkOvrInventory);
         if ($checkOvrInventory === TRUE) {
             $overReport = TRUE;
         }
     }
     //}
     // WHEN READY TO DELIVERY
     //if( $flight->frequency_cap ){
     if (!empty($dateRange)) {
         $todayCapped = $trackingModel->getTodayFreCap($flight);
         $now = strtotime(date('Y-m-d H:i'));
         pr($dateRange);
         foreach ($dateRange as $date) {
             if (strtotime($date->start) <= $now && strtotime($date->end) >= $now) {
                 if ($date->frequency_cap > 0) {
                     if ($trackingModel->getTimeFreCap($flight) == 0) {
                         $redis = new RedisBaseModel(env('REDIS_HOST', '127.0.0.1'), env('REDIS_PORT_2', '6379'), false);
                         $visitorId = $trackingModel->getVisitorId();
                         $cacheKey = "Tracking:TimeFrequencyCap_{$flight->id}_{$visitorId}_{$flight->event}";
                         $cacheField = date('Y_m_d');
                         $redis->hSet($cacheKey, $cacheField, 0);
                         if ($date->frequency_cap_time > 0) {
                             $redis->expire($cacheKey, $date->frequency_cap_time * 60);
                         } else {
                             $redis->expire($cacheKey, 2);
                         }
                     }
                     if ($todayCapped >= $date->frequency_cap - 1) {
                         $time = time();
                         $expire = round((strtotime(date('Y-m-d 23:59:59', $time)) - $time) / 60);
                         $trackingModel->setTimeFreCap($flight, $expire);
                     }
                 }
             }
         }
         /*if(  $todayCapped >= $flight->frequency_cap_free &&  $flight->frequency_cap_time > 0 ){
         			$trackingModel->rememberFrequencyCap($flightWebsite->id, $flight->frequency_cap_time);
         		}*/
     }
     return $overReport ? self::DELIVERY_STATUS_OVER_REPORT : self::DELIVERY_STATUS_OK;
 }
 function getProcessPreview($totalImpression)
 {
     $process = 0;
     $TrackingInventory = new TrackingInventory();
     if (isset($this->event) && $this->event != '') {
         $event = $this->event;
     } else {
         $event = Tracking::getTrackingEventType($this->cost_type);
     }
     $rate = $event == 'impression' ? 1000 : 1;
     $flightInventory = $this->total_inventory * $rate;
     if ($flightInventory > 0) {
         $process = round($totalImpression / $flightInventory * 100, 2);
     }
     return $process;
 }