diff options
author | mattpiwik <matthieu.aubry@gmail.com> | 2011-05-23 10:10:53 +0400 |
---|---|---|
committer | mattpiwik <matthieu.aubry@gmail.com> | 2011-05-23 10:10:53 +0400 |
commit | 3bc135bd9d68446733b54b6f9cab61681f9034a3 (patch) | |
tree | a5d9e5cb32a75cf37bf0038407139d48b1a13a86 | |
parent | 306a4a79d91655ce105c789c3021e8919e8128bb (diff) |
Refs #898
When Ecommerce enabled, the first submenu of "Ecommerce & Goals" will be Ecommerce report.
On click, loads a graph with below the following metrics: conversions, overall revenue, Average order value, conversion rate and number of purchased products
The "segment" tables is similar to other Goal reports, except it shows the following metrics (for each country/continent/server hour/referrer etc.): Visits, Ecommerce orders, Total Revenue, Ecommerce conversion rate, Average Order value, Purchased products.
more to come in the UI...
git-svn-id: http://dev.piwik.org/svn/trunk@4785 59fd770c-687e-43c8-a1e3-f5a4ff64c105
57 files changed, 807 insertions, 122 deletions
diff --git a/core/API/DataTableGenericFilter.php b/core/API/DataTableGenericFilter.php index b65c9a1b3a..67c95eae03 100644 --- a/core/API/DataTableGenericFilter.php +++ b/core/API/DataTableGenericFilter.php @@ -58,7 +58,7 @@ class Piwik_API_DataTableGenericFilter ), 'AddColumnsProcessedMetricsGoal' => array( 'filter_update_columns_when_show_all_goals' => array('integer'), - 'filter_only_display_idgoal' => array('integer', Piwik_DataTable_Filter_AddColumnsProcessedMetricsGoal::GOALS_OVERVIEW), + 'filter_only_display_idgoal' => array('string', Piwik_DataTable_Filter_AddColumnsProcessedMetricsGoal::GOALS_OVERVIEW), ), 'Sort' => array( 'filter_sort_column' => array('string'), diff --git a/core/ArchiveProcessing/Day.php b/core/ArchiveProcessing/Day.php index f706f949b2..22a613b82c 100644 --- a/core/ArchiveProcessing/Day.php +++ b/core/ArchiveProcessing/Day.php @@ -797,12 +797,4 @@ class Piwik_ArchiveProcessing_Day extends Piwik_ArchiveProcessing Piwik_Archive::INDEX_GOAL_ECOMMERCE_ITEMS => 0, ); } - - function getGoalRowFromQueryRow($queryRow) - { - return array( Piwik_Archive::INDEX_GOAL_NB_CONVERSIONS => $queryRow[Piwik_Archive::INDEX_GOAL_NB_CONVERSIONS], - Piwik_Archive::INDEX_GOAL_NB_VISITS_CONVERTED => $queryRow[Piwik_Archive::INDEX_GOAL_NB_VISITS_CONVERTED], - Piwik_Archive::INDEX_GOAL_REVENUE => $queryRow[Piwik_Archive::INDEX_GOAL_REVENUE], - ); - } } diff --git a/core/DataTable/Filter/AddColumnsProcessedMetricsGoal.php b/core/DataTable/Filter/AddColumnsProcessedMetricsGoal.php index 50a1e665b2..fd7d1c80ae 100644 --- a/core/DataTable/Filter/AddColumnsProcessedMetricsGoal.php +++ b/core/DataTable/Filter/AddColumnsProcessedMetricsGoal.php @@ -41,7 +41,7 @@ class Piwik_DataTable_Filter_AddColumnsProcessedMetricsGoal extends Piwik_DataTa * * @param Piwik_DataTable $table * @param bool $enable should be true (automatically set to true when filter_update_columns_when_show_all_goals is found in the API request) - * @param bool $processOnlyIdGoal Defines what metrics to add (don't process metrics when you don't display them) + * @param string $processOnlyIdGoal Defines what metrics to add (don't process metrics when you don't display them) * If self::GOALS_FULL_TABLE, all Goal metrics (and per goal metrics) will be processed * If self::GOALS_OVERVIEW, only the main goal metrics will be added * If an int > 0, then will process only metrics for this specific Goal @@ -50,6 +50,7 @@ class Piwik_DataTable_Filter_AddColumnsProcessedMetricsGoal extends Piwik_DataTa public function __construct( $table, $enable = true, $processOnlyIdGoal ) { $this->processOnlyIdGoal = $processOnlyIdGoal; + $this->isEcommerce = $this->processOnlyIdGoal == 'ecommerceOrder' || $this->processOnlyIdGoal == 'ecommerceAbandonedCart'; // Ensure that all rows with no visit but conversions will be displayed $this->deleteRowsWithNoVisit = false; parent::__construct($table); @@ -76,7 +77,13 @@ class Piwik_DataTable_Filter_AddColumnsProcessedMetricsGoal extends Piwik_DataTa $revenue = 0; foreach($goals as $goalId => $columnValue) { - if($goalId >= Piwik_Tracker_GoalManager::IDGOAL_ORDER) + if($goalId == 'ecommerceAbandonedCart') + { + continue; + } + if($goalId >= Piwik_Tracker_GoalManager::IDGOAL_ORDER + || $goalId == 'ecommerceOrder' + ) { $revenue += (int)$this->getColumn($columnValue, Piwik_Archive::INDEX_GOAL_REVENUE, Piwik_Archive::$mappingFromIdToNameGoal); } @@ -102,10 +109,15 @@ class Piwik_DataTable_Filter_AddColumnsProcessedMetricsGoal extends Piwik_DataTa continue; } + // Display per goal metrics + // - conversion rate + // - conversions + // - revenue per visit foreach($goals as $goalId => $columnValue) { $goalId = str_replace("idgoal=", "", $goalId); - if($this->processOnlyIdGoal > self::GOALS_FULL_TABLE + if( ($this->processOnlyIdGoal > self::GOALS_FULL_TABLE + || $this->isEcommerce) && $this->processOnlyIdGoal != $goalId) { continue; @@ -140,13 +152,30 @@ class Piwik_DataTable_Filter_AddColumnsProcessedMetricsGoal extends Piwik_DataTa // Goal Revenue per visit $name = 'goal_' . $goalId . '_revenue_per_visit'; // See comment above for $revenuePerVisit - $revenuePerVisit = round( (float)$this->getColumn($columnValue, Piwik_Archive::INDEX_GOAL_REVENUE, Piwik_Archive::$mappingFromIdToNameGoal) / ($nbVisits == 0 ? $conversions : $nbVisits), $roundingPrecision ); + $goalRevenue = (float)$this->getColumn($columnValue, Piwik_Archive::INDEX_GOAL_REVENUE, Piwik_Archive::$mappingFromIdToNameGoal); + $revenuePerVisit = round( $goalRevenue / ($nbVisits == 0 ? $conversions : $nbVisits), $roundingPrecision ); $newColumns[$name] = $revenuePerVisit; $expectedColumns[$name] = true; + if($this->isEcommerce ) + { + // Total revenue + $name = 'goal_' . $goalId . '_revenue'; + $newColumns[$name] = $goalRevenue; + $expectedColumns[$name] = true; + + // AOV Average Order Value + $name = 'goal_' . $goalId . '_avg_order_revenue'; + $newColumns[$name] = $goalRevenue / $conversions; + $expectedColumns[$name] = true; + + // Items qty + $name = 'goal_' . $goalId . '_items'; + $newColumns[$name] = $this->getColumn($columnValue, Piwik_Archive::INDEX_GOAL_ECOMMERCE_ITEMS, Piwik_Archive::$mappingFromIdToNameGoal); + $expectedColumns[$name] = true; + } } } - $row->addColumns($newColumns); } $expectedColumns['revenue_per_visit'] = true; diff --git a/core/Menu/Main.php b/core/Menu/Main.php index f063141d9c..06ba79533a 100644 --- a/core/Menu/Main.php +++ b/core/Menu/Main.php @@ -18,7 +18,7 @@ class Piwik_Menu_Main extends Piwik_Menu_Abstract static private $instance = null; /** - * @return Piwik_Menu + * @return Piwik_Menu_Abstract */ static public function getInstance() { diff --git a/core/ViewDataTable/HtmlTable/Goals.php b/core/ViewDataTable/HtmlTable/Goals.php index 62198ec8e8..27d717a513 100644 --- a/core/ViewDataTable/HtmlTable/Goals.php +++ b/core/ViewDataTable/HtmlTable/Goals.php @@ -24,7 +24,8 @@ class Piwik_ViewDataTable_HtmlTable_Goals extends Piwik_ViewDataTable_HtmlTable public function main() { $this->idSite = Piwik_Common::getRequestVar('idSite', null, 'int'); - $this->processOnlyIdGoal = Piwik_Common::getRequestVar('filter_only_display_idgoal', 0, 'int'); + $this->processOnlyIdGoal = Piwik_Common::getRequestVar('filter_only_display_idgoal', 0, 'string'); + $this->isEcommerce = $this->processOnlyIdGoal == 'ecommerceOrder'; $this->viewProperties['show_exclude_low_population'] = true; $this->viewProperties['show_goals'] = true; @@ -33,29 +34,54 @@ class Piwik_ViewDataTable_HtmlTable_Goals extends Piwik_ViewDataTable_HtmlTable array('<br />', '<br />', '<a href="http://piwik.org/docs/tracking-goals-web-analytics/" target="_blank">', '</a>'))); } - $this->setColumnsTranslations( array( - 'goal_%s_conversion_rate' => '%s conversion rate', - 'goal_%s_nb_conversions' => '%s conversions', - 'goal_%s_revenue_per_visit' => '%s revenue per visit', - - 'nb_conversions' => Piwik_Translate('Goals_ColumnConversions'), - 'conversion_rate' => Piwik_Translate('General_ColumnConversionRate'), - 'revenue' => Piwik_Translate('Goals_ColumnRevenue'), - 'revenue_per_visit' => Piwik_Translate('General_ColumnValuePerVisit'), - )); $this->setMetricDocumentation('nb_visits', Piwik_Translate('Goals_ColumnVisits')); - $this->setMetricDocumentation('revenue_per_visit', Piwik_Translate('Goals_ColumnRevenuePerVisitDocumentation')); - - $this->setColumnsToDisplay( array( - 'label', - 'nb_visits', - 'goal_%s_nb_conversions', - 'goal_%s_conversion_rate', - 'goal_%s_revenue_per_visit', - 'revenue_per_visit', - )); + if($this->isEcommerce) + { + $this->setMetricDocumentation('revenue_per_visit', Piwik_Translate('Goals_ColumnRevenuePerVisitDocumentation', Piwik_Translate('General_EcommerceOrders') )); + $this->setColumnsTranslations( array( + 'goal_%s_conversion_rate' => Piwik_Translate('Goals_ConversionRate'), + 'goal_%s_nb_conversions' => Piwik_Translate('General_EcommerceOrders'), + 'goal_%s_revenue' => Piwik_Translate('General_TotalRevenue'), + 'goal_%s_revenue_per_visit' => Piwik_Translate('General_ColumnValuePerVisit'), + 'goal_%s_avg_order_revenue' => Piwik_Translate('General_AverageOrderValue'), + 'goal_%s_items' => Piwik_Translate('General_PurchasedProducts'), + )); + $this->setColumnsToDisplay( array( + 'label', + 'nb_visits', + 'goal_%s_nb_conversions', + 'goal_%s_revenue', + 'goal_%s_conversion_rate', + 'goal_%s_avg_order_revenue', + 'goal_%s_items', + 'goal_%s_revenue_per_visit', + )); + } + else + { + $this->setMetricDocumentation('revenue_per_visit', Piwik_Translate('Goals_ColumnRevenuePerVisitDocumentation', Piwik_Translate('Goals_GoalConversions') )); + $this->setColumnsTranslations( array( + 'goal_%s_conversion_rate' => Piwik_Translate('Goals_ConversionRate'), + 'goal_%s_nb_conversions' => Piwik_Translate('Goals_Conversions'), + 'goal_%s_revenue_per_visit' => '%s ' . Piwik_Translate('General_ColumnValuePerVisit'), + + 'nb_conversions' => Piwik_Translate('Goals_ColumnConversions'), + 'conversion_rate' => Piwik_Translate('General_ColumnConversionRate'), + 'revenue' => Piwik_Translate('Goals_ColumnRevenue'), + 'revenue_per_visit' => Piwik_Translate('General_ColumnValuePerVisit'), + )); + $this->setColumnsToDisplay( array( + 'label', + 'nb_visits', + 'goal_%s_nb_conversions', + 'goal_%s_conversion_rate', + 'goal_%s_revenue_per_visit', + + 'revenue_per_visit', + )); + } // We ensure that the 'Sort by' column is actually displayed in the table // eg. most daily reports sort by nb_uniq_visitors but this column is not displayed in the Goals table @@ -81,24 +107,41 @@ class Piwik_ViewDataTable_HtmlTable_Goals extends Piwik_ViewDataTable_HtmlTable if($idSite) { $goals = Piwik_Goals_API::getInstance()->getGoals( $idSite ); + if($this->isEcommerce) + { + $goals = array( + array( 'idgoal' => 'ecommerceOrder', + 'name' => Piwik_Translate('Goals_EcommerceOrder') + ) + ); + } } foreach($columnsNames as $columnName) { - if(in_array($columnName, array('goal_%s_conversion_rate', 'goal_%s_nb_conversions', 'goal_%s_revenue_per_visit'))) + if(in_array($columnName, array( + 'goal_%s_conversion_rate', + 'goal_%s_nb_conversions', + 'goal_%s_revenue_per_visit', + 'goal_%s_revenue', + 'goal_%s_avg_order_revenue', + 'goal_%s_items', + + ))) { foreach($goals as $goal) { $idgoal = $goal['idgoal']; if($this->processOnlyIdGoal > Piwik_DataTable_Filter_AddColumnsProcessedMetricsGoal::GOALS_FULL_TABLE - && $this->processOnlyIdGoal != $idgoal) + && $this->processOnlyIdGoal != $idgoal + && !$this->isEcommerce) { continue; } $name = Piwik_Translate($this->getColumnTranslation($columnName), $goal['name']); $columnNameGoal = str_replace('%s', $idgoal, $columnName); $this->setColumnTranslation($columnNameGoal, $name); - $this->setDynamicMetricDocumentation($columnName, $columnNameGoal, $goal['name']); - if(strstr($columnNameGoal, '_rate') === false + $this->setDynamicMetricDocumentation($columnName, $columnNameGoal, $goal['name'], $goal['idgoal']); + if(strpos($columnNameGoal, '_rate') === false // For the goal table (when the flag icon is clicked), we only display the per Goal Conversion rate && $this->processOnlyIdGoal == Piwik_DataTable_Filter_AddColumnsProcessedMetricsGoal::GOALS_OVERVIEW) { @@ -125,8 +168,17 @@ class Piwik_ViewDataTable_HtmlTable_Goals extends Piwik_ViewDataTable_HtmlTable } /** Find the appropriate metric documentation for a goal column */ - private function setDynamicMetricDocumentation($genericMetricName, $metricName, $goalName) + private function setDynamicMetricDocumentation($genericMetricName, $metricName, $goalName, $idGoal) { + if($idGoal == 'ecommerceOrder') + { + $goalName = Piwik_Translate('General_EcommerceOrders'); + } + else + { + $goalName = '"'.$goalName.'"'; + } + $langString = false; switch ($genericMetricName) { @@ -137,13 +189,22 @@ class Piwik_ViewDataTable_HtmlTable_Goals extends Piwik_ViewDataTable_HtmlTable $langString = 'Goals_ColumnConversionRateDocumentation'; break; case 'goal_%s_revenue_per_visit': + $langString = 'Goals_ColumnRevenuePerVisitDocumentation'; + break; + case 'goal_%s_revenue': $langString = 'Goals_ColumnRevenueDocumentation'; break; + case 'goal_%s_avg_order_revenue': + $langString = 'Goals_ColumnAverageOrderRevenueDocumentation'; + break; + case 'goal_%s_items': + $langString = 'Goals_ColumnPurchasedProductsDocumentation'; + break; } if ($langString) { - $doc = Piwik_Translate($langString, '"'.$goalName.'"'); + $doc = Piwik_Translate($langString, $goalName); $this->setMetricDocumentation($metricName, $doc); } } @@ -151,7 +212,9 @@ class Piwik_ViewDataTable_HtmlTable_Goals extends Piwik_ViewDataTable_HtmlTable protected function getRequestString() { $requestString = parent::getRequestString(); - if($this->processOnlyIdGoal > Piwik_DataTable_Filter_AddColumnsProcessedMetricsGoal::GOALS_FULL_TABLE) + if($this->processOnlyIdGoal > Piwik_DataTable_Filter_AddColumnsProcessedMetricsGoal::GOALS_FULL_TABLE + || $this->isEcommerce + ) { $requestString .= "&filter_only_display_idgoal=".$this->processOnlyIdGoal; } diff --git a/lang/ar.php b/lang/ar.php index 80473c655e..11f74bed9d 100644 --- a/lang/ar.php +++ b/lang/ar.php @@ -463,7 +463,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'يجب أن يكون طول الرسالة %s رمزاً على الأقل.', 'Feedback_ExceptionNoUrls' => 'لا يمكن أن تتضمن الرسالة روابط ويب لتجنب الرسائل المزعجة.', 'Goals_Goals' => 'الأهداف', - 'Goals_Overview' => 'نظرة عامة', 'Goals_GoalsOverview' => 'نظرة عامة على الأهداف', 'Goals_GoalsManagement' => 'إدارة الأهداف', 'Goals_ConversionsOverviewBy' => 'التحويل العام بواسطة نوع الزيارة', diff --git a/lang/bg.php b/lang/bg.php index ab5f8d8b5b..aab6724a5f 100644 --- a/lang/bg.php +++ b/lang/bg.php @@ -455,7 +455,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Съобщението трябва да бъде дълго поне %s символа.', 'Feedback_ExceptionNoUrls' => 'За да се избегнат спам съобщения, не може да добавяте URL адрес във Вашето съобщение.', 'Goals_Goals' => 'Цели', - 'Goals_Overview' => 'Общ преглед', 'Goals_GoalsOverview' => 'Общ преглед на целите', 'Goals_GoalsManagement' => 'Управление на целите', 'Goals_ViewGoalsBy' => 'Преглед на цели по %s', diff --git a/lang/cs.php b/lang/cs.php index 1afc8e1659..7f6126f1f5 100644 --- a/lang/cs.php +++ b/lang/cs.php @@ -403,7 +403,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Zpráva musí být dlouhá alespon %s znaků', 'Feedback_ExceptionNoUrls' => 'Zpráva nemůže obsahovat URL, aby se zabránilo spamu', 'Goals_Goals' => 'Cíle', - 'Goals_Overview' => 'Přehled', 'Goals_GoalsOverview' => 'Přehled cílů', 'Goals_GoalsManagement' => 'Správa cílů', 'Goals_PluginDescription' => 'Vytvořít cíle a zobrazit hlášení o konverzi cílů: vývoj v čase, příjem za návštěvu, konverze za refereru, klíčové slovo, atd.', diff --git a/lang/da.php b/lang/da.php index 63375ba295..a376246da8 100644 --- a/lang/da.php +++ b/lang/da.php @@ -448,7 +448,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Meddelelse skal være på mindst %s tegn.', 'Feedback_ExceptionNoUrls' => 'For at undgå spam, kan meddelelsen ikke indeholde en netadresse.', 'Goals_Goals' => 'Mål', - 'Goals_Overview' => 'Oversigt', 'Goals_GoalsOverview' => 'Måloversigt', 'Goals_GoalsManagement' => 'Mål administration', 'Goals_ConversionsOverviewBy' => 'Konverteringsoversigt efter besøgstype', diff --git a/lang/de.php b/lang/de.php index daca73ad37..d038a1a7a8 100644 --- a/lang/de.php +++ b/lang/de.php @@ -465,7 +465,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Die Nachricht muss mindestens %s Zeichen lang sein.', 'Feedback_ExceptionNoUrls' => 'Um Spam zu vermeiden, darf die Nachricht keine URL enthalten.', 'Goals_Goals' => 'Ziele', - 'Goals_Overview' => 'Übersicht', 'Goals_GoalsOverview' => 'Ziele-Übersicht', 'Goals_GoalsManagement' => 'Ziele-Management', 'Goals_ConversionsOverviewBy' => 'Überblick über Konversionen nach Besuchstyp', @@ -1246,7 +1245,7 @@ $translations = array( 'PDFReports_PiwikReports' => 'Piwik-Berichte', 'PDFReports_EmailHello' => 'Hallo,', 'PDFReports_PleaseFindAttachedFile' => 'Sie finden in der angehängten Datei Ihren %1$s Bericht für %2$s.', - 'PDFReports_Pagination' => 'Seite %s von %s', + 'PDFReports_Pagination' => 'Seite %s von %s', // FOR REVIEW 'EntryPage_Bounces' => 'Absprünge', diff --git a/lang/el.php b/lang/el.php index ec4132e31c..5926963787 100644 --- a/lang/el.php +++ b/lang/el.php @@ -463,7 +463,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Το μήνυμα πρέπει να είναι τουλάχιστον %s χαρακτήρες.', 'Feedback_ExceptionNoUrls' => 'Το μήνυμα δεν μπορεί να περιέχει URL, για αποφυγεί κακόβουλων μηνυμάτων.', 'Goals_Goals' => 'Στόχοι', - 'Goals_Overview' => 'Επισκόπηση', 'Goals_GoalsOverview' => 'Επισκόπηση στόχων', 'Goals_GoalsManagement' => 'Διαχείριση στόχων', 'Goals_ConversionsOverviewBy' => 'Επισκόπηση μετατροπών ανά τμήμα', diff --git a/lang/en.php b/lang/en.php index 6150ba364a..bce352f758 100644 --- a/lang/en.php +++ b/lang/en.php @@ -41,6 +41,10 @@ $translations = array( 'General_Done' => 'Done', 'General_Name' => 'Name', 'General_Value' => 'Value', + 'General_AverageOrderValue' => 'Average Order Value', + 'General_PurchasedProducts' => 'Purchased Products', + 'General_EcommerceOrders' => 'Ecommerce Orders', + 'General_TotalRevenue' => 'Total Revenue', 'General_Quantity' => 'Quantity', 'General_Price' => 'Price', 'General_Subtotal' => 'Subtotal', @@ -510,7 +514,6 @@ $translations = array( 'Feedback_ExceptionNoUrls' => 'The message cannot contain a URL, to avoid spam messages.', 'Goals_Goals' => 'Goals', 'Goals_EcommerceAndGoalsMenu' => 'Ecommerce & Goals', - 'Goals_Overview' => 'Overview', 'Goals_Ecommerce' => 'Ecommerce', 'Goals_EcommerceOrder' => 'Ecommerce order', 'Goals_AbandonedCart' => 'Abandoned Cart', @@ -526,14 +529,17 @@ $translations = array( 'Goals_PluginDescription' => 'Create Goals and see reports about your goal conversions: evolution over time, revenue per visit, conversions per referrer, per keyword, etc.', 'Goals_ConversionByTypeReportDocumentation' => 'This report provides detailed information about the goal performance (conversions, conversion rates and revenue per visit) for each of the categories available in the left panel. %s Please click on one of the categories to view the report. %s For more information, read the %sTracking Goals documentation on piwik.org%s', 'Goals_ColumnConversions' => 'Conversions', - 'Goals_ColumnConversionsDocumentation' => 'The number of visits that triggered the goal %s.', + 'Goals_ColumnConversionsDocumentation' => 'The number of conversions for %s.', 'Goals_ColumnRevenue' => 'Revenue', - 'Goals_ColumnRevenueDocumentation' => 'The total revenue generated by %s conversions divided by the number of visits.', + 'Goals_ColumnRevenueDocumentation' => 'The total revenue generated by %s conversions.', 'Goals_ColumnConversionRateDocumentation' => 'The percentage of visits that triggered the goal %s.', - 'Goals_ColumnRevenuePerVisitDocumentation' => 'The total revenue generated by all goal conversions divided by the number of visits.', + 'Goals_ColumnRevenuePerVisitDocumentation' => 'The total revenue generated by %s divided by the number of visits.', + 'Goals_ColumnAverageOrderRevenueDocumentation' => 'Average Order Value (AOV) is the total revenue from all Ecommerce Orders divided by the number of orders.', + 'Goals_ColumnPurchasedProductsDocumentation' => 'The number of purchased products is the sum of Product quantities sold in all Ecommerce orders.', 'Goals_ColumnVisits' => 'The total number of visits, regardless of whether a goal was triggered or not.', 'Goals_GoalX' => 'Goal %s', 'Goals_GoalConversion' => 'Goal conversion', + 'Goals_GoalConversions' => 'Goal conversions', 'Goals_OverallRevenue' => '%s overall revenue', 'Goals_OverallConversionRate' => '%s overall conversion rate (visits with a completed goal)', 'Goals_Conversions' => '%s conversions', diff --git a/lang/es.php b/lang/es.php index 24bd641778..52f5f03679 100644 --- a/lang/es.php +++ b/lang/es.php @@ -420,7 +420,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'El mensaje debe tener al menos %s caracteres de largo', 'Feedback_ExceptionNoUrls' => 'Este mensaje no puede contener URL, para evitar mensajes de spam.', 'Goals_Goals' => 'Objetivos', - 'Goals_Overview' => 'Vista general', 'Goals_GoalsOverview' => 'Vista de objetivos', 'Goals_GoalsManagement' => 'Administración de objetivos', 'Goals_PluginDescription' => 'Crear Objetivos y ver informes acerca de las conversiones de su objetivo: evolución en el tiempo, los ingresos por visita, conversiones por referente, por palabra clave, etc', diff --git a/lang/eu.php b/lang/eu.php index 6238306b86..0060aef5e3 100644 --- a/lang/eu.php +++ b/lang/eu.php @@ -325,7 +325,6 @@ $translations = array( 'DBStats_IndexSize' => 'Indizearen tamaina', 'DBStats_TotalSize' => 'Tamaina osoa', 'Goals_Goals' => 'Helburuak', - 'Goals_Overview' => 'Orokorra', 'Goals_GoalsOverview' => 'Helburuen ikuspegi orokorra', 'Goals_GoalsManagement' => 'Helburuen kudeaketa', 'Goals_ColumnConversions' => 'Bihurketa', diff --git a/lang/fi.php b/lang/fi.php index 1544068320..a1ec59f8eb 100644 --- a/lang/fi.php +++ b/lang/fi.php @@ -420,7 +420,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Viestin pitää olla vähintään %s merkkiä pitkä.', 'Feedback_ExceptionNoUrls' => 'Viesti ei voi sisältää URL-osoitteita. Tällä vältetään roskapostia.', 'Goals_Goals' => 'Tavoitteet', - 'Goals_Overview' => 'Yleiskatsaus', 'Goals_GoalsOverview' => 'Tavoitteiden yleiskatsaus', 'Goals_GoalsManagement' => 'Tavoitteiden hallinta', 'Goals_PluginDescription' => 'Luo tavoitteita ja katso raportteja: muutokset, tulot per käynti, siirtymisiä per viittaaja, per hakusana jne.', diff --git a/lang/fr.php b/lang/fr.php index fce50eb397..ef2e7c0dd4 100644 --- a/lang/fr.php +++ b/lang/fr.php @@ -463,7 +463,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Le message doit faire au moins %s caractères de longueur.', 'Feedback_ExceptionNoUrls' => 'Le message ne peut contenir d\'URL pour éviter les problèmes de spam.', 'Goals_Goals' => 'Objectifs', - 'Goals_Overview' => 'Vue d\'ensemble', 'Goals_GoalsOverview' => 'Vue d\'ensemble des Objectifs', 'Goals_GoalsManagement' => 'Gestion des Objectifs', 'Goals_ConversionsOverviewBy' => 'Vue d\'ensemble des conversions par type de visite', diff --git a/lang/hu.php b/lang/hu.php index b5d6fcf75a..851bc1f267 100644 --- a/lang/hu.php +++ b/lang/hu.php @@ -420,7 +420,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Az üzenetnek legalább %s karakter hosszúnak kell lennie.', 'Feedback_ExceptionNoUrls' => 'Az üzenet nem tartalmazhat URL-t, hogy elkerüljük a spam üzenetek elküldését.', 'Goals_Goals' => 'Célok', - 'Goals_Overview' => 'Áttekintés', 'Goals_GoalsOverview' => 'Célok áttekintése', 'Goals_GoalsManagement' => 'Célok kezelése', 'Goals_PluginDescription' => 'Hozz létre célokat és hogy részlete jelentésekkel rendelkezz a célkonverziókról: tendenciákat, az egy látogatásra jutó bevételt, a hivatkozó források vagy kulcsszavak szerinti konverziókat, stb.', diff --git a/lang/id.php b/lang/id.php index 01efb4b55b..9ca0be4d9c 100644 --- a/lang/id.php +++ b/lang/id.php @@ -416,7 +416,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Pesah harus mempunyai panjang setidaknya %s karakter.', 'Feedback_ExceptionNoUrls' => 'Pesan tidak dapat mengandung sebuah URL, untuk menghindari pesan span.', 'Goals_Goals' => 'Tujuan', - 'Goals_Overview' => 'Ikhtisar', 'Goals_GoalsOverview' => 'Ikhtisar tujuan', 'Goals_GoalsManagement' => 'Manajemen Tujuan', 'Goals_PluginDescription' => 'Buat Tujuan dan lihat laporan tentang konversi tujuan Anda: perkembangan dari waktu ke waktu, pendapatan setiap kunjungan, konversi setiap referal, setiap kata kunci, dan lain-lain.', diff --git a/lang/is.php b/lang/is.php index e998dd06ef..de54aee6a0 100644 --- a/lang/is.php +++ b/lang/is.php @@ -317,7 +317,6 @@ $translations = array( 'DBStats_TotalSize' => 'Heildarstærð', 'ExampleAPI_PluginDescription' => 'Dæmi íbót: Hvernig á að búa til API fyrir þína íbót til að flytja gögn þín í mörgum sniðum án sérstakar kóðunar?', 'Goals_Goals' => 'Markmið', - 'Goals_Overview' => 'Yfirlit', 'Goals_GoalsOverview' => 'Yfirlit Markmiða', 'Goals_GoalsManagement' => 'Markmiðastjórnun', 'Goals_ColumnConversions' => 'Umbreytingar', diff --git a/lang/it.php b/lang/it.php index f435e49c07..8588994988 100644 --- a/lang/it.php +++ b/lang/it.php @@ -450,7 +450,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Il messaggio deve essere lungo almeno %s caratteri.', 'Feedback_ExceptionNoUrls' => 'Il messaggio non può contenere URL, per evitare messaggi di SPAM.', 'Goals_Goals' => 'Goal', - 'Goals_Overview' => 'Panoramica', 'Goals_GoalsOverview' => 'Panoramica Goal', 'Goals_GoalsManagement' => 'Gestione Goal', 'Goals_ViewGoalsBy' => 'Vedi goal da %s', diff --git a/lang/ja.php b/lang/ja.php index c16df65e86..3f4d697272 100644 --- a/lang/ja.php +++ b/lang/ja.php @@ -431,7 +431,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'メッセージは少なくとも %s 文字以上が必要です。', 'Feedback_ExceptionNoUrls' => 'スパムメッセージを防止するため、メッセージに URL を含めることはできません。', 'Goals_Goals' => '目標', - 'Goals_Overview' => '概観', 'Goals_GoalsOverview' => '目標の概観', 'Goals_GoalsManagement' => '目標の管理', 'Goals_PluginDescription' => '目標を作成し、目標コンバージョンに関するリポート(一定期間の推移、ビジット単位の収益、参照元やキーワード単位のコンバージョン等)を表示します。', diff --git a/lang/ka.php b/lang/ka.php index 33c4d6ba8e..1e0846882f 100644 --- a/lang/ka.php +++ b/lang/ka.php @@ -430,7 +430,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'წერილი %s სიმბოლოს მაინც უნდა შეიცავდეს.', 'Feedback_ExceptionNoUrls' => 'წერილი არ შეიძლება შეიცავდეს URL–ს, არასასურველი წერილებისგან თავის დაცვის გამო.', 'Goals_Goals' => 'მიზნები', - 'Goals_Overview' => 'მიმოხილვა', 'Goals_GoalsOverview' => 'მიზნების მიმოხილვა', 'Goals_GoalsManagement' => 'მიზნების მენეჯმენტი', 'Goals_PluginDescription' => 'შექმენით მიზანი და იხილეთ რეპორტები თქვენი მიზნის კონვერსიის შესახებ: დროის მიხედვით ევოლუცია, შემოსავალი ვიზიტზე, კონვერსიები რეფერერზე, საკვანძო სიტყვაზე, და სხვ.', diff --git a/lang/lt.php b/lang/lt.php index c5d4e7b8a7..07bc3ac8e8 100644 --- a/lang/lt.php +++ b/lang/lt.php @@ -413,7 +413,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Žinutė privalo būti mažiausiai %s simbolių ilgio.', 'Feedback_ExceptionNoUrls' => 'Žinutės tekste negali būti interneto adresų (URL) siekiant išvengti brukalų.', 'Goals_Goals' => 'Uždaviniai', - 'Goals_Overview' => 'Apžvalga', 'Goals_GoalsOverview' => 'Uždavinių apžvalga', 'Goals_GoalsManagement' => 'Uždavinių valdymas', 'Goals_PluginDescription' => 'Sukurkite uždavinius ir stebėkite ataskaitas apie uždavinių konversijas: raidą per laikotarpį, vizito pajamas, nuorodų, raktažodžių konversijas ir t.t.', diff --git a/lang/nb.php b/lang/nb.php index d46757b1c1..26fea919f8 100644 --- a/lang/nb.php +++ b/lang/nb.php @@ -407,7 +407,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Meldingen må være minst %s tegn lang.', 'Feedback_ExceptionNoUrls' => 'Meldingen kan ikke inneholde en URL (for å unngå spam)', 'Goals_Goals' => 'Mål', - 'Goals_Overview' => 'Oversikt', 'Goals_ColumnConversions' => 'Konvertering', 'Goals_ColumnRevenue' => 'Inntekter', 'Goals_AddNewGoal' => 'Legg til et nytt mål', diff --git a/lang/nl.php b/lang/nl.php index 5ccc2e7509..ca3c47e9b6 100644 --- a/lang/nl.php +++ b/lang/nl.php @@ -437,7 +437,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Het bericht moet tenminste %s tekens bevatten.', 'Feedback_ExceptionNoUrls' => 'Het bericht mag geen URL bevatten, om spam berichten te vermijden', 'Goals_Goals' => 'Doelen', - 'Goals_Overview' => 'Overzicht', 'Goals_GoalsOverview' => 'Overzicht van doelen', 'Goals_GoalsManagement' => 'Doel beheer', 'Goals_ViewGoalsBy' => 'Bekijk doelen volgens %s', diff --git a/lang/nn.php b/lang/nn.php index b462b2f95b..0f83ede041 100644 --- a/lang/nn.php +++ b/lang/nn.php @@ -334,7 +334,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Meldinga må vera minst %s teikn lang.', 'Feedback_ExceptionNoUrls' => 'For å forhindra søppelpost, kan ikkje meldinga innehalda URLar.', 'Goals_Goals' => 'Mål', - 'Goals_Overview' => 'Oversikt', 'Goals_GoalsOverview' => 'Måloversikt', 'Goals_ColumnConversions' => 'Overgangar', 'Goals_ColumnRevenue' => 'Forteneste', diff --git a/lang/pl.php b/lang/pl.php index 9a7a154635..eaeaf070e4 100644 --- a/lang/pl.php +++ b/lang/pl.php @@ -368,7 +368,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Wiadomość musi zawierać przynajmniej %s znaków.', 'Feedback_ExceptionNoUrls' => 'Ta wiadomość nie może zawierać adresów URL, aby uniknąć spamu.', 'Goals_Goals' => 'Cele', - 'Goals_Overview' => 'Przegląd', 'Goals_GoalsOverview' => 'Przegląd celów', 'Goals_GoalsManagement' => 'Zarządzanie celami', 'Goals_PluginDescription' => 'Twórz cele i przeglądaj raporty z konwersji: rozwój w czasie, przychód z wizyty, konwersja dla odnośnika, dla słowa kluczowego itp.', diff --git a/lang/pt-br.php b/lang/pt-br.php index 80a6ac718e..3618118ea2 100644 --- a/lang/pt-br.php +++ b/lang/pt-br.php @@ -409,7 +409,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'A mensagem deve ter pelo menos %s caracteres.', 'Feedback_ExceptionNoUrls' => 'A mensagem não pode conter uma URL para evitar mensagens spam.', 'Goals_Goals' => 'Metas', - 'Goals_Overview' => 'Visão Geral', 'Goals_GoalsOverview' => 'Visão geral de metas', 'Goals_GoalsManagement' => 'Gerenciamento de metas', 'Goals_PluginDescription' => 'Crie metas e veja relatórios sobre suas metas de conversão: evolução sobre o tempo, lucro por visita, conversões por referencia, por palavra-chave, etc.', diff --git a/lang/pt.php b/lang/pt.php index 6b49c92bcd..99164c0ac9 100644 --- a/lang/pt.php +++ b/lang/pt.php @@ -413,7 +413,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'A mensagem tem que ter no mínimo %s caracteres.', 'Feedback_ExceptionNoUrls' => 'A mensagem não pode conter um endereço para evitar mensagens spam.', 'Goals_Goals' => 'Objectivos', - 'Goals_Overview' => 'Vista geral', 'Goals_GoalsOverview' => 'Vista geral dos Objectivos', 'Goals_GoalsManagement' => 'Gerir objectivos', 'Goals_PluginDescription' => 'Criar Objectivos e ver relatórios acerca das suas conversões de objectivos: evolução ao longo do tempo, rendimento por visita, conversões por referente, por palavra chave, etc.', diff --git a/lang/ru.php b/lang/ru.php index ec1dd09690..35490f1fea 100644 --- a/lang/ru.php +++ b/lang/ru.php @@ -457,7 +457,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Сообщение должно быть как минимум %s символов.', 'Feedback_ExceptionNoUrls' => 'Сообщение не может содержать URL, это мера предотвращения спама.', 'Goals_Goals' => 'Цели', - 'Goals_Overview' => 'Обзор', 'Goals_GoalsOverview' => 'Обзор целей', 'Goals_GoalsManagement' => 'Управления целями', 'Goals_ConversionsOverviewBy' => 'Обзор конверсий по типам посещения', diff --git a/lang/sk.php b/lang/sk.php index 4bfebf8263..b74f1aa47e 100644 --- a/lang/sk.php +++ b/lang/sk.php @@ -333,7 +333,6 @@ $translations = array( 'DBStats_IndexSize' => 'Veľkosť indexu', 'DBStats_TotalSize' => 'Celková veľkosť', 'Goals_Goals' => 'Ciele', - 'Goals_Overview' => 'Prehľad', 'Goals_GoalsOverview' => 'Prehľad cieľov', 'Goals_GoalsManagement' => 'Správa cieľov', 'Goals_ColumnConversions' => 'Konverzie', diff --git a/lang/sl.php b/lang/sl.php index a39c93d980..a3d4a2f6b6 100644 --- a/lang/sl.php +++ b/lang/sl.php @@ -337,7 +337,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Sporočilo mora biti dolgo vsaj %s znakov.', 'Feedback_ExceptionNoUrls' => 'Sporočilo ne sme vsebovati URL-ja, da ne bo padlo pod vsiljeno pošto.', 'Goals_Goals' => 'Cilji', - 'Goals_Overview' => 'Pregled', 'Goals_GoalsOverview' => 'Pregled ciljev', 'Goals_GoalsManagement' => 'Upravljanje ciljev', 'Goals_GoalX' => 'Cilj %s', diff --git a/lang/sq.php b/lang/sq.php index e4374879de..a09c2f4250 100644 --- a/lang/sq.php +++ b/lang/sq.php @@ -463,7 +463,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Mesazhi duhet të jetë e pakta %s shenja i gjatë.', 'Feedback_ExceptionNoUrls' => 'Mesazhet nuk duhet të përmbajnë URL, kjo bëhet për shmangie mesazhesh të padëshiruar.', 'Goals_Goals' => 'Objektiva', - 'Goals_Overview' => 'Përmbledhje', 'Goals_GoalsOverview' => 'Përmbledhje objektivash', 'Goals_GoalsManagement' => 'Administrim objektivash', 'Goals_ConversionsOverviewBy' => 'Përmbledhje shndërrimesh sipas llojit të vizitave', diff --git a/lang/sr.php b/lang/sr.php index 2613bf3a1a..d9a54de8cd 100644 --- a/lang/sr.php +++ b/lang/sr.php @@ -451,7 +451,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Poruka mora imati barem %s znakova.', 'Feedback_ExceptionNoUrls' => 'Poruka ne sme sadržati web adresu kako bismo izbegli neželjene reklamne poruke', 'Goals_Goals' => 'Ciljevi', - 'Goals_Overview' => 'Pregled', 'Goals_GoalsOverview' => 'Pregled ciljeva', 'Goals_GoalsManagement' => 'Upravljanje ciljevima', 'Goals_ConversionsOverviewBy' => 'Pregled ispunjenja ciljeva po tipu posete', diff --git a/lang/sv.php b/lang/sv.php index c9ebb452bf..7e6ac89d5c 100644 --- a/lang/sv.php +++ b/lang/sv.php @@ -464,7 +464,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Meddelandet måste vara minst %s tecken långt.', 'Feedback_ExceptionNoUrls' => 'Meddelandet får inte innehålla länkar, detta för att undvika spam meddelanden.', 'Goals_Goals' => 'Mål', - 'Goals_Overview' => 'Översikt', 'Goals_GoalsOverview' => 'Målöversikt', 'Goals_GoalsManagement' => 'Målhantering', 'Goals_ConversionsOverviewBy' => 'Konverteringar översikt per typ av besök', diff --git a/lang/th.php b/lang/th.php index b82c8e1ad5..61bb844cc5 100644 --- a/lang/th.php +++ b/lang/th.php @@ -456,7 +456,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'ข้อความต้องมีความยาวน้อยกว่าความยาวอักขระ %s', 'Feedback_ExceptionNoUrls' => 'ข้อความไม่สามารถประกอบด้วย URL เพื่อหลีกเลี่ยงข้อความสแปม', 'Goals_Goals' => 'เป้าหมาย', - 'Goals_Overview' => 'ภาพรวม', 'Goals_GoalsOverview' => 'ภาพรวมของเป้าหมาย', 'Goals_GoalsManagement' => 'จัดการเป้าหมาย', 'Goals_ConversionsOverviewBy' => 'ภาพรวมการแปลงตามประเภทของการเข้าชม', diff --git a/lang/tr.php b/lang/tr.php index cec8c8b81e..e88fa47eb7 100644 --- a/lang/tr.php +++ b/lang/tr.php @@ -365,7 +365,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Mesajınız en az %s karakter uzunluğunda olmalı', 'Feedback_ExceptionNoUrls' => 'Spam mesajlardan kaçınmak için mesajınız URL içeremez.', 'Goals_Goals' => 'Goals', - 'Goals_Overview' => 'Genel bakış', 'Goals_GoalsOverview' => 'Goals Genel bakış', 'Goals_GoalsManagement' => 'Goals Yönetimi', 'Goals_GoalX' => 'Hedef \'%s\'', diff --git a/lang/uk.php b/lang/uk.php index dfef688801..e41f2b9019 100644 --- a/lang/uk.php +++ b/lang/uk.php @@ -431,7 +431,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => 'Повідомлення має містити як мінімум %s символів.', 'Feedback_ExceptionNoUrls' => 'Щоб уникнути спаму, повідомлення не може містити URL.', 'Goals_Goals' => 'Цілі', - 'Goals_Overview' => 'Огляд', 'Goals_GoalsOverview' => 'Огляд цілей', 'Goals_GoalsManagement' => 'Керування цілями', 'Goals_PluginDescription' => 'Створюйте цілі та переглядайте звіти про конвертсію ваших цілей: зміну в часі, прибуток на відвідувача, конверсію на джерело трафіку, по ключових словах, тощо...', diff --git a/lang/zh-cn.php b/lang/zh-cn.php index 9536285d6c..174afb3b8a 100644 --- a/lang/zh-cn.php +++ b/lang/zh-cn.php @@ -402,7 +402,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => '信息至少要有 %s 的字符以上。', 'Feedback_ExceptionNoUrls' => '信息不能包含一个网址,由此避免垃圾信息。', 'Goals_Goals' => '目标', - 'Goals_Overview' => '概述', 'Goals_GoalsOverview' => '目标概述', 'Goals_GoalsManagement' => '目标管理', 'Goals_PluginDescription' => '建立目标然后查看关于您的目标转换率报表:时间的演变趋势、每次访问的收入、每个关键字等等。', diff --git a/lang/zh-tw.php b/lang/zh-tw.php index 9e82369b7b..5f02ff7d0f 100644 --- a/lang/zh-tw.php +++ b/lang/zh-tw.php @@ -414,7 +414,6 @@ $translations = array( 'Feedback_ExceptionBodyLength' => '訊息至少要有 %s 的字元以上。', 'Feedback_ExceptionNoUrls' => '訊息不能包含一個網址,藉此避免垃圾訊息。', 'Goals_Goals' => '目標', - 'Goals_Overview' => '總覽', 'Goals_GoalsOverview' => '目標總覽', 'Goals_GoalsManagement' => '目標管理', 'Goals_PluginDescription' => '建立目標然後查看關於你的目標轉換率報表:時間的演變趨勢、每次訪問的收入、每個關鍵字等等。', diff --git a/plugins/CoreHome/templates/broadcast.js b/plugins/CoreHome/templates/broadcast.js index aba008a8bf..e9bec750f2 100644 --- a/plugins/CoreHome/templates/broadcast.js +++ b/plugins/CoreHome/templates/broadcast.js @@ -92,7 +92,8 @@ broadcast.propagateAjax = function (ajaxUrl) // if the module is not 'Goals', we specifically unset the 'idGoal' parameter // this is to ensure that the URLs are clean (and that clicks on graphs work as expected - they are broken with the extra parameter) - if(broadcast.getParamValue('action', currentHashStr) != 'goalReport') + var action = broadcast.getParamValue('action', currentHashStr); + if( action != 'goalReport' && action != 'ecommerceReport') { currentHashStr = broadcast.updateParamValue('idGoal=', currentHashStr); } diff --git a/plugins/CoreHome/templates/datatable_footer.tpl b/plugins/CoreHome/templates/datatable_footer.tpl index 20a8e3b060..3d0713b657 100644 --- a/plugins/CoreHome/templates/datatable_footer.tpl +++ b/plugins/CoreHome/templates/datatable_footer.tpl @@ -21,7 +21,6 @@ {/if} <span class="loadingPiwik" style='display:none'><img src="themes/default/images/loading-blue.gif" /> {'General_LoadingData'|translate}</span> - {if $properties.show_footer_icons} <div class="dataTableFooterIcons"> <div class="dataTableFooterWrap" var="{$javascriptVariablesToSet.viewDataTable}"> @@ -35,7 +34,7 @@ <a class="tableIcon" format="tableAllColumns" var="tableAllColumns"><img title="{'General_DisplayTableWithMoreMetrics'|translate}" src="themes/default/images/table_more.png" /></a> {/if} {if $properties.show_goals} - <a class="tableIcon" format="tableGoals" var="tableGoals"><img title="{'General_DisplayTableWithGoalMetrics'|translate}" src="themes/default/images/goal.png" /></a> + <a class="tableIcon" format="tableGoals" var="tableGoals"><img title="{'General_DisplayTableWithGoalMetrics'|translate}" src="themes/default/images/{if $javascriptVariablesToSet.filter_only_display_idgoal=='ecommerceOrder'}ecommerceOrder.gif{else}goal.png{/if}" /></a> {/if} </span> </div> diff --git a/plugins/CoreHome/templates/menu.js b/plugins/CoreHome/templates/menu.js index 792d07f0ec..fee6f568a1 100644 --- a/plugins/CoreHome/templates/menu.js +++ b/plugins/CoreHome/templates/menu.js @@ -81,7 +81,6 @@ menu.prototype = var module = broadcast.getValueFromUrl("module",url); var action = broadcast.getValueFromUrl("action",url); var idGoal = broadcast.getValueFromUrl("idGoal",url); - var main_menu = ($(this).parent().attr("class").match(/nav/)) ? true : false; if(main_menu) { @@ -103,11 +102,10 @@ menu.prototype = activateMenu : function(module,action,idGoal) { - // getting the right li is a little tricky since goals uses idGoal, and overview is index. var $li = ''; // So, if module is Goals, idGoal is present, and action is not Index, must be one of the goals - if(module == 'Goals' && idGoal != '' && action != 'index') { + if(module == 'Goals' && idGoal != '' && (action != 'index')) { $li = $("#" + module + "_" + action + "_" + idGoal); } else { $li = $("#" + module + "_" + action); diff --git a/plugins/Goals/API.php b/plugins/Goals/API.php index 123b7fe3e4..69db030016 100644 --- a/plugins/Goals/API.php +++ b/plugins/Goals/API.php @@ -281,6 +281,17 @@ class Piwik_Goals_API if(empty($columns)) { $columns = Piwik_Goals::getGoalColumns($idGoal); + if($idGoal == 'ecommerceOrder') + { + $columns[] = 'avg_order_revenue'; + } + } + if(in_array('avg_order_revenue', $columns) + && $idGoal == 'ecommerceOrder') + { + $columns[] = 'nb_conversions'; + $columns[] = 'revenue'; + $columns = array_unique($columns); } $columnsToSelect = array(); foreach($columns as &$columnName) @@ -294,9 +305,41 @@ class Piwik_Goals_API { $dataTable->renameColumn($oldName, $columns[$id]); } + if($idGoal == 'ecommerceOrder') + { + if($dataTable instanceof Piwik_DataTable_Array) + { + foreach($dataTable->getArray() as $row) + { + $this->enrichTable($row); + } + } + else + { + $this->enrichTable($dataTable); + } + } return $dataTable; } + protected function enrichTable($table) + { + $row = $table->getFirstRow(); + if(!$row) + { + return; + } + // AVG order per visit + if(false !== $table->getColumn('avg_order_revenue')) + { + $conversions = $row->getColumn('nb_conversions'); + if($conversions) + { + $row->setColumn('avg_order_revenue', round($row->getColumn('revenue') / $conversions, 2)); + } + } + } + protected function getNumeric( $idSite, $period, $date, $segment, $toFetch ) { Piwik::checkUserHasViewAccess( $idSite ); diff --git a/plugins/Goals/Controller.php b/plugins/Goals/Controller.php index b00c8d1d0b..477d5458ab 100644 --- a/plugins/Goals/Controller.php +++ b/plugins/Goals/Controller.php @@ -22,6 +22,8 @@ class Piwik_Goals_Controller extends Piwik_Controller 'nb_conversions' => 'Goals_ColumnConversions', 'conversion_rate'=> 'General_ColumnConversionRate', 'revenue' => 'Goals_ColumnRevenue', + 'items' => 'General_PurchasedProducts', + 'avg_order_revenue' => 'General_AverageOrderValue', ); private function formatConversionRate($conversionRate) @@ -59,15 +61,35 @@ class Piwik_Goals_Controller extends Piwik_Controller echo $view->render(); } - protected function getGoalReportView() + public function ecommerceReport() { - $idGoal = Piwik_Common::getRequestVar('idGoal', null, 'int'); - if(!isset($this->goals[$idGoal])) + $view = $this->getGoalReportView($idGoal = 'ecommerceOrder'); + $view->displayFullReport = true; + $view->goalDimensions = Piwik_Goals::getReportsWithGoalMetrics(); + $view->ecommerce = true; + + echo $view->render(); + } + + protected function getGoalReportView($idGoal = false) + { + if($idGoal === false) { - Piwik::redirectToModule('Goals', 'index', array('idGoal' => null)); + $idGoal = Piwik_Common::getRequestVar('idGoal', null, 'string'); + if(!isset($this->goals[$idGoal])) + { + Piwik::redirectToModule('Goals', 'index', array('idGoal' => null)); + } + } + if($idGoal == 'ecommerceOrder') + { + $goalDefinition['name'] = Piwik_Translate('Goals_Ecommerce'); + $goalDefinition['allow_multiple'] = true; + } + else + { + $goalDefinition = $this->goals[$idGoal]; } - $goalDefinition = $this->goals[$idGoal]; - $view = Piwik_View::factory('single_goal'); $this->setGeneralVariablesView($view); $goal = $this->getMetricsForGoal($idGoal); @@ -109,7 +131,7 @@ class Piwik_Goals_Controller extends Piwik_Controller $view->displayFullReport = false; echo $view->render(); } - + protected function getOverviewView() { $view = Piwik_View::factory('overview'); @@ -182,7 +204,7 @@ class Piwik_Goals_Controller extends Piwik_Controller if(empty($idGoal)) { - $idGoal = Piwik_Common::getRequestVar('idGoal', false, 'int'); + $idGoal = Piwik_Common::getRequestVar('idGoal', false, 'string'); } $view = $this->getLastUnitGraph($this->pluginName, __FUNCTION__, 'Goals.get'); $view->setParametersToModify(array('idGoal' => $idGoal)); @@ -248,7 +270,7 @@ class Piwik_Goals_Controller extends Piwik_Controller $topDimension[] = array ( 'name' => $row->getColumn('label'), 'nb_conversions' => $conversions, - 'conversion_rate' => $this->formatConversionRate($row->getColumn($columnConversionRate)), + 'conversion_rate' => $this->formatConversionRate($row->getColumn($columnConversionRate)), 'metadata' => $row->getMetadata(), ); } @@ -270,7 +292,7 @@ class Piwik_Goals_Controller extends Piwik_Controller { $nbVisitsConverted = $nbConversions; } - return array ( + $return = array ( 'id' => $idGoal, 'nb_conversions' => $nbConversions, 'nb_visits_converted' => $nbVisitsConverted, @@ -280,5 +302,16 @@ class Piwik_Goals_Controller extends Piwik_Controller 'urlSparklineConversionRate' => $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('conversion_rate'), 'idGoal' => $idGoal)), 'urlSparklineRevenue' => $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('revenue'), 'idGoal' => $idGoal)), ); + + if($idGoal == 'ecommerceOrder') + { + $return = array_merge($return, array( + 'items' => $dataRow->getColumn('items'), + 'avg_order_revenue' => $dataRow->getColumn('avg_order_revenue'), + 'urlSparklinePurchasedProducts' => $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('items'), 'idGoal' => $idGoal)), + 'urlSparklineAverageOrderValue' => $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('avg_order_revenue'), 'idGoal' => $idGoal)), + )); + } + return $return; } } diff --git a/plugins/Goals/Goals.php b/plugins/Goals/Goals.php index c4faecec85..167b44dc2a 100644 --- a/plugins/Goals/Goals.php +++ b/plugins/Goals/Goals.php @@ -196,15 +196,35 @@ class Piwik_Goals extends Piwik_Plugin $idSite = Piwik_Common::getRequestVar('idSite', null, 'int'); $goals = Piwik_Tracker_GoalManager::getGoalDefinitions($idSite); $mainGoalMenu = $this->getGoalCategoryName($idSite); + $site = new Piwik_Site($idSite); if(count($goals)==0) { - Piwik_AddMenu($mainGoalMenu, '', array('module' => 'Goals', 'action' => 'addNewGoal'), true, 25); + Piwik_AddMenu($mainGoalMenu, '', array( + 'module' => 'Goals', + 'action' => ($site->isEcommerceEnabled() ? 'ecommerceReport' : 'addNewGoal'), + 'idGoal' => ($site->isEcommerceEnabled() ? 'ecommerceOrder' : null)), + true, + 25); + if($site->isEcommerceEnabled()) + { + Piwik_AddMenu($mainGoalMenu, 'Goals_Ecommerce', array('module' => 'Goals', 'action' => 'ecommerceReport', 'idGoal' => 'ecommerceOrder'), true, 1); + } Piwik_AddMenu($mainGoalMenu, 'Goals_AddNewGoal', array('module' => 'Goals', 'action' => 'addNewGoal')); } else { - Piwik_AddMenu($mainGoalMenu, '', array('module' => 'Goals', 'action' => 'index'), true, 25); - Piwik_AddMenu($mainGoalMenu, 'Goals_Overview', array('module' => 'Goals', 'action' => 'index'), true, 1); + Piwik_AddMenu($mainGoalMenu, '', array( + 'module' => 'Goals', + 'action' => ($site->isEcommerceEnabled() ? 'ecommerceReport' : 'index'), + 'idGoal' => ($site->isEcommerceEnabled() ? 'ecommerceOrder' : null)), + true, + 25); + + if($site->isEcommerceEnabled()) + { + Piwik_AddMenu($mainGoalMenu, 'Goals_Ecommerce', array('module' => 'Goals', 'action' => 'ecommerceReport', 'idGoal' => 'ecommerceOrder'), true, 1); + } + Piwik_AddMenu($mainGoalMenu, 'Goals_GoalsOverview', array('module' => 'Goals', 'action' => 'index'), true, 2); foreach($goals as $goal) { Piwik_AddMenu($mainGoalMenu, str_replace('%', '%%', Piwik_TranslationWriter::clean($goal['name'])), array('module' => 'Goals', 'action' => 'goalReport', 'idGoal' => $goal['idgoal'])); @@ -372,7 +392,6 @@ class Piwik_Goals extends Piwik_Plugin $recordName = self::getRecordName($metricName, $idgoal); $archiveProcessing->insertNumericRecord($recordName, $value); } - $conversion_rate = $this->getConversionRate($values[Piwik_Archive::INDEX_GOAL_NB_VISITS_CONVERTED], $archiveProcessing); $recordName = self::getRecordName('conversion_rate', $idgoal); $archiveProcessing->insertNumericRecord($recordName, $conversion_rate); diff --git a/plugins/Goals/templates/title_and_evolution_graph.tpl b/plugins/Goals/templates/title_and_evolution_graph.tpl index 9df94382f6..be0919b448 100644 --- a/plugins/Goals/templates/title_and_evolution_graph.tpl +++ b/plugins/Goals/templates/title_and_evolution_graph.tpl @@ -7,7 +7,9 @@ <div id='leftcolumn'> <div class="sparkline">{sparkline src=$urlSparklineConversions} - {'Goals_Conversions'|translate:"<strong>$nb_conversions</strong>"} + {if $ecommerce} <strong>{$nb_conversions}</strong> {'General_EcommerceOrders'|translate} + {else}{'Goals_Conversions'|translate:"<strong>$nb_conversions</strong>"} + {/if} {if isset($goalAllowMultipleConversionsPerVisit) && $goalAllowMultipleConversionsPerVisit} ({'VisitsSummary_NbVisits'|translate:"<strong>$nb_visits_converted</strong>"}) {/if} @@ -15,12 +17,29 @@ {if $revenue != 0 } <div class="sparkline">{sparkline src=$urlSparklineRevenue} {assign var=revenue value=$revenue|money:$idSite} - {'Goals_OverallRevenue'|translate:"<strong>$revenue</strong>"}</div> + {if $ecommerce}<strong>{$revenue}</strong> {'General_TotalRevenue'|translate} + {else}{'Goals_OverallRevenue'|translate:"<strong>$revenue</strong>"} + {/if} + </div> + {/if} + {if isset($ecommerce)} + <div class="sparkline">{sparkline src=$urlSparklineAverageOrderValue} + <strong>{$avg_order_revenue|money:$idSite}</strong> {'General_AverageOrderValue'|translate}</div> {/if} + </div> <div id='rightcolumn'> <div class="sparkline">{sparkline src=$urlSparklineConversionRate} - {'Goals_OverallConversionRate'|translate:"<strong>$conversion_rate</strong>"}</div> + {if $ecommerce}{capture assign='ecommerceOrdersText'}{'General_EcommerceOrders'|translate}{/capture} + {'Goals_ConversionRate'|translate:"<strong>$conversion_rate</strong> $ecommerceOrdersText"} + {else} + {'Goals_OverallConversionRate'|translate:"<strong>$conversion_rate</strong>"} + {/if} + </div> + {if isset($ecommerce)} + <div class="sparkline">{sparkline src=$urlSparklinePurchasedProducts} + <strong>{$items}</strong> {'General_PurchasedProducts'|translate}</div> + {/if} </div> diff --git a/plugins/VisitTime/VisitTime.php b/plugins/VisitTime/VisitTime.php index 0986b500f1..ac163fbc33 100644 --- a/plugins/VisitTime/VisitTime.php +++ b/plugins/VisitTime/VisitTime.php @@ -165,13 +165,10 @@ class Piwik_VisitTime extends Piwik_Plugin $goalByServerTime = array(); while($row = $query->fetch()) { - $goalByServerTime[$row['label']][$row['idgoal']] = $archiveProcessing->getGoalRowFromQueryRow($row); - } - $goalByServerTime = $this->convertServerTimeToLocalTimezone($goalByServerTime, $archiveProcessing); - foreach($goalByServerTime as $hour => $goals) - { - $this->interestByServerTime[$hour][Piwik_Archive::INDEX_GOALS] = $goals; + if(!isset($this->interestByServerTime[$row['label']][Piwik_Archive::INDEX_GOALS][$row['idgoal']])) $this->interestByServerTime[$row['label']][Piwik_Archive::INDEX_GOALS][$row['idgoal']] = $archiveProcessing->getNewGoalRow($row['idgoal']); + $archiveProcessing->updateGoalStats($row, $this->interestByServerTime[$row['label']][Piwik_Archive::INDEX_GOALS][$row['idgoal']]); } + $goalByServerTime = $this->convertServerTimeToLocalTimezone($this->interestByServerTime, $archiveProcessing); $archiveProcessing->enrichConversionsByLabelArray($this->interestByServerTime); } diff --git a/tests/integration/Main.test.php b/tests/integration/Main.test.php index 6c0fbfcce9..a34f25cf03 100644 --- a/tests/integration/Main.test.php +++ b/tests/integration/Main.test.php @@ -159,7 +159,7 @@ class Test_Piwik_Integration_Main extends Test_Integration // This hack allows the API proxy to let us generate example URLs for the ignored functions Piwik_API_Proxy::getInstance()->hideIgnoredFunctions = false; - $this->setApiToCall( array('CustomVariables.getCustomVariables', 'Live.getLastVisitsDetails', 'UserCountry', 'API.getProcessedReport', 'Goals.get', 'Goals.getConversions', 'Goals.getItemsSku', 'Goals.getItemsName', 'Goals.getItemsCategory' ) ); + $this->setApiToCall( array('VisitTime', 'CustomVariables.getCustomVariables', 'Live.getLastVisitsDetails', 'UserCountry', 'API.getProcessedReport', 'Goals.get', 'Goals.getConversions', 'Goals.getItemsSku', 'Goals.getItemsName', 'Goals.getItemsCategory' ) ); $this->callGetApiCompareOutput(__FUNCTION__, 'xml', $idSite, $dateTime, $periods = array('day')); $this->setApiToCall( array('Goals.get', 'Goals.getItemsSku', 'Goals.getItemsName', 'Goals.getItemsCategory' ) ); $this->callGetApiCompareOutput(__FUNCTION__, 'xml', $idSite, $dateTime, $periods = array('week')); diff --git a/tests/integration/expected/test_OneVisitorTwoVisits__VisitTime.getVisitInformationPerServerTime_day.xml b/tests/integration/expected/test_OneVisitorTwoVisits__VisitTime.getVisitInformationPerServerTime_day.xml index a34da03d5b..736a024b0e 100644 --- a/tests/integration/expected/test_OneVisitorTwoVisits__VisitTime.getVisitInformationPerServerTime_day.xml +++ b/tests/integration/expected/test_OneVisitorTwoVisits__VisitTime.getVisitInformationPerServerTime_day.xml @@ -122,7 +122,7 @@ <row idgoal='1'> <nb_conversions>1</nb_conversions> <nb_visits_converted>1</nb_visits_converted> - <revenue>42.00</revenue> + <revenue>42</revenue> </row> </goals> <nb_conversions>1</nb_conversions> @@ -140,7 +140,7 @@ <row idgoal='2'> <nb_conversions>1</nb_conversions> <nb_visits_converted>1</nb_visits_converted> - <revenue>1.00</revenue> + <revenue>1</revenue> </row> </goals> <nb_conversions>1</nb_conversions> diff --git a/tests/integration/expected/test_OneVisitorTwoVisits_withCookieSupport__VisitTime.getVisitInformationPerServerTime_day.xml b/tests/integration/expected/test_OneVisitorTwoVisits_withCookieSupport__VisitTime.getVisitInformationPerServerTime_day.xml index a34da03d5b..736a024b0e 100644 --- a/tests/integration/expected/test_OneVisitorTwoVisits_withCookieSupport__VisitTime.getVisitInformationPerServerTime_day.xml +++ b/tests/integration/expected/test_OneVisitorTwoVisits_withCookieSupport__VisitTime.getVisitInformationPerServerTime_day.xml @@ -122,7 +122,7 @@ <row idgoal='1'> <nb_conversions>1</nb_conversions> <nb_visits_converted>1</nb_visits_converted> - <revenue>42.00</revenue> + <revenue>42</revenue> </row> </goals> <nb_conversions>1</nb_conversions> @@ -140,7 +140,7 @@ <row idgoal='2'> <nb_conversions>1</nb_conversions> <nb_visits_converted>1</nb_visits_converted> - <revenue>1.00</revenue> + <revenue>1</revenue> </row> </goals> <nb_conversions>1</nb_conversions> diff --git a/tests/integration/expected/test_apiGetReportMetadata_year__LanguagesManager.getTranslationsForLanguage.xml b/tests/integration/expected/test_apiGetReportMetadata_year__LanguagesManager.getTranslationsForLanguage.xml index 00249a7727..e3b402ecc6 100644 --- a/tests/integration/expected/test_apiGetReportMetadata_year__LanguagesManager.getTranslationsForLanguage.xml +++ b/tests/integration/expected/test_apiGetReportMetadata_year__LanguagesManager.getTranslationsForLanguage.xml @@ -1853,10 +1853,6 @@ <value>Objectifs</value> </row> <row> - <label>Goals_Overview</label> - <value>Vue d'ensemble</value> - </row> - <row> <label>Goals_GoalsOverview</label> <value>Vue d'ensemble des Objectifs</value> </row> diff --git a/tests/integration/expected/test_ecommerceOrderWithItems_GoalOrder__Goals.get_day.xml b/tests/integration/expected/test_ecommerceOrderWithItems_GoalOrder__Goals.get_day.xml index e2457ce0b6..35b8145664 100644 --- a/tests/integration/expected/test_ecommerceOrderWithItems_GoalOrder__Goals.get_day.xml +++ b/tests/integration/expected/test_ecommerceOrderWithItems_GoalOrder__Goals.get_day.xml @@ -9,4 +9,5 @@ <revenue_shipping>100.11</revenue_shipping> <revenue_discount>666</revenue_discount> <items>3</items> + <avg_order_revenue>1555.56</avg_order_revenue> </result>
\ No newline at end of file diff --git a/tests/integration/expected/test_ecommerceOrderWithItems_GoalOrder__Goals.get_week.xml b/tests/integration/expected/test_ecommerceOrderWithItems_GoalOrder__Goals.get_week.xml index 5c6a2acc82..db1835bc9d 100644 --- a/tests/integration/expected/test_ecommerceOrderWithItems_GoalOrder__Goals.get_week.xml +++ b/tests/integration/expected/test_ecommerceOrderWithItems_GoalOrder__Goals.get_week.xml @@ -9,4 +9,5 @@ <revenue_shipping>120.11</revenue_shipping> <revenue_discount>686</revenue_discount> <items>5</items> + <avg_order_revenue>3337.78</avg_order_revenue> </result>
\ No newline at end of file diff --git a/tests/integration/expected/test_ecommerceOrderWithItems__VisitTime.getVisitInformationPerLocalTime_day.xml b/tests/integration/expected/test_ecommerceOrderWithItems__VisitTime.getVisitInformationPerLocalTime_day.xml new file mode 100644 index 0000000000..08b4f90b5e --- /dev/null +++ b/tests/integration/expected/test_ecommerceOrderWithItems__VisitTime.getVisitInformationPerLocalTime_day.xml @@ -0,0 +1,243 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <label>0h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>1h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>2h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>3h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>4h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>5h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>6h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>7h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>8h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>9h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>10h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>11h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>12h</label> + <nb_uniq_visitors>1</nb_uniq_visitors> + <nb_visits>3</nb_visits> + <nb_actions>10</nb_actions> + <max_actions>5</max_actions> + <sum_visit_length>5400</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>2</nb_visits_converted> + </row> + <row> + <label>13h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>14h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>15h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>16h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>17h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>18h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>19h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>20h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>21h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>22h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>23h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> +</result>
\ No newline at end of file diff --git a/tests/integration/expected/test_ecommerceOrderWithItems__VisitTime.getVisitInformationPerServerTime_day.xml b/tests/integration/expected/test_ecommerceOrderWithItems__VisitTime.getVisitInformationPerServerTime_day.xml new file mode 100644 index 0000000000..f2142f8c5f --- /dev/null +++ b/tests/integration/expected/test_ecommerceOrderWithItems__VisitTime.getVisitInformationPerServerTime_day.xml @@ -0,0 +1,279 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <label>0h</label> + <nb_uniq_visitors>1</nb_uniq_visitors> + <nb_visits>1</nb_visits> + <nb_actions>3</nb_actions> + <max_actions>3</max_actions> + <sum_visit_length>720</sum_visit_length> + <bounce_count>0</bounce_count> + <goals> + <row idgoal='1'> + <nb_conversions>1</nb_conversions> + <nb_visits_converted>1</nb_visits_converted> + <revenue>10</revenue> + </row> + </goals> + <nb_conversions>1</nb_conversions> + <revenue>10</revenue> + </row> + <row> + <label>1h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>2h</label> + <nb_uniq_visitors>1</nb_uniq_visitors> + <nb_visits>1</nb_visits> + <nb_actions>5</nb_actions> + <max_actions>5</max_actions> + <sum_visit_length>3960</sum_visit_length> + <bounce_count>0</bounce_count> + <goals> + <row idgoal='ecommerceAbandonedCart'> + <nb_conversions>1</nb_conversions> + <nb_visits_converted>1</nb_visits_converted> + <revenue>2510.11</revenue> + <items>4</items> + </row> + <row idgoal='ecommerceOrder'> + <nb_conversions>2</nb_conversions> + <nb_visits_converted>1</nb_visits_converted> + <revenue>3111.11</revenue> + <revenue_subtotal>2500</revenue_subtotal> + <revenue_tax>511</revenue_tax> + <revenue_shipping>100.11</revenue_shipping> + <revenue_discount>666</revenue_discount> + <items>3</items> + </row> + </goals> + <nb_conversions>2</nb_conversions> + <revenue>3111.11</revenue> + </row> + <row> + <label>3h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>4h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>5h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>6h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>7h</label> + <nb_uniq_visitors>1</nb_uniq_visitors> + <nb_visits>1</nb_visits> + <nb_actions>2</nb_actions> + <max_actions>2</max_actions> + <sum_visit_length>720</sum_visit_length> + <bounce_count>0</bounce_count> + <goals> + <row idgoal='ecommerceAbandonedCart'> + <nb_conversions>1</nb_conversions> + <nb_visits_converted>1</nb_visits_converted> + <revenue>2510.11</revenue> + <items>4</items> + </row> + </goals> + <nb_conversions>0</nb_conversions> + <revenue>0</revenue> + </row> + <row> + <label>8h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>9h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>10h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>11h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>12h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>13h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>14h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>15h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>16h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>17h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>18h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>19h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>20h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>21h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>22h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> + <row> + <label>23h</label> + <nb_uniq_visitors>0</nb_uniq_visitors> + <nb_visits>0</nb_visits> + <nb_actions>0</nb_actions> + <max_actions>0</max_actions> + <sum_visit_length>0</sum_visit_length> + <bounce_count>0</bounce_count> + <nb_visits_converted>0</nb_visits_converted> + </row> +</result>
\ No newline at end of file diff --git a/tests/integration/expected/test_trackGoals_allowMultipleConversionsPerVisit__VisitTime.getVisitInformationPerServerTime_day.xml b/tests/integration/expected/test_trackGoals_allowMultipleConversionsPerVisit__VisitTime.getVisitInformationPerServerTime_day.xml index bef4ab0879..11fab88dc8 100644 --- a/tests/integration/expected/test_trackGoals_allowMultipleConversionsPerVisit__VisitTime.getVisitInformationPerServerTime_day.xml +++ b/tests/integration/expected/test_trackGoals_allowMultipleConversionsPerVisit__VisitTime.getVisitInformationPerServerTime_day.xml @@ -12,12 +12,12 @@ <row idgoal='1'> <nb_conversions>2</nb_conversions> <nb_visits_converted>1</nb_visits_converted> - <revenue>666.00</revenue> + <revenue>666</revenue> </row> <row idgoal='2'> <nb_conversions>2</nb_conversions> <nb_visits_converted>1</nb_visits_converted> - <revenue>666.00</revenue> + <revenue>666</revenue> </row> </goals> <nb_conversions>4</nb_conversions> |