Ejemplo n.º 1
0
 /**
  * @group Core
  * @group Piwik
  * @dataProvider getPrettyTimeFromSecondsData
  */
 public function testGetPrettyTimeFromSeconds($seconds, $expected)
 {
     Piwik_Translate::getInstance()->loadEnglishTranslation();
     $sentenceExpected = str_replace(' ', ' ', $expected[0]);
     $numericExpected = $expected[1];
     $this->assertEquals($sentenceExpected, Piwik::getPrettyTimeFromSeconds($seconds, $sentence = true));
     $this->assertEquals($numericExpected, Piwik::getPrettyTimeFromSeconds($seconds, $sentence = false));
     Piwik_Translate::getInstance()->unloadEnglishTranslation();
 }
Ejemplo n.º 2
0
 public function test_getPrettyTimeFromSeconds()
 {
     Piwik_Translate::getInstance()->loadEnglishTranslation();
     $tests = array(30 => array('30s', '00:00:30'), 60 => array('1 min 0s', '00:01:00'), 100 => array('1 min 40s', '00:01:40'), 3600 => array('1 hours 0 min', '01:00:00'), 3700 => array('1 hours 1 min', '01:01:40'), 86400 + 3600 * 10 => array('1 days 10 hours', '34:00:00'), 86400 * 365 => array('365 days 0 hours', '8760:00:00'), 86400 * (365.25 + 10) => array('1 years 10 days', '9006:00:00'));
     foreach ($tests as $seconds => $expected) {
         $sentenceExpected = str_replace(' ', ' ', $expected[0]);
         $numericExpected = $expected[1];
         $this->assertEqual(Piwik::getPrettyTimeFromSeconds($seconds, $sentence = true), $sentenceExpected);
         $this->assertEqual(Piwik::getPrettyTimeFromSeconds($seconds, $sentence = false), $numericExpected);
     }
     Piwik_Translate::getInstance()->unloadEnglishTranslation();
 }
Ejemplo n.º 3
0
 /** Render the area left of the iframe */
 public function renderSidebar()
 {
     $idSite = Piwik_Common::getRequestVar('idSite');
     $period = Piwik_Common::getRequestVar('period');
     $date = Piwik_Common::getRequestVar('date');
     $currentUrl = Piwik_Common::getRequestVar('currentUrl');
     $currentUrl = Piwik_Common::unsanitizeInputValue($currentUrl);
     $normalizedCurrentUrl = Piwik_Tracker_Action::excludeQueryParametersFromUrl($currentUrl, $idSite);
     $normalizedCurrentUrl = Piwik_Common::unsanitizeInputValue($normalizedCurrentUrl);
     // load the appropriate row of the page urls report using the label filter
     Piwik_Actions_ArchivingHelper::reloadConfig();
     $path = Piwik_Actions_ArchivingHelper::getActionExplodedNames($normalizedCurrentUrl, Piwik_Tracker_Action::TYPE_ACTION_URL);
     $path = array_map('urlencode', $path);
     $label = implode('>', $path);
     $request = new Piwik_API_Request('method=Actions.getPageUrls' . '&idSite=' . urlencode($idSite) . '&date=' . urlencode($date) . '&period=' . urlencode($period) . '&label=' . urlencode($label) . '&format=original');
     $dataTable = $request->process();
     $data = array();
     if ($dataTable->getRowsCount() > 0) {
         $row = $dataTable->getFirstRow();
         $translations = Piwik_API_API::getDefaultMetricTranslations();
         $showMetrics = array('nb_hits', 'nb_visits', 'nb_uniq_visitors', 'bounce_rate', 'exit_rate', 'avg_time_on_page');
         foreach ($showMetrics as $metric) {
             $value = $row->getColumn($metric);
             if ($value === false) {
                 // skip unique visitors for period != day
                 continue;
             }
             if ($metric == 'avg_time_on_page') {
                 $value = Piwik::getPrettyTimeFromSeconds($value);
             }
             $data[] = array('name' => $translations[$metric], 'value' => $value);
         }
     }
     // generate page url string
     foreach ($path as &$part) {
         $part = preg_replace(';^/;', '', urldecode($part));
     }
     $page = '/' . implode('/', $path);
     $page = preg_replace(';/index$;', '/', $page);
     if ($page == '/') {
         $page = '/index';
     }
     // render template
     $view = Piwik_View::factory('sidebar');
     $view->data = $data;
     $view->location = $page;
     $view->normalizedUrl = $normalizedCurrentUrl;
     $view->label = $label;
     $view->idSite = $idSite;
     $view->period = $period;
     $view->date = $date;
     echo $view->render();
 }
