/** * Returns a datatable of Items SKU/name or categories and their metrics * If $abandonedCarts set to 1, will return items abandoned in carts. If set to 0, will return items ordered */ protected function getItems($recordName, $idSite, $period, $date, $abandonedCarts) { Piwik::checkUserHasViewAccess($idSite); $recordNameFinal = $recordName; if ($abandonedCarts) { $recordNameFinal = Piwik_Goals::getItemRecordNameAbandonedCart($recordName); } $archive = Piwik_Archive::build($idSite, $period, $date); $dataTable = $archive->getDataTable($recordNameFinal); $dataTable->filter('Sort', array(Piwik_Archive::INDEX_ECOMMERCE_ITEM_REVENUE)); $dataTable->queueFilter('ReplaceColumnNames'); $ordersColumn = 'orders'; if ($abandonedCarts) { $ordersColumn = 'abandoned_carts'; $dataTable->renameColumn(Piwik_Archive::INDEX_ECOMMERCE_ORDERS, $ordersColumn); } // Average price = sum product revenue / quantity $dataTable->queueFilter('ColumnCallbackAddColumnQuotient', array('avg_price', 'price', $ordersColumn, Piwik_Tracker_GoalManager::REVENUE_PRECISION)); // Average quantity = sum product quantity / abandoned carts $dataTable->queueFilter('ColumnCallbackAddColumnQuotient', array('avg_quantity', 'quantity', $ordersColumn, $precision = 1)); $dataTable->queueFilter('ColumnDelete', array('price')); // Enrich the datatable with Product/Categories views, and conversion rates $customVariables = Piwik_CustomVariables_API::getInstance()->getCustomVariables($idSite, $period, $date, $segment = false, $expanded = false, $_leavePiwikCoreVariables = true); $mapping = array('Goals_ItemsSku' => '_pks', 'Goals_ItemsName' => '_pkn', 'Goals_ItemsCategory' => '_pkc'); $reportToNotDefinedString = array('Goals_ItemsSku' => Piwik_Translate('General_NotDefined', Piwik_Translate('Goals_ProductSKU')), 'Goals_ItemsName' => Piwik_Translate('General_NotDefined', Piwik_Translate('Goals_ProductName')), 'Goals_ItemsCategory' => Piwik_Translate('General_NotDefined', Piwik_Translate('Goals_ProductCategory'))); $notDefinedStringPretty = $reportToNotDefinedString[$recordName]; // Handle case where date=last30&period=day if ($customVariables instanceof Piwik_DataTable_Array) { $customVariableDatatables = $customVariables->getArray(); $dataTables = $dataTable->getArray(); foreach ($customVariableDatatables as $key => $customVariableTableForDate) { $dataTableForDate = isset($dataTables[$key]) ? $dataTables[$key] : new Piwik_DataTable(); // we do not enter the IF // if case idSite=1,3 AND period=day&date=datefrom,dateto, if (isset($dataTable->metadata[$key]['period'])) { $dateRewrite = $dataTable->metadata[$key]['period']->getDateStart()->toString(); $row = $customVariableTableForDate->getRowFromLabel($mapping[$recordName]); if ($row) { $idSubtable = $row->getIdSubDataTable(); $this->enrichItemsDataTableWithItemsViewMetrics($dataTableForDate, $idSite, $period, $dateRewrite, $idSubtable); } $dataTable->addTable($dataTableForDate, $key); } $this->renameNotDefinedRow($dataTableForDate, $notDefinedStringPretty); } } elseif ($customVariables instanceof Piwik_DataTable) { $row = $customVariables->getRowFromLabel($mapping[$recordName]); if ($row) { $idSubtable = $row->getIdSubDataTable(); $this->enrichItemsDataTableWithItemsViewMetrics($dataTable, $idSite, $period, $date, $idSubtable); } $this->renameNotDefinedRow($dataTable, $notDefinedStringPretty); } // Product conversion rate = orders / visits $dataTable->queueFilter('ColumnCallbackAddColumnPercentage', array('conversion_rate', $ordersColumn, 'nb_visits', Piwik_Tracker_GoalManager::REVENUE_PRECISION)); return $dataTable; }
/** * Returns a datatable of Items SKU/name or categories and their metrics * If $abandonedCarts set to 1, will return items abandoned in carts. If set to 0, will return items ordered */ protected function getItems($recordName, $idSite, $period, $date, $abandonedCarts ) { Piwik::checkUserHasViewAccess( $idSite ); $recordNameFinal = $recordName; if($abandonedCarts) { $recordNameFinal = Piwik_Goals::getItemRecordNameAbandonedCart($recordName); } $archive = Piwik_Archive::build($idSite, $period, $date ); $dataTable = $archive->getDataTable($recordNameFinal); $dataTable->filter('Sort', array(Piwik_Archive::INDEX_ECOMMERCE_ITEM_REVENUE)); $dataTable->queueFilter('ReplaceColumnNames'); $ordersColumn = 'orders'; if($abandonedCarts) { $ordersColumn = 'abandoned_carts'; $dataTable->renameColumn(Piwik_Archive::INDEX_ECOMMERCE_ORDERS, $ordersColumn); } // Average price = sum product revenue / quantity $dataTable->queueFilter('ColumnCallbackAddColumnQuotient', array('avg_price', 'price', $ordersColumn, Piwik_Tracker_GoalManager::REVENUE_PRECISION)); // Average quantity = sum product quantity / abandoned carts $dataTable->queueFilter('ColumnCallbackAddColumnQuotient', array('avg_quantity', 'quantity', $ordersColumn, $precision = 1)); $dataTable->queueFilter('ColumnDelete', array('price')); // Enrich the datatable with Product/Categories views, and conversion rates $mapping = array( 'Goals_ItemsSku' => '_pks', 'Goals_ItemsName' => '_pkn', 'Goals_ItemsCategory' => '_pkc', ); $customVariables = Piwik_CustomVariables_API::getInstance()->getCustomVariables($idSite, $period, $date, $segment = false, $expanded = false, $_leavePiwikCoreVariables = true); if($customVariables instanceof Piwik_DataTable && $row = $customVariables->getRowFromLabel($mapping[$recordName])) { // Request views for all products/categories $idSubtable = $row->getIdSubDataTable(); $ecommerceViews = Piwik_CustomVariables_API::getInstance()->getCustomVariablesValuesFromNameId($idSite, $period, $date, $idSubtable); $dataTable->addDataTable($ecommerceViews); // Product conversion rate = orders / visits $dataTable->queueFilter('ColumnCallbackAddColumnPercentage', array('conversion_rate', $ordersColumn, 'nb_visits', Piwik_Tracker_GoalManager::REVENUE_PRECISION)); } return $dataTable; }