* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) */ 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 = 'administration'; $this->version = '2.0.4'; $this->author = 'PrestaShop'; $this->need_instance = 0; parent::__construct(); $this->displayName = $this->trans('Stats Dashboard', array(), 'Modules.Statsforecast.Admin'); $this->description = $this->trans('Enrich your stats, add a summary of all your current statistics on your back office.', array(), 'Modules.Statsforecast.Admin'); $this->ps_versions_compliancy = array('min' => '1.7.6.0', 'max' => _PS_VERSION_); } public function install() { return (parent::install() && $this->registerHook('displayAdminStatsModules')); } public function getContent() { Tools::redirectAdmin('index.php?controller=AdminStats&module=statsforecast&token='.Tools::getAdminTokenLite('AdminStats')); } public function hookDisplayAdminStatsModules() { $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->trans('Visits', array(), 'Admin.Shopparameters.Feature').' | '.$this->trans('Registrations', array(), 'Admin.Shopparameters.Feature').' | '.$this->trans('Placed orders', array(), 'Modules.Statsforecast.Admin').' | '.$this->trans('Bought items', array(), 'Modules.Statsforecast.Admin').' | '.$this->trans('Percentage of registrations', array(), 'Modules.Statsforecast.Admin').' | '.$this->trans('Percentage of orders', array(), 'Modules.Statsforecast.Admin').' | '.$this->trans('Revenue', array(), 'Modules.Statsforecast.Admin').' | |
---|---|---|---|---|---|---|---|
'.$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).' %' : '-').' | '.$this->context->getCurrentLocale()->formatPrice($row['totalSales'], $currency->iso_code).' |
'.$this->trans('Visits', array(), 'Admin.Shopparameters.Feature').' | '.$this->trans('Registrations', array(), 'Admin.Shopparameters.Feature').' | '.$this->trans('Placed orders', array(), 'Modules.Statsforecast.Admin').' | '.$this->trans('Bought items', array(), 'Modules.Statsforecast.Admin').' | '.$this->trans('Percentage of registrations', array(), 'Modules.Statsforecast.Admin').' | '.$this->trans('Percentage of orders', array(), 'Modules.Statsforecast.Admin').' | '.$this->trans('Revenue', array(), 'Modules.Statsforecast.Admin').' | |
'.$this->trans('Total', array(), 'Admin.Global').' | '.(int)$this->t1.' | '.(int)$this->t2.' | '.(int)$this->t3.' | '.(int)$this->t4.' | -- | -- | '.$this->context->getCurrentLocale()->formatPrice($this->t8, $currency->iso_code).' |
'.$this->trans('Average', array(), 'Modules.Statsforecast.Admin').' | '.(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).' %' : '-').' | '.$this->context->getCurrentLocale()->formatPrice($this->t8 / $interval_avg, $currency->iso_code).' |
'.$this->trans('Forecast', array(), 'Modules.Statsforecast.Admin').' | '.(int)($this->t1 * $prop30).' | '.(int)($this->t2 * $prop30).' | '.(int)($this->t3 * $prop30).' | '.(int)($this->t4 * $prop30).' | -- | -- | '.$this->context->getCurrentLocale()->formatPrice($this->t8 * $prop30, $currency->iso_code).' |
'.$this->trans('Visitors', array(), 'Admin.Shopparameters.Feature').' '.$visitors.' |
'.round(100 * $customers / max(1, $visitors), 2).' % |
'.$this->trans('Accounts', array(), 'Modules.Statsforecast.Admin').' '.$customers.' |
'.round(100 * $fullcarts / max(1, $customers), 2).' % |
'.$this->trans('Full carts', array(), 'Modules.Statsforecast.Admin').' '.$fullcarts.' |
'.round(100 * $orders / max(1, $fullcarts), 2).' % |
'.$this->trans('Orders', array(), 'Admin.Global').' '.$orders.' |
'.$this->trans('Registered visitors', array(), 'Modules.Statsforecast.Admin').' |
'.round(100 * $orders / max(1, $customers), 2).' % |
'.$this->trans('Orders', array(), 'Admin.Global').' |
'.$this->trans('Visitors', array(), 'Admin.Shopparameters.Feature').' |
'.round(100 * $orders / max(1, $visitors), 2).' % |
'.$this->trans('Orders', array(), 'Admin.Global').' |
||||
'.round(100 * $carts / max(1, $visitors)).' % |
'.$this->trans('Carts', array(), 'Admin.Global').' '.$carts.' |
'.round(100 * $fullcarts / max(1, $carts)).' % |
'.$this->trans('A simple statistical calculation lets you know the monetary value of your visitors:', array(), 'Modules.Statsforecast.Admin').'
'.$this->trans('On average, each visitor places an order for this amount:', array(), 'Modules.Statsforecast.Admin').' '.$this->context->getCurrentLocale()->formatPrice($ca['ventil']['total'] / max(1, $visitors), $currency->iso_code).'.
'.$this->trans('On average, each registered visitor places an order for this amount:', array(), 'Modules.Statsforecast.Admin').' '.$this->context->getCurrentLocale()->formatPrice($ca['ventil']['total'] / max(1, $customers), $currency->iso_code).'.
'.$this->trans('Module', array(), 'Modules.Statsforecast.Admin').' | '.$this->trans('Orders', array(), 'Admin.Global').' | '.$this->trans('Sales', array(), 'Admin.Global').' | '.$this->trans('Average cart value', array(), 'Modules.Statsforecast.Admin').' |
---|---|---|---|
'.$payment['payment_method'].' | '.(int)$payment['nb'].' | '.$this->context->getCurrentLocale()->formatPrice($payment['total'], $currency->iso_code).' | '.$this->context->getCurrentLocale()->formatPrice($payment['total'] / (int)$payment['nb'], $currency->iso_code).' |
'.$this->trans('Category', array(), 'Admin.Catalog.Feature').' | '.$this->trans('Products sold', array(), 'Modules.Statsforecast.Admin').' | '.$this->trans('Sales', array(), 'Admin.Global').' | '.$this->trans('Percentage of products sold', array(), 'Modules.Statsforecast.Admin').' | '.$this->trans('Percentage of sales', array(), 'Modules.Statsforecast.Admin').' | '.$this->trans('Average price', array(), 'Admin.Global').' |
---|---|---|---|---|---|
'.(empty($catrow['name']) ? $this->trans('Unknown', array(), 'Admin.Shopparameters.Feature') : $catrow['name']).' | '.$catrow['orderQty'].' | '.$this->context->getCurrentLocale()->formatPrice($catrow['orderSum'], $currency->iso_code).' | '.number_format((100 * $catrow['orderQty'] / $this->t4), 1, '.', ' ').'% | '.((int)$ca['ventil']['total'] ? number_format((100 * $catrow['orderSum'] / $ca['ventil']['total']), 1, '.', ' ') : '0').'% | '.$this->context->getCurrentLocale()->formatPrice($catrow['priveAvg'], $currency->iso_code).' |
'.$this->trans('Language', array(), 'Admin.Global').' | '.$this->trans('Sales', array(), 'Admin.Global').' | '.$this->trans('Percentage', array(), 'Admin.Global').' | '.$this->trans('Growth', array(), 'Modules.Statsforecast.Admin').' | |
---|---|---|---|---|
'.$ophone.' | '.$this->context->getCurrentLocale()->formatPrice((int) $amount, $currency->iso_code).' | '.((int)$ca['ventil']['total'] ? number_format((100 * (int) $amount / $ca['ventil']['total']), 1, '.', ' ').'%' : '-').' | '.(($percent > 0 || $percent == '∞') ? '![]() ![]() |
'.(($percent > 0 || $percent == '∞') ? '+' : '').$percent.'% |
'.$this->trans('Zone', array(), 'Admin.Global').' | '.$this->trans('Orders', array(), 'Admin.Global').' | '.$this->trans('Sales', array(), 'Admin.Global').' | '.$this->trans('Percentage of orders', array(), 'Modules.Statsforecast.Admin').' | '.$this->trans('Percentage of sales', array(), 'Modules.Statsforecast.Admin').' |
---|---|---|---|---|
'.(isset($zone['name']) ? $zone['name'] : $this->trans('Undefined', array(), 'Admin.Shopparameters.Feature')).' | '.(int)($zone['nb']).' | '.$this->context->getCurrentLocale()->formatPrice($zone['total'], $currency->iso_code).' | '.($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->trans('Currency', array(), 'Admin.Global').' | '.$this->trans('Orders', array(), 'Admin.Global').' | '.$this->trans('Sales (converted)', array(), 'Modules.Statsforecast.Admin').' | '.$this->trans('Percentage of orders', array(), 'Modules.Statsforecast.Admin').' | '.$this->trans('Percentage of sales', array(), 'Modules.Statsforecast.Admin').' |
---|---|---|---|---|
'.$currency_row['name'].' | '.(int)($currency_row['nb']).' | '.$this->context->getCurrentLocale()->formatPrice($currency_row['total'], $currency->iso_code).' | '.($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->trans('Group', array(), 'Admin.Global').' | '.$this->trans('Attribute', array(), 'Admin.Global').' | '.$this->trans('Quantity of products sold', array(), 'Modules.Statsforecast.Admin').' |
---|---|---|
'.$attribut['gname'].' | '.$attribut['aname'].' | '.(int)($attribut['total']).' |