Ejemplo n.º 4
0
 protected function getDeleteLogsInfo()
 {
     Piwik::checkUserIsSuperUser();
     $deleteLogsInfos = array();
     $taskScheduler = new Piwik_TaskScheduler();
     $deleteLogsInfos["config"] = Zend_Registry::get('config')->Deletelogs->toArray();
     $privacyManager = new Piwik_PrivacyManager();
     $deleteLogsInfos["deleteTables"] = implode(", ", $privacyManager->getDeleteTableLogTables());
     $scheduleTimetable = $taskScheduler->getScheduledTimeForTask("Piwik_PrivacyManager", "deleteLogTables");
     $optionTable = Piwik_GetOption(self::OPTION_LAST_DELETE_PIWIK_LOGS);
     //If task was already rescheduled, read time from taskTimetable. Else, calculate next possible runtime.
     if (!empty($scheduleTimetable) && $scheduleTimetable - time() > 0) {
         $nextPossibleSchedule = (int) $scheduleTimetable;
     } else {
         $date = Piwik_Date::factory("today");
         $nextPossibleSchedule = $date->addDay(1)->getTimestamp();
     }
     //deletion schedule did not run before
     if (empty($optionTable)) {
         $deleteLogsInfos["lastRun"] = false;
         //next run ASAP (with next schedule run)
         $date = Piwik_Date::factory("today");
         $deleteLogsInfos["nextScheduleTime"] = $nextPossibleSchedule;
     } else {
         $deleteLogsInfos["lastRun"] = $optionTable;
         $deleteLogsInfos["lastRunPretty"] = Piwik_Date::factory((int) $optionTable)->getLocalized('%day% %shortMonth% %longYear%');
         //Calculate next run based on last run + interval
         $nextScheduleRun = (int) ($deleteLogsInfos["lastRun"] + $deleteLogsInfos["config"]["delete_logs_schedule_lowest_interval"] * 24 * 60 * 60);
         //is the calculated next run in the past? (e.g. plugin was disabled in the meantime or something) -> run ASAP
         if ($nextScheduleRun - time() <= 0) {
             $deleteLogsInfos["nextScheduleTime"] = $nextPossibleSchedule;
         } else {
             $deleteLogsInfos["nextScheduleTime"] = $nextScheduleRun;
         }
     }
     $deleteLogsInfos["nextRunPretty"] = Piwik::getPrettyTimeFromSeconds($deleteLogsInfos["nextScheduleTime"] - time());
     return $deleteLogsInfos;
 }
Ejemplo n.º 5
0
 function getVisitLengthPretty()
 {
     return Piwik::getPrettyTimeFromSeconds($this->details['visit_total_time']);
 }
Ejemplo n.º 6
0
 /**
  * For the given value, based on the column name, will apply: pretty time, pretty money
  * @param int $idSite
  * @param string $columnName
  * @param mixed $value
  * @param bool $htmlAllowed
  * @param string $timeAsSentence
  * @return string
  */
 public static function getPrettyValue($idSite, $columnName, $value, $htmlAllowed, $timeAsSentence)
 {
     // Display time in human readable
     if (strpos($columnName, 'time') !== false) {
         return Piwik::getPrettyTimeFromSeconds($value, $timeAsSentence);
     }
     // Add revenue symbol to revenues
     if (strpos($columnName, 'revenue') !== false) {
         return Piwik::getPrettyMoney($value, $idSite, $htmlAllowed);
     }
     // Add % symbol to rates
     if (strpos($columnName, '_rate') !== false) {
         if (strpos($value, "%") === false) {
             return $value . "%";
         }
     }
     return $value;
 }
