/**
  * The local implementation of the execute() method to generate the report.
  *
  * @param OA_Admin_oDaySpan $oDaySpan    The OA_Admin_oDaySpan object for the report.
  * @param integer          $placementId The ID of the placement the report is for.
  * @param array            $aSheets     An array of sheets that should be in the report.
  */
 function execute($oDaySpan, $placementId, $aSheets)
 {
     $checkResult = $this->_checkParameters($oDaySpan, $placementId, $aSheets);
     if ($checkResult !== true) {
         return $checkResult;
     }
     // Save the placement ID for use later
     $this->_placementId = $placementId;
     // Locate and save the placement's name & owning advertiser
     $doCampaigns = OA_Dal::factoryDO('campaigns');
     $doCampaigns->campaignid = $this->_placementId;
     $doCampaigns->find();
     if (!$doCampaigns->fetch()) {
         // Could not find the placement, set false
         // for the placement name, and the owning
         // advertiser ID and advertiser name
         $this->_placementName = false;
         $this->_advertiserId = false;
         $this->_advertiserName = false;
     } else {
         // Get and store the placement name and the
         // owning advertiser ID
         $aPlacement = $doCampaigns->toArray();
         $aPlacement['name'] = $aPlacement['campaignname'];
         $this->_placementName = MAX_getPlacementName($aPlacement);
         $this->_advertiserId = $aPlacement['clientid'];
         if ($aPlacement['anonymous'] == 't') {
             $campaignAnonymous = true;
         } else {
             $campaignAnonymous = false;
         }
         // Get the owning advertiser's name
         $doClients = OA_Dal::factoryDO('clients');
         $doClients->clientid = $this->_advertiserId;
         $doClients->find();
         if (!$doClients->fetch()) {
             // Coule not find the owning advertiser name
             $this->_advertiserName = false;
         } else {
             // Store the owning advertiser name
             $aAdvertiser = $doClients->toArray();
             $this->_advertiserName = MAX_getAdvertiserName($aAdvertiser['clientname'], null, $campaignAnonymous);
         }
     }
     // Prepare the range information for the report
     $this->_prepareReportRange($oDaySpan);
     // Prepare the report name
     $reportFileName = $this->_getReportFileName();
     // Prepare the output writer for generation
     $this->_oReportWriter->openWithFilename($reportFileName);
     // Add the worksheets to the report, as required
     if (isset($aSheets['daily_breakdown'])) {
         $this->_addDailyBreakdownWorksheet();
     }
     if (isset($aSheets['ad_breakdown'])) {
         $this->_addAdBreakdownWorksheet();
     }
     if (isset($aSheets['zone_breakdown'])) {
         $this->_addZoneBreakdownWorksheet();
     }
     // Close the report writer and send the report to the user
     $this->_oReportWriter->closeAndSend();
 }
 /**
  * Mask entities which have the hidden flag set
  *
  * @param array Entities array
  * @param string Name which should be used for hidden entitiies
  */
 function maskHiddenEntities(&$aEntitiesData, $entityType)
 {
     $this->fixLinkParams($aEntitiesData);
     foreach (array_keys($aEntitiesData) as $entityId) {
         if (isset($aEntitiesData[$entityId]['hidden']) && $aEntitiesData[$entityId]['hidden']) {
             switch ($entityType) {
                 case 'advertiser':
                     $aEntitiesData[$entityId]['name'] = MAX_getAdvertiserName($aEntitiesData[$entityId]['name'], null, true, $aEntitiesData[$entityId]['id']);
                     break;
                 case 'campaign':
                     $tmp = array('placement_id' => $aEntitiesData[$entityId]['id'], 'name' => $aEntitiesData[$entityId]['name'], 'anonymous' => true);
                     $aEntitiesData[$entityId]['name'] = MAX_getPlacementName($tmp);
                     break;
                 case 'banner':
                     $aEntitiesData[$entityId]['name'] = MAX_getAdName($aEntitiesData[$entityId]['name'], null, null, true, $aEntitiesData[$entityId]['id']);
                     break;
                 case 'publisher':
                     $aEntitiesData[$entityId]['name'] = MAX_getPublisherName($aEntitiesData[$entityId]['name'], null, true, $aEntitiesData[$entityId]['id']);
                     break;
                 case 'zone':
                     $aEntitiesData[$entityId]['name'] = MAX_getZoneName($aEntitiesData[$entityId]['name'], null, true, $aEntitiesData[$entityId]['id']);
                     break;
             }
             //$aEntitiesData[$entityId]['num_children'] = 0;
             //unset($aEntitiesData[$entityId]['subentities']);
         }
     }
     if ($this->listOrderField == 'name' || $this->listOrderField == 'id') {
         MAX_sortArray($aEntitiesData, $this->listOrderField, $this->listOrderDirection == 'up');
     }
 }
 /**
  * A private method to create and add the "connection detail" worksheet
  * of the report.
  *
  * @access private
  */
 function _addConnectionDetailWorksheet($aConnections, $aTrackerVariables)
 {
     // Create a worksheet
     $worksheetName = $this->translate("Connection Detail");
     $this->_oReportWriter->createReportWorksheet($worksheetName, $this->_name, $this->_getReportParametersForDisplay(), $this->_getReportWarningsForDisplay());
     $aStatus = $this->_getConnectionStatuses();
     // Create a subsection for each tracker
     foreach ($aTrackerVariables as $trackerId => $aTracker) {
         $trackerAnonymous = $this->_isTrackerLinkedToAnonymousCampaign($trackerId);
         $trackerName = MAX_getTrackerName($aTracker['tracker_name'], null, $trackerAnonymous, $trackerId);
         $aHeaders = array();
         $key = $this->translate("Connection ID");
         $aHeaders[$key] = 'id';
         $key = $this->translate("Connection Date / Time");
         $aHeaders[$key] = 'datetime';
         if (!empty($aTracker['variables'])) {
             foreach ($aTracker['variables'] as $trackerVariableId => $aTrackerVariable) {
                 $variableName = !empty($aTrackerVariable['tracker_variable_description']) ? $aTrackerVariable['tracker_variable_description'] : $aTrackerVariable['tracker_variable_name'];
                 // Don't display if the user is a publisher and the variable is hidden
                 if (!OA_Permission::isAccount(OA_ACCOUNT_TRAFFICKER) || $aTrackerVariable['tracker_variable_hidden'] != 't') {
                     switch ($aTrackerVariable['tracker_variable_data_type']) {
                         case 'int':
                         case 'numeric':
                             $aHeaders[$variableName] = 'numeric';
                             break;
                         case 'date':
                             $aHeaders[$variableName] = 'datetime';
                             break;
                         default:
                             $aHeaders[$variableName] = 'text';
                             break;
                     }
                 }
             }
         }
         $key = $this->translate("Approval Status");
         $aHeaders[$key] = 'text';
         $key = $this->translate("Comment");
         $aHeaders[$key] = 'text';
         if ($this->_shouldDisplaySourceField()) {
             $key = $GLOBALS['strSource'];
             $aHeaders[$key] = 'text';
         }
         $key = $this->translate("Advertiser Name");
         $aHeaders[$key] = 'text';
         $key = $GLOBALS['strTrackerName'];
         $aHeaders[$key] = 'text';
         $key = $this->translate("Ad Name");
         $aHeaders[$key] = 'text';
         $key = $this->translate("Website Name");
         $aHeaders[$key] = 'text';
         $key = $this->translate("Zone Name");
         $aHeaders[$key] = 'text';
         $key = $this->translate("Connection Type");
         $aHeaders[$key] = 'text';
         $key = $this->translate("Connecting Value Date / Time");
         $aHeaders[$key] = 'datetime';
         $key = $this->translate("IP Address");
         $aHeaders[$key] = 'text';
         $key = $GLOBALS['strCountry'];
         $aHeaders[$key] = 'text';
         $key = $GLOBALS['strDomain'];
         $aHeaders[$key] = 'text';
         $key = $GLOBALS['strLanguage'];
         $aHeaders[$key] = 'text';
         $key = $GLOBALS['strOS'];
         $aHeaders[$key] = 'text';
         $key = $GLOBALS['strBrowser'];
         $aHeaders[$key] = 'text';
         $key = $GLOBALS['strWindowDelay'];
         $aHeaders[$key] = 'text';
         $aData = array();
         if (!empty($aConnections[$trackerId]['connections'])) {
             $row = 0;
             foreach ($aConnections[$trackerId]['connections'] as $connectionId => $aConnection) {
                 // Skip connections with a hidden status
                 if (!isset($aStatus[$aConnection['connection_status']])) {
                     continue;
                 }
                 $aData[$row][] = $connectionId;
                 $aData[$row][] = $aConnection['tracker_date_time'];
                 if (!empty($aTracker['variables'])) {
                     foreach ($aTracker['variables'] as $trackerVariableId => $aTrackerVariable) {
                         // Don't display if the user is a publisher and the variable is hidden
                         if (!OA_Permission::isAccount(OA_ACCOUNT_TRAFFICKER) || $aTrackerVariable['tracker_variable_hidden'] != 't') {
                             $value = $aConnection['variables'][$trackerVariableId]['tracker_variable_value'];
                             if ($aTrackerVariable['tracker_variable_data_type'] == 'date') {
                                 // Change value to match Excel format
                                 $value = $this->_oReportWriter->convertToDate($value);
                             }
                             $aData[$row][] = $value;
                         }
                     }
                 }
                 $aData[$row][] = $this->_decodeConnectionStatus($aConnection['connection_status']);
                 $aData[$row][] = $aConnection['connection_comments'];
                 if ($this->_shouldDisplaySourceField()) {
                     $aData[$row][] = $aConnection['connection_channel'];
                 }
                 $aData[$row][] = MAX_getAdvertiserName($aConnection['advertiser_name'], null, $trackerAnonymous, $aConnection['advertiser_id']);
                 $aData[$row][] = $trackerName;
                 $aData[$row][] = MAX_getAdName($aConnection['ad_name'], $aConnection['ad_alt'], null, $trackerAnonymous, $aConnection['ad_id']);
                 $aData[$row][] = MAX_getPublisherName($aConnection['publisher_name'], null, $trackerAnonymous, $aConnection['publisher_id']);
                 $aData[$row][] = MAX_getZoneName($aConnection['zone_name'], null, $trackerAnonymous, $aConnection['zone_id']);
                 $aData[$row][] = $this->_decodeConnectionType($aConnection['connection_action']);
                 $aData[$row][] = $aConnection['connection_date_time'];
                 $aData[$row][] = $aConnection['connection_ip_address'];
                 $aData[$row][] = $aConnection['connection_country'];
                 $aData[$row][] = OA_Permission::isAccount(OA_ACCOUNT_ADVERTISER) && $trackerAnonymous ? '' : $aConnection['connection_domain'];
                 $aData[$row][] = $aConnection['connection_language'];
                 $aData[$row][] = $aConnection['connection_os'];
                 $aData[$row][] = $aConnection['connection_browser'];
                 $aData[$row][] = $aConnection['window_delay'];
                 $row++;
             }
         }
         $this->_oReportWriter->createReportSection($worksheetName, $trackerName, $aHeaders, $aData, 30);
     }
 }