* @copyright 2007-2014 PrestaShop SA * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * International Registered Trademark & Property of PrestaShop SA */ if (!defined('_PS_VERSION_')) exit; class StatsForecast extends Module { private $html = ''; private $t1 = 0; private $t2 = 0; private $t3 = 0; private $t4 = 0; private $t5 = 0; private $t6 = 0; private $t7 = 0; private $t8 = 0; public function __construct() { $this->name = 'statsforecast'; $this->tab = 'analytics_stats'; $this->version = '1.3.2'; $this->author = 'PrestaShop'; $this->need_instance = 0; parent::__construct(); $this->displayName = $this->l('Stats Dashboard'); $this->description = $this->l('This is the main module for the Stats dashboard. It displays a summary of all your current statistics.'); $this->ps_versions_compliancy = array('min' => '1.6', 'max' => _PS_VERSION_); } public function install() { return (parent::install() && $this->registerHook('AdminStatsModules')); } public function getContent() { Tools::redirectAdmin('index.php?controller=AdminStats&module=statsforecast&token='.Tools::getAdminTokenLite('AdminStats')); } public function hookAdminStatsModules() { $ru = AdminController::$currentIndex.'&module='.$this->name.'&token='.Tools::getValue('token'); $db = Db::getInstance(); if (!isset($this->context->cookie->stats_granularity)) $this->context->cookie->stats_granularity = 10; if (Tools::isSubmit('submitIdZone')) $this->context->cookie->stats_id_zone = (int)Tools::getValue('stats_id_zone'); if (Tools::isSubmit('submitGranularity')) $this->context->cookie->stats_granularity = Tools::getValue('stats_granularity'); $currency = $this->context->currency; $employee = $this->context->employee; $from = max(strtotime(_PS_CREATION_DATE_.' 00:00:00'), strtotime($employee->stats_date_from.' 00:00:00')); $to = strtotime($employee->stats_date_to.' 23:59:59'); $to2 = min(time(), $to); $interval = ($to - $from) / 60 / 60 / 24; $interval2 = ($to2 - $from) / 60 / 60 / 24; $prop30 = $interval / $interval2; if ($this->context->cookie->stats_granularity == 7) $interval_avg = $interval2 / 30; if ($this->context->cookie->stats_granularity == 4) $interval_avg = $interval2 / 365; if ($this->context->cookie->stats_granularity == 10) $interval_avg = $interval2; if ($this->context->cookie->stats_granularity == 42) $interval_avg = $interval2 / 7; $data_table = array(); if ($this->context->cookie->stats_granularity == 10) for ($i = $from; $i <= $to2; $i = strtotime('+1 day', $i)) $data_table[date('Y-m-d', $i)] = array( 'fix_date' => date('Y-m-d', $i), 'countOrders' => 0, 'countProducts' => 0, 'totalSales' => 0 ); $date_from_gadd = ($this->context->cookie->stats_granularity != 42 ? 'LEFT(date_add, '.(int)$this->context->cookie->stats_granularity.')' : 'IFNULL(MAKEDATE(YEAR(date_add),DAYOFYEAR(date_add)-WEEKDAY(date_add)), CONCAT(YEAR(date_add),"-01-01*"))'); $date_from_ginvoice = ($this->context->cookie->stats_granularity != 42 ? 'LEFT(invoice_date, '.(int)$this->context->cookie->stats_granularity.')' : 'IFNULL(MAKEDATE(YEAR(invoice_date),DAYOFYEAR(invoice_date)-WEEKDAY(invoice_date)), CONCAT(YEAR(invoice_date),"-01-01*"))'); $result = $db->query(' SELECT '.$date_from_ginvoice.' as fix_date, COUNT(*) as countOrders, SUM((SELECT SUM(od.product_quantity) FROM '._DB_PREFIX_.'order_detail od WHERE o.id_order = od.id_order)) as countProducts, SUM(o.total_paid_tax_excl / o.conversion_rate) as totalSales FROM '._DB_PREFIX_.'orders o WHERE o.valid = 1 AND o.invoice_date BETWEEN '.ModuleGraph::getDateBetween().' '.Shop::addSqlRestriction(Shop::SHARE_ORDER, 'o').' GROUP BY '.$date_from_ginvoice); while ($row = $db->nextRow($result)) $data_table[$row['fix_date']] = $row; $this->html .= '
'.$this->l('Visits').' | '.$this->l('Registrations').' | '.$this->l('Placed orders').' | '.$this->l('Bought items').' | '.$this->l('Percentage of registrations').' | '.$this->l('Percentage of orders').' | '.$this->l('Revenue').' | |
---|---|---|---|---|---|---|---|
'.$row['fix_date'].' | '.$visits_today.' | '.(int)$row['registrations'].' | '.(int)$row['countOrders'].' | '.(int)$row['countProducts'].' | '.($visits_today ? round(100 * (int)$row['registrations'] / $visits_today, 2).' %' : '-').' | '.($visits_today ? round(100 * (int)$row['countOrders'] / $visits_today, 2).' %' : '-').' | '.Tools::displayPrice($row['totalSales'], $currency).' |
'.$this->l('Visits').' | '.$this->l('Registrations').' | '.$this->l('Placed orders').' | '.$this->l('Bought items').' | '.$this->l('Percentage of registrations').' | '.$this->l('Percentage of orders').' | '.$this->l('Revenue').' | |
'.$this->l('Total').' | '.(int)$this->t1.' | '.(int)$this->t2.' | '.(int)$this->t3.' | '.(int)$this->t4.' | -- | -- | '.Tools::displayPrice($this->t8, $currency).' |
'.$this->l('Average').' | '.(int)($this->t1 / $interval_avg).' | '.(int)($this->t2 / $interval_avg).' | '.(int)($this->t3 / $interval_avg).' | '.(int)($this->t4 / $interval_avg).' | '.($this->t1 ? round(100 * $this->t2 / $this->t1, 2).' %' : '-').' | '.($this->t1 ? round(100 * $this->t3 / $this->t1, 2).' %' : '-').' | '.Tools::displayPrice($this->t8 / $interval_avg, $currency).' |
'.$this->l('Forecast').' | '.(int)($this->t1 * $prop30).' | '.(int)($this->t2 * $prop30).' | '.(int)($this->t3 * $prop30).' | '.(int)($this->t4 * $prop30).' | -- | -- | '.Tools::displayPrice($this->t8 * $prop30, $currency).' |
'.$this->l('Visitors').' '.$visitors.' |
'.round(100 * $customers / max(1, $visitors)).' % |
'.$this->l('Accounts').' '.$customers.' |
'.round(100 * $fullcarts / max(1, $customers)).' % |
'.$this->l('Full carts').' '.$fullcarts.' |
'.round(100 * $orders / max(1, $fullcarts)).' % |
'.$this->l('Orders').' '.$orders.' |
'.$this->l('Registered visitors').' |
'.round(100 * $orders / max(1, $customers), 2).' % |
'.$this->l('Orders').' |
'.$this->l('Visitors').' |
'.round(100 * $orders / max(1, $visitors), 2).' % |
'.$this->l('Orders').' |
||||
'.round(100 * $carts / max(1, $visitors)).' % |
'.$this->l('Carts').' '.$carts.' |
'.round(100 * $fullcarts / max(1, $carts)).' % |
'.$this->l('A simple statistical calculation lets you know the monetary value of your visitors:').'
'.$this->l('On average, each visitor places an order for this amount:').' '.Tools::displayPrice($ca['ventil']['total'] / max(1, $visitors), $currency).'.
'.$this->l('On average, each registered visitor places an order for this amount:').' '.Tools::displayPrice($ca['ventil']['total'] / max(1, $customers), $currency).'.
'.$this->l('Module').' | '.$this->l('Orders').' | '.$this->l('Sales').' | '.$this->l('Average cart value').' |
---|---|---|---|
'.$payment['payment_method'].' | '.(int)$payment['nb'].' | '.Tools::displayPrice($payment['total'], $currency).' | '.Tools::displayPrice($payment['cart'], $currency).' |
'.$this->l('Category').' | '.$this->l('Products sold').' | '.$this->l('Sales').' | '.$this->l('Percentage of products sold').' | '.$this->l('Percentage of sales').' | '.$this->l('Average price').' |
---|---|---|---|---|---|
'.(empty($catrow['name']) ? $this->l('Unknown') : $catrow['name']).' | '.$catrow['orderQty'].' | '.Tools::displayPrice($catrow['orderSum'], $currency).' | '.number_format((100 * $catrow['orderQty'] / $this->t4), 1, '.', ' ').'% | '.((int)$ca['ventil']['total'] ? number_format((100 * $catrow['orderSum'] / $ca['ventil']['total']), 1, '.', ' ') : '0').'% | '.Tools::displayPrice($catrow['priveAvg'], $currency).' |
'.$this->l('Language').' | '.$this->l('Sales').' | '.$this->l('Percentage').' | '.$this->l('Growth').' | |
---|---|---|---|---|
'.$ophone.' | '.Tools::displayPrice($amount, $currency).' | '.((int)$ca['ventil']['total'] ? number_format((100 * $amount / $ca['ventil']['total']), 1, '.', ' ').'%' : '-').' | '.(($percent > 0 || $percent == '∞') ? '' : ' ').' | '.(($percent > 0 || $percent == '∞') ? '+' : '').$percent.'% |
'.$this->l('Zone').' | '.$this->l('Orders').' | '.$this->l('Sales').' | '.$this->l('Percentage of orders').' | '.$this->l('Percentage of sales').' |
---|---|---|---|---|
'.(isset($zone['name']) ? $zone['name'] : $this->l('Undefined')).' | '.(int)($zone['nb']).' | '.Tools::displayPrice($zone['total'], $currency).' | '.($ca['ventil']['nb'] ? number_format((100 * $zone['nb'] / $ca['ventil']['nb']), 1, '.', ' ') : '0').'% | '.((int)$ca['ventil']['total'] ? number_format((100 * $zone['total'] / $ca['ventil']['total']), 1, '.', ' ') : '0').'% |
'.$this->l('Currency').' | '.$this->l('Orders').' | '.$this->l('Sales (converted)').' | '.$this->l('Percentage of orders').' | '.$this->l('Percentage of sales').' |
---|---|---|---|---|
'.$currency_row['name'].' | '.(int)($currency_row['nb']).' | '.Tools::displayPrice($currency_row['total'], $currency).' | '.($ca['ventil']['nb'] ? number_format((100 * $currency_row['nb'] / $ca['ventil']['nb']), 1, '.', ' ') : '0').'% | '.((int)$ca['ventil']['total'] ? number_format((100 * $currency_row['total'] / $ca['ventil']['total']), 1, '.', ' ') : '0').'% |
'.$this->l('Group').' | '.$this->l('Attribute').' | '.$this->l('Quantity of products sold').' |
---|---|---|
'.$attribut['gname'].' | '.$attribut['aname'].' | '.(int)($attribut['total']).' |