Ejemplo n.º 7
0
 /**
  * Returns the domain age for the current url
  *
  * @return int
  */
 public function getAge()
 {
     $ageArchiveOrg = $this->_getAgeArchiveOrg();
     $ageWhoIs = $this->_getAgeWhoIs();
     $ageWhoisCom = $this->_getAgeWhoisCom();
     $ages = array();
     if ($ageArchiveOrg > 0) {
         $ages[] = $ageArchiveOrg;
     }
     if ($ageWhoIs > 0) {
         $ages[] = $ageWhoIs;
     }
     if ($ageWhoisCom > 0) {
         $ages[] = $ageWhoisCom;
     }
     if (count($ages) > 1) {
         $maxAge = min($ages);
     } else {
         $maxAge = array_shift($ages);
     }
     if ($maxAge) {
         return Piwik::getPrettyTimeFromSeconds(time() - $maxAge);
     }
     return false;
 }
Ejemplo n.º 8
0
/**
 * Returns a string that displays the number of days and hours from a number of seconds
 * 
 * How to use:
 * {4200|sumtime} will display '1h 10min'
 * 
 * Examples:
 * - 10 gives "10s"
 * - 4200 gives "1h 10min"
 * - 86400 gives "1 day"
 * - 90600 gives "1 day 1h" (it is exactly 1day 1h 10min but we truncate)
 * 
 * @return string
 * 
 */
function smarty_modifier_sumtime($numberOfSeconds)
{
    return Piwik::getPrettyTimeFromSeconds($numberOfSeconds);
}
Ejemplo n.º 9
0
 public function getSumVisitsLengthPretty($idSite, $period, $date, $segment = false)
 {
     $table = $this->getSumVisitsLength($idSite, $period, $date, $segment);
     if ($table instanceof Piwik_DataTable_Array) {
         $table->filter('ColumnCallbackReplace', array(0, array('Piwik', 'getPrettyTimeFromSeconds')));
     } else {
         $table = Piwik::getPrettyTimeFromSeconds($table);
     }
     return $table;
 }
Ejemplo n.º 10
0
 protected function initWebsitesToProcess()
 {
     $this->allWebsites = Piwik_SitesManager_API::getInstance()->getAllSitesId();
     if ($this->shouldArchiveAllWebsites) {
         $this->websites = $this->allWebsites;
         $this->log("Will process " . count($this->websites) . " websites");
     } else {
         // 1) All websites with visits since the last archive.php execution
         $timestampActiveTraffic = $this->timeLastCompleted;
         if (empty($timestampActiveTraffic)) {
             $timestampActiveTraffic = time() - $this->firstRunActiveWebsitesWithTraffic;
             $this->log("--force-all-periods was detected: we will process websites with visits in the last " . Piwik::getPrettyTimeFromSeconds($this->firstRunActiveWebsitesWithTraffic, true, false));
         }
         $this->websites = Piwik_SitesManager_API::getInstance()->getSitesIdWithVisits($timestampActiveTraffic);
         $websiteIds = !empty($this->websites) ? ", IDs: " . implode(", ", $this->websites) : "";
         $prettySeconds = Piwik::getPrettyTimeFromSeconds(empty($this->timeLastCompleted) ? $this->firstRunActiveWebsitesWithTraffic : time() - $this->timeLastCompleted, true, false);
         $this->log("Will process " . count($this->websites) . " websites with new visits since " . $prettySeconds . " " . $websiteIds);
         // 2) All websites that had reports in the past invalidated recently
         //	eg. when using Python log import script
         $this->idSitesInvalidatedOldReports = Piwik_CoreAdminHome_API::getWebsiteIdsToInvalidate();
         $this->idSitesInvalidatedOldReports = array_intersect($this->idSitesInvalidatedOldReports, $this->allWebsites);
         if (count($this->idSitesInvalidatedOldReports) > 0) {
             $websiteIds = ", IDs: " . implode(", ", $this->idSitesInvalidatedOldReports);
             $this->log("Will process " . count($this->idSitesInvalidatedOldReports) . " other websites because some old data reports have been invalidated (eg. using the Log Import script) " . $websiteIds);
             $this->websites = array_merge($this->websites, $this->idSitesInvalidatedOldReports);
         }
         // 3) Also process all other websites which days have finished since the last run.
         //    This ensures we process the previous day/week/month/year that just finished, even if there was no new visit
         $uniqueTimezones = Piwik_SitesManager_API::getInstance()->getUniqueSiteTimezones();
         $timezoneToProcess = array();
         foreach ($uniqueTimezones as &$timezone) {
             $processedDateInTz = Piwik_Date::factory((int) $timestampActiveTraffic, $timezone);
             $currentDateInTz = Piwik_Date::factory('now', $timezone);
             if ($processedDateInTz->toString() != $currentDateInTz->toString()) {
                 $timezoneToProcess[] = $timezone;
             }
         }
         $websiteDayHasFinishedSinceLastRun = Piwik_SitesManager_API::getInstance()->getSitesIdFromTimezones($timezoneToProcess);
         $websiteDayHasFinishedSinceLastRun = array_diff($websiteDayHasFinishedSinceLastRun, $this->websites);
         $this->websiteDayHasFinishedSinceLastRun = $websiteDayHasFinishedSinceLastRun;
         if (count($websiteDayHasFinishedSinceLastRun) > 0) {
             $websiteIds = !empty($websiteDayHasFinishedSinceLastRun) ? ", IDs: " . implode(", ", $websiteDayHasFinishedSinceLastRun) : "";
             $this->log("Will process " . count($websiteDayHasFinishedSinceLastRun) . " other websites because the last time they were archived was on a different day (in the website's timezone) " . $websiteIds);
             $this->websites = array_merge($this->websites, $websiteDayHasFinishedSinceLastRun);
         }
     }
 }
