// Added KPIs to the category page and fixed dashboard data
This commit is contained in:
1 parent
b3d7b8754b
commit
dabb23ac8d
4 files changed
+99
-18
No files matched your search
@@ -22,9 +22,9 @@
|
|||||||
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
|
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
|
||||||
* International Registered Trademark & Property of PrestaShop SA
|
* International Registered Trademark & Property of PrestaShop SA
|
||||||
*}
|
*}
|
||||||
<{if $href}a style="display:block" href="{$href|escape}"{else}div{/if} id="{$id|escape}" class="box-stats {$color|escape}" >
|
<{if isset($href) && $href}a style="display:block" href="{$href|escape}"{else}div{/if} id="{$id|escape}" class="box-stats {$color|escape}" >
|
||||||
{if $icon}<i class="{$icon|escape}"></i>{/if}
|
{if isset($icon) && $icon}<i class="{$icon|escape}"></i>{/if}
|
||||||
{if $chart}
|
{if isset($chart) && $chart}
|
||||||
<div class="boxchart-overlay">
|
<div class="boxchart-overlay">
|
||||||
<div class="boxchart">
|
<div class="boxchart">
|
||||||
</div>
|
</div>
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
<span class="value">{$value|escape}</span>
|
<span class="value">{$value|escape}</span>
|
||||||
</{if $href}a{else}div{/if}>
|
</{if $href}a{else}div{/if}>
|
||||||
|
|
||||||
{if $source != ''}
|
{if isset($source) && $source != ''}
|
||||||
<script>
|
<script>
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '{$source|addslashes}' + '&rand=' + new Date().getTime(),
|
url: '{$source|addslashes}' + '&rand=' + new Date().getTime(),
|
||||||
|
|||||||
@@ -368,6 +368,29 @@ class AdminCategoriesControllerCore extends AdminController
|
|||||||
if (ConfigurationKPI::get('EMPTY_CATEGORIES_EXPIRE') < $time)
|
if (ConfigurationKPI::get('EMPTY_CATEGORIES_EXPIRE') < $time)
|
||||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=empty_categories';
|
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=empty_categories';
|
||||||
$kpis[] = $helper->generate();
|
$kpis[] = $helper->generate();
|
||||||
|
|
||||||
|
$helper = new HelperKpi();
|
||||||
|
$helper->id = 'box-top-category';
|
||||||
|
$helper->icon = 'icon-money';
|
||||||
|
$helper->color = 'color3';
|
||||||
|
$helper->title = $this->l('Top Category');
|
||||||
|
$helper->subtitle = $this->l('30 days');
|
||||||
|
if (ConfigurationKPI::get('TOP_CATEGORY', $this->context->employee->id_lang) !== false)
|
||||||
|
$helper->value = ConfigurationKPI::get('TOP_CATEGORY', $this->context->employee->id_lang);
|
||||||
|
if (ConfigurationKPI::get('TOP_CATEGORY_EXPIRE', $this->context->employee->id_lang) < $time)
|
||||||
|
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=top_category';
|
||||||
|
$kpis[] = $helper->generate();
|
||||||
|
|
||||||
|
$helper = new HelperKpi();
|
||||||
|
$helper->id = 'box-products-per-category';
|
||||||
|
$helper->icon = 'icon-search';
|
||||||
|
$helper->color = 'color4';
|
||||||
|
$helper->title = $this->l('Average number of products per category');
|
||||||
|
if (ConfigurationKPI::get('PRODUCTS_PER_CATEGORY') !== false)
|
||||||
|
$helper->value = ConfigurationKPI::get('PRODUCTS_PER_CATEGORY');
|
||||||
|
if (ConfigurationKPI::get('PRODUCTS_PER_CATEGORY_EXPIRE') < $time)
|
||||||
|
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=products_per_category';
|
||||||
|
$kpis[] = $helper->generate();
|
||||||
|
|
||||||
$helper = new HelperKpiRow();
|
$helper = new HelperKpiRow();
|
||||||
$helper->kpis = $kpis;
|
$helper->kpis = $kpis;
|
||||||
|
|||||||
@@ -153,6 +153,14 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
|||||||
WHERE c.active = 0');
|
WHERE c.active = 0');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getTotalCategories()
|
||||||
|
{
|
||||||
|
return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
|
||||||
|
SELECT COUNT(*)
|
||||||
|
FROM `'._DB_PREFIX_.'category` c
|
||||||
|
'.Shop::addSqlAssociation('category', 'c'));
|
||||||
|
}
|
||||||
|
|
||||||
public static function getDisabledProducts()
|
public static function getDisabledProducts()
|
||||||
{
|
{
|
||||||
return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
|
return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
|
||||||
@@ -162,6 +170,14 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
|||||||
WHERE product_shop.active = 0');
|
WHERE product_shop.active = 0');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getTotalProducts()
|
||||||
|
{
|
||||||
|
return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
|
||||||
|
SELECT COUNT(*)
|
||||||
|
FROM `'._DB_PREFIX_.'product` p
|
||||||
|
'.Shop::addSqlAssociation('product', 'p'));
|
||||||
|
}
|
||||||
|
|
||||||
public static function getTotalSales($date_from, $date_to, $granularity = false)
|
public static function getTotalSales($date_from, $date_to, $granularity = false)
|
||||||
{
|
{
|
||||||
if ($granularity == 'day')
|
if ($granularity == 'day')
|
||||||
@@ -232,6 +248,7 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
|||||||
if ($products_sales > $total_sales)
|
if ($products_sales > $total_sales)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return round(100 * $products / $total_products).'%';
|
return round(100 * $products / $total_products).'%';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -307,6 +324,31 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
|||||||
return array('type' => 'neutral', 'value' => round(100 * $row['neutral'] / $row['total']));
|
return array('type' => 'neutral', 'value' => round(100 * $row['neutral'] / $row['total']));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getBestCategory($date_from, $date_to)
|
||||||
|
{
|
||||||
|
return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
|
||||||
|
SELECT ca.`id_category`
|
||||||
|
FROM `'._DB_PREFIX_.'category` ca
|
||||||
|
LEFT JOIN `'._DB_PREFIX_.'category_product` capr ON ca.`id_category` = capr.`id_category`
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT pr.`id_product`, t.`totalPriceSold`
|
||||||
|
FROM `'._DB_PREFIX_.'product` pr
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT pr.`id_product`,
|
||||||
|
IFNULL(SUM(cp.`product_quantity`), 0) AS totalQuantitySold,
|
||||||
|
IFNULL(SUM(cp.`product_price` * cp.`product_quantity`), 0) / o.conversion_rate AS totalPriceSold
|
||||||
|
FROM `'._DB_PREFIX_.'product` pr
|
||||||
|
LEFT OUTER JOIN `'._DB_PREFIX_.'order_detail` cp ON pr.`id_product` = cp.`product_id`
|
||||||
|
LEFT JOIN `'._DB_PREFIX_.'orders` o ON o.`id_order` = cp.`id_order`
|
||||||
|
WHERE o.invoice_date BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"
|
||||||
|
GROUP BY pr.`id_product`
|
||||||
|
) t ON t.`id_product` = pr.`id_product`
|
||||||
|
) t ON t.`id_product` = capr.`id_product`
|
||||||
|
WHERE ca.`level_depth` > 1
|
||||||
|
GROUP BY ca.`id_category`
|
||||||
|
ORDER BY SUM(t.`totalPriceSold`) DESC');
|
||||||
|
}
|
||||||
|
|
||||||
public static function getMainCountry($date_from, $date_to)
|
public static function getMainCountry($date_from, $date_to)
|
||||||
{
|
{
|
||||||
$total_orders = AdminStatsController::getOrders($date_from, $date_to);
|
$total_orders = AdminStatsController::getOrders($date_from, $date_to);
|
||||||
@@ -581,8 +623,8 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case '8020_sales_catalog':
|
case '8020_sales_catalog':
|
||||||
$value = AdminStatsController::get8020SalesCatalog(date('Y-m-d', strtotime('-31 day')), date('Y-m-d', strtotime('-1 day')));
|
$value = AdminStatsController::get8020SalesCatalog(date('Y-m-d', strtotime('-1 month')), date('Y-m-d'));
|
||||||
$value .= ' '.$this->l('of your Catalog');
|
$value = sprintf($this->l('%d%% of your Catalog'), $value);
|
||||||
ConfigurationKPI::updateValue('8020_SALES_CATALOG', $value);
|
ConfigurationKPI::updateValue('8020_SALES_CATALOG', $value);
|
||||||
ConfigurationKPI::updateValue('8020_SALES_CATALOG_EXPIRE', strtotime('+12 hour'));
|
ConfigurationKPI::updateValue('8020_SALES_CATALOG_EXPIRE', strtotime('+12 hour'));
|
||||||
break;
|
break;
|
||||||
@@ -742,6 +784,27 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
|||||||
ConfigurationKPI::updateValue('NETPROFIT_VISITOR', $value);
|
ConfigurationKPI::updateValue('NETPROFIT_VISITOR', $value);
|
||||||
ConfigurationKPI::updateValue('NETPROFIT_VISITOR_EXPIRE', strtotime(date('Y-m-d 00:00:00', strtotime('+1 day'))));
|
ConfigurationKPI::updateValue('NETPROFIT_VISITOR_EXPIRE', strtotime(date('Y-m-d 00:00:00', strtotime('+1 day'))));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'products_per_category':
|
||||||
|
$products = AdminStatsController::getTotalProducts();
|
||||||
|
$categories = AdminStatsController::getTotalCategories();
|
||||||
|
$value = round($products / $categories);
|
||||||
|
ConfigurationKPI::updateValue('PRODUCTS_PER_CATEGORY', $value);
|
||||||
|
ConfigurationKPI::updateValue('PRODUCTS_PER_CATEGORY_EXPIRE', strtotime('+1 hour'));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'top_category':
|
||||||
|
if (!($id_category = AdminStatsController::getBestCategory(date('Y-m-d', strtotime('-1 month')), date('Y-m-d'))))
|
||||||
|
$value = $this->l('No category');
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$category = new Category($id_category, $this->context->language->id);
|
||||||
|
$value = $category->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfigurationKPI::updateValue('TOP_CATEGORY', array($this->context->language->id => $value));
|
||||||
|
ConfigurationKPI::updateValue('TOP_CATEGORY_EXPIRE', array($this->context->language->id => strtotime('+1 day')));
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
$value = false;
|
$value = false;
|
||||||
|
|||||||
@@ -123,14 +123,14 @@ class Dashactivity extends Module
|
|||||||
$sql = 'SELECT COUNT(DISTINCT c.id_connections)
|
$sql = 'SELECT COUNT(DISTINCT c.id_connections)
|
||||||
FROM `'._DB_PREFIX_.'connections` c
|
FROM `'._DB_PREFIX_.'connections` c
|
||||||
LEFT JOIN `'._DB_PREFIX_.'connections_page` cp ON c.id_connections = cp.id_connections
|
LEFT JOIN `'._DB_PREFIX_.'connections_page` cp ON c.id_connections = cp.id_connections
|
||||||
WHERE TIME_TO_SEC(TIMEDIFF(NOW(), cp.`time_start`)) < 900
|
WHERE TIME_TO_SEC(TIMEDIFF(NOW(), cp.`time_start`)) < 1800
|
||||||
AND cp.`time_end` IS NULL
|
AND cp.`time_end` IS NULL
|
||||||
'.Shop::addSqlRestriction(false, 'c').'
|
'.Shop::addSqlRestriction(false, 'c').'
|
||||||
'.($maintenance_ips ? 'AND c.ip_address NOT IN ('.preg_replace('/[^,0-9]/', '', $maintenance_ips).')' : '');
|
'.($maintenance_ips ? 'AND c.ip_address NOT IN ('.preg_replace('/[^,0-9]/', '', $maintenance_ips).')' : '');
|
||||||
else
|
else
|
||||||
$sql = 'SELECT COUNT(*)
|
$sql = 'SELECT COUNT(*)
|
||||||
FROM `'._DB_PREFIX_.'connections`
|
FROM `'._DB_PREFIX_.'connections`
|
||||||
WHERE TIME_TO_SEC(TIMEDIFF(NOW(), `date_add`)) < 900
|
WHERE TIME_TO_SEC(TIMEDIFF(NOW(), `date_add`)) < 1800
|
||||||
'.Shop::addSqlRestriction(false).'
|
'.Shop::addSqlRestriction(false).'
|
||||||
'.($maintenance_ips ? 'AND ip_address NOT IN ('.preg_replace('/[^,0-9]/', '', $maintenance_ips).')' : '');
|
'.($maintenance_ips ? 'AND ip_address NOT IN ('.preg_replace('/[^,0-9]/', '', $maintenance_ips).')' : '');
|
||||||
$online_visitor = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
|
$online_visitor = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
|
||||||
@@ -145,7 +145,7 @@ class Dashactivity extends Module
|
|||||||
$abandoned_cart = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
|
$abandoned_cart = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
|
||||||
SELECT COUNT(*)
|
SELECT COUNT(*)
|
||||||
FROM `'._DB_PREFIX_.'cart`
|
FROM `'._DB_PREFIX_.'cart`
|
||||||
WHERE `date_add` BETWEEN "'.pSQL($params['date_from']).'" AND "'.pSQL($params['date_to']).'"
|
WHERE `date_upd` BETWEEN "'.pSQL(date('Y-m-d H:i:s', strtotime('-2 DAY'))).'" AND "'.pSQL(date('Y-m-d H:i:s', strtotime('-1 DAY'))).'"
|
||||||
AND id_cart NOT IN (SELECT id_cart FROM `'._DB_PREFIX_.'orders`)
|
AND id_cart NOT IN (SELECT id_cart FROM `'._DB_PREFIX_.'orders`)
|
||||||
'.Shop::addSqlRestriction(Shop::SHARE_ORDER));
|
'.Shop::addSqlRestriction(Shop::SHARE_ORDER));
|
||||||
|
|
||||||
@@ -157,18 +157,13 @@ class Dashactivity extends Module
|
|||||||
'.Shop::addSqlRestriction(Shop::SHARE_ORDER, 'o'));
|
'.Shop::addSqlRestriction(Shop::SHARE_ORDER, 'o'));
|
||||||
|
|
||||||
$products_out_of_stock = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
|
$products_out_of_stock = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
|
||||||
SELECT COUNT(*)
|
SELECT SUM(IF(IFNULL(stock.quantity, 0) > 0, 0, 1))
|
||||||
FROM `'._DB_PREFIX_.'product` p
|
FROM `'._DB_PREFIX_.'product` p
|
||||||
'.Shop::addSqlAssociation('product', 'p').'
|
'.Shop::addSqlAssociation('product', 'p').'
|
||||||
'.Product::sqlStock('p').'
|
LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON p.id_product = pa.id_product
|
||||||
WHERE IFNULL(stock.quantity, 0) <= 0');
|
'.Product::sqlStock('p', 'pa'));
|
||||||
|
|
||||||
$new_messages = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
|
$new_messages = AdminStatsController::getPendingMessages();
|
||||||
SELECT COUNT(*)
|
|
||||||
FROM `'._DB_PREFIX_.'customer_thread` ct
|
|
||||||
LEFT JOIN `'._DB_PREFIX_.'customer_message` cm ON ct.id_customer_thread = cm.id_customer_thread
|
|
||||||
WHERE cm.`date_add` BETWEEN "'.pSQL($params['date_from']).'" AND "'.pSQL($params['date_to']).'"
|
|
||||||
'.Shop::addSqlRestriction(false, 'ct'));
|
|
||||||
|
|
||||||
$active_shopping_cart = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
|
$active_shopping_cart = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
|
||||||
SELECT COUNT(*)
|
SELECT COUNT(*)
|
||||||
|
|||||||
Reference in new issue
Block a user