Ejemplo n.º 11
0
 /**
  * Returns prettified and translated text that describes when a report was last updated.
  * 
  * @return string
  */
 private function makePrettyArchivedOnText()
 {
     $dateText = $this->viewProperties['metadata'][Piwik_DataTable::ARCHIVED_DATE_METADATA_NAME];
     $date = Piwik_Date::factory($dateText);
     $today = mktime(0, 0, 0);
     if ($date->getTimestamp() > $today) {
         $elapsedSeconds = time() - $date->getTimestamp();
         $timeAgo = Piwik::getPrettyTimeFromSeconds($elapsedSeconds);
         return Piwik_Translate('CoreHome_ReportGeneratedXAgo', $timeAgo);
     }
     $prettyDate = $date->getLocalized("%longYear%, %longMonth% %day%") . $date->toString('S');
     return Piwik_Translate('CoreHome_ReportGeneratedOn', $prettyDate);
 }
Ejemplo n.º 12
0
 public function getSumVisitsLengthPretty($idSite, $period, $date)
 {
     return Piwik::getPrettyTimeFromSeconds(self::getSumVisitsLength($idSite, $period, $date));
 }
Ejemplo n.º 13
0
	public function getAge()
	{
		$url = preg_replace('/^www\./', '', $this->url);
		$url = 'http://www.who.is/whois/'.urlencode($url);
		$data = $this->getPage($url);
		preg_match('#(?:Creation Date|Created On):\s*([a-z0-9/-]+)#si', $data, $p);
		if(!isset($p[1]))
		{
			return null;
		}
		$value = time() - strtotime($p[1]);
		$value = Piwik::getPrettyTimeFromSeconds($value);
		return $value;
	}
Ejemplo n.º 14
0
 /**
  * For an array of visits, query the list of pages for this visit
  * as well as make the data human readable
  * @param array $visitorDetails
  * @param int $idSite
  * @return Piwik_DataTable
  */
 private function getCleanedVisitorsFromDetails($visitorDetails, $idSite)
 {
     $table = new Piwik_DataTable();
     $site = new Piwik_Site($idSite);
     $timezone = $site->getTimezone();
     $currencies = Piwik_SitesManager_API::getInstance()->getCurrencySymbols();
     foreach ($visitorDetails as $visitorDetail) {
         $this->cleanVisitorDetails($visitorDetail, $idSite);
         $visitor = new Piwik_Live_Visitor($visitorDetail);
         $visitorDetailsArray = $visitor->getAllVisitorDetails();
         $visitorDetailsArray['siteCurrency'] = $site->getCurrency();
         $visitorDetailsArray['siteCurrencySymbol'] = @$currencies[$site->getCurrency()];
         $visitorDetailsArray['serverTimestamp'] = $visitorDetailsArray['lastActionTimestamp'];
         $dateTimeVisit = Piwik_Date::factory($visitorDetailsArray['lastActionTimestamp'], $timezone);
         $visitorDetailsArray['serverTimePretty'] = $dateTimeVisit->getLocalized('%time%');
         $visitorDetailsArray['serverDatePretty'] = $dateTimeVisit->getLocalized(Piwik_Translate('CoreHome_ShortDateFormat'));
         $dateTimeVisitFirstAction = Piwik_Date::factory($visitorDetailsArray['firstActionTimestamp'], $timezone);
         $visitorDetailsArray['serverDatePrettyFirstAction'] = $dateTimeVisitFirstAction->getLocalized(Piwik_Translate('CoreHome_ShortDateFormat'));
         $visitorDetailsArray['serverTimePrettyFirstAction'] = $dateTimeVisitFirstAction->getLocalized('%time%');
         $idvisit = $visitorDetailsArray['idVisit'];
         $sqlCustomVariables = '';
         for ($i = 1; $i <= Piwik_Tracker::MAX_CUSTOM_VARIABLES; $i++) {
             $sqlCustomVariables .= ', custom_var_k' . $i . ', custom_var_v' . $i;
         }
         // The second join is a LEFT join to allow returning records that don't have a matching page title
         // eg. Downloads, Outlinks. For these, idaction_name is set to 0
         $sql = "\n\t\t\t\tSELECT\n\t\t\t\t\tlog_action.type AS type,\n\t\t\t\t\tlog_action.name AS url,\n\t\t\t\t\tlog_action.url_prefix,\n\t\t\t\t\tlog_action_title.name AS pageTitle,\n\t\t\t\t\tlog_action.idaction AS pageIdAction,\n\t\t\t\t\tlog_link_visit_action.idlink_va AS pageId,\n\t\t\t\t\tlog_link_visit_action.server_time as serverTimePretty,\n\t\t\t\t\tlog_link_visit_action.time_spent_ref_action as timeSpentRef\n\t\t\t\t\t{$sqlCustomVariables}\n\t\t\t\tFROM " . Piwik_Common::prefixTable('log_link_visit_action') . " AS log_link_visit_action\n\t\t\t\t\tINNER JOIN " . Piwik_Common::prefixTable('log_action') . " AS log_action\n\t\t\t\t\tON  log_link_visit_action.idaction_url = log_action.idaction\n\t\t\t\t\tLEFT JOIN " . Piwik_Common::prefixTable('log_action') . " AS log_action_title\n\t\t\t\t\tON  log_link_visit_action.idaction_name = log_action_title.idaction\n\t\t\t\tWHERE log_link_visit_action.idvisit = ?\n\t\t\t\t ";
         $actionDetails = Piwik_FetchAll($sql, array($idvisit));
         foreach ($actionDetails as $actionIdx => &$actionDetail) {
             $customVariablesPage = array();
             for ($i = 1; $i <= Piwik_Tracker::MAX_CUSTOM_VARIABLES; $i++) {
                 if (!empty($actionDetail['custom_var_k' . $i]) && !empty($actionDetail['custom_var_v' . $i])) {
                     $customVariablesPage[$i] = array('customVariableName' . $i => $actionDetail['custom_var_k' . $i], 'customVariableValue' . $i => $actionDetail['custom_var_v' . $i]);
                 }
                 unset($actionDetail['custom_var_k' . $i]);
                 unset($actionDetail['custom_var_v' . $i]);
             }
             if (!empty($customVariablesPage)) {
                 $actionDetail['customVariables'] = $customVariablesPage;
             }
             // reconstruct url from prefix
             $actionDetail['url'] = Piwik_Tracker_Action::reconstructNormalizedUrl($actionDetail['url'], $actionDetail['url_prefix']);
             unset($actionDetail['url_prefix']);
             // set the time spent for this action (which is the timeSpentRef of the next action)
             if (isset($actionDetails[$actionIdx + 1])) {
                 $actionDetail['timeSpent'] = $actionDetails[$actionIdx + 1]['timeSpentRef'];
                 $actionDetail['timeSpentPretty'] = Piwik::getPrettyTimeFromSeconds($actionDetail['timeSpent']);
             }
             unset($actionDetails[$actionIdx]['timeSpentRef']);
             // not needed after timeSpent is added
         }
         // If the visitor converted a goal, we shall select all Goals
         $sql = "\n\t\t\t\tSELECT \n\t\t\t\t\t\t'goal' as type,\n\t\t\t\t\t\tgoal.name as goalName,\n\t\t\t\t\t\tgoal.revenue as revenue,\n\t\t\t\t\t\tlog_conversion.idlink_va as goalPageId,\n\t\t\t\t\t\tlog_conversion.server_time as serverTimePretty,\n\t\t\t\t\t\tlog_conversion.url as url\n\t\t\t\tFROM " . Piwik_Common::prefixTable('log_conversion') . " AS log_conversion\n\t\t\t\tLEFT JOIN " . Piwik_Common::prefixTable('goal') . " AS goal \n\t\t\t\t\tON (goal.idsite = log_conversion.idsite\n\t\t\t\t\t\tAND  \n\t\t\t\t\t\tgoal.idgoal = log_conversion.idgoal)\n\t\t\t\t\tAND goal.deleted = 0\n\t\t\t\tWHERE log_conversion.idvisit = ?\n\t\t\t\t\tAND log_conversion.idgoal > 0\n\t\t\t";
         $goalDetails = Piwik_FetchAll($sql, array($idvisit));
         $sql = "SELECT \n\t\t\t\t\t\tcase idgoal when " . Piwik_Tracker_GoalManager::IDGOAL_CART . " then '" . Piwik_Archive::LABEL_ECOMMERCE_CART . "' else '" . Piwik_Archive::LABEL_ECOMMERCE_ORDER . "' end as type,\n\t\t\t\t\t\tidorder as orderId,\n\t\t\t\t\t\t" . Piwik_ArchiveProcessing_Day::getSqlRevenue('revenue') . " as revenue,\n\t\t\t\t\t\t" . Piwik_ArchiveProcessing_Day::getSqlRevenue('revenue_subtotal') . " as revenueSubTotal,\n\t\t\t\t\t\t" . Piwik_ArchiveProcessing_Day::getSqlRevenue('revenue_tax') . " as revenueTax,\n\t\t\t\t\t\t" . Piwik_ArchiveProcessing_Day::getSqlRevenue('revenue_shipping') . " as revenueShipping,\n\t\t\t\t\t\t" . Piwik_ArchiveProcessing_Day::getSqlRevenue('revenue_discount') . " as revenueDiscount,\n\t\t\t\t\t\titems as items,\n\t\t\t\t\t\t\n\t\t\t\t\t\tlog_conversion.server_time as serverTimePretty\n\t\t\t\t\tFROM " . Piwik_Common::prefixTable('log_conversion') . " AS log_conversion\n\t\t\t\t\tWHERE idvisit = ?\n\t\t\t\t\t\tAND idgoal <= " . Piwik_Tracker_GoalManager::IDGOAL_ORDER;
         $ecommerceDetails = Piwik_FetchAll($sql, array($idvisit));
         foreach ($ecommerceDetails as &$ecommerceDetail) {
             if ($ecommerceDetail['type'] == Piwik_Archive::LABEL_ECOMMERCE_CART) {
                 unset($ecommerceDetail['orderId']);
                 unset($ecommerceDetail['revenueSubTotal']);
                 unset($ecommerceDetail['revenueTax']);
                 unset($ecommerceDetail['revenueShipping']);
                 unset($ecommerceDetail['revenueDiscount']);
             }
             // 25.00 => 25
             foreach ($ecommerceDetail as $column => $value) {
                 if (strpos($column, 'revenue') !== false) {
                     if ($value == round($value)) {
                         $ecommerceDetail[$column] = round($value);
                     }
                 }
             }
         }
         // Enrich ecommerce carts/orders with the list of products
         usort($ecommerceDetails, array($this, 'sortByServerTime'));
         foreach ($ecommerceDetails as $key => &$ecommerceConversion) {
             $sql = "SELECT \n\t\t\t\t\t\t\tlog_action_sku.name as itemSKU,\n\t\t\t\t\t\t\tlog_action_name.name as itemName,\n\t\t\t\t\t\t\tlog_action_category.name as itemCategory,\n\t\t\t\t\t\t\t" . Piwik_ArchiveProcessing_Day::getSqlRevenue('price') . " as price,\n\t\t\t\t\t\t\tquantity as quantity\n\t\t\t\t\t\tFROM " . Piwik_Common::prefixTable('log_conversion_item') . "\n\t\t\t\t\t\t\tINNER JOIN " . Piwik_Common::prefixTable('log_action') . " AS log_action_sku\n\t\t\t\t\t\t\tON  idaction_sku = log_action_sku.idaction\n\t\t\t\t\t\t\tLEFT JOIN " . Piwik_Common::prefixTable('log_action') . " AS log_action_name\n\t\t\t\t\t\t\tON  idaction_name = log_action_name.idaction\n\t\t\t\t\t\t\tLEFT JOIN " . Piwik_Common::prefixTable('log_action') . " AS log_action_category\n\t\t\t\t\t\t\tON idaction_category = log_action_category.idaction\n\t\t\t\t\t\tWHERE idvisit = ? \n\t\t\t\t\t\t\tAND idorder = ?\n\t\t\t\t\t\t\tAND deleted = 0\n\t\t\t\t";
             $bind = array($idvisit, isset($ecommerceConversion['orderId']) ? $ecommerceConversion['orderId'] : Piwik_Tracker_GoalManager::ITEM_IDORDER_ABANDONED_CART);
             $itemsDetails = Piwik_FetchAll($sql, $bind);
             foreach ($itemsDetails as &$detail) {
                 if ($detail['price'] == round($detail['price'])) {
                     $detail['price'] = round($detail['price']);
                 }
             }
             $ecommerceConversion['itemDetails'] = $itemsDetails;
         }
         $actions = array_merge($actionDetails, $goalDetails, $ecommerceDetails);
         usort($actions, array($this, 'sortByServerTime'));
         $visitorDetailsArray['actionDetails'] = $actions;
         // Convert datetimes to the site timezone
         foreach ($visitorDetailsArray['actionDetails'] as &$details) {
             switch ($details['type']) {
                 case 'goal':
                     $details['icon'] = 'themes/default/images/goal.png';
                     break;
                 case Piwik_Archive::LABEL_ECOMMERCE_ORDER:
                 case Piwik_Archive::LABEL_ECOMMERCE_CART:
                     $details['icon'] = 'themes/default/images/' . $details['type'] . '.gif';
                     break;
                 case Piwik_Tracker_Action_Interface::TYPE_DOWNLOAD:
                     $details['type'] = 'download';
                     $details['icon'] = 'themes/default/images/download.png';
                     break;
                 case Piwik_Tracker_Action_Interface::TYPE_OUTLINK:
                     $details['type'] = 'outlink';
                     $details['icon'] = 'themes/default/images/link.gif';
                     break;
                 default:
                     $details['type'] = 'action';
                     $details['icon'] = null;
                     break;
             }
             $dateTimeVisit = Piwik_Date::factory($details['serverTimePretty'], $timezone);
             $details['serverTimePretty'] = $dateTimeVisit->getLocalized(Piwik_Translate('CoreHome_ShortDateFormat') . ' %time%');
         }
         $visitorDetailsArray['goalConversions'] = count($goalDetails);
         $table->addRowFromArray(array(Piwik_DataTable_Row::COLUMNS => $visitorDetailsArray));
     }
     return $table;
 }