229 lines
9.7 KiB
PHP
229 lines
9.7 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Statistics
|
|
* @category stats
|
|
*
|
|
* @author Damien Metzger / Epitech
|
|
* @copyright Epitech / PrestaShop
|
|
* @license http://www.opensource.org/licenses/osl-3.0.php Open-source licence 3.0
|
|
* @version 1.2
|
|
*/
|
|
|
|
include_once(dirname(__FILE__).'/AdminStatsTab.php');
|
|
|
|
class AdminStats extends AdminStatsTab
|
|
{
|
|
private static $validOrder;
|
|
|
|
private static function recordQuery($dateBetween, $format, $order)
|
|
{
|
|
return Db::getInstance()->getRow('
|
|
SELECT date_format(o.`date_add`, \''.$format.'\') as date, SUM(o.`total_products` / c.conversion_rate) as totalht, SUM(o.`total_paid` / c.conversion_rate) as totalttc
|
|
FROM `'._DB_PREFIX_.'orders` o
|
|
LEFT JOIN `'._DB_PREFIX_.'currency` c ON o.id_currency = c.id_currency
|
|
WHERE o.valid = 1
|
|
AND o.`date_add` BETWEEN '.$dateBetween.'
|
|
GROUP BY date_format(o.`date_add`, \''.$format.'\')
|
|
ORDER BY totalht '.$order);
|
|
}
|
|
|
|
public static function getRecords($dateBetween)
|
|
{
|
|
$xtrems = array();
|
|
$xtrems['bestmonth'] = self::recordQuery($dateBetween, '%Y-%m', 'DESC');
|
|
$xtrems['worstmonth'] = self::recordQuery($dateBetween, '%Y-%m', 'ASC');
|
|
$xtrems['bestday'] = self::recordQuery($dateBetween, '%Y-%m-%d', 'DESC');
|
|
$xtrems['worstday'] = self::recordQuery($dateBetween, '%Y-%m-%d', 'ASC');
|
|
if ($xtrems['bestmonth'])
|
|
return $xtrems;
|
|
}
|
|
|
|
public static function getSales($dateBetween)
|
|
{
|
|
$result = Db::getInstance()->getRow('
|
|
SELECT COUNT(DISTINCT o.`id_order`) as orders, SUM(o.`total_paid` / c.conversion_rate) as ttc, SUM(o.`total_products` / c.conversion_rate) as ht
|
|
FROM `'._DB_PREFIX_.'orders` o
|
|
INNER JOIN `'._DB_PREFIX_.'currency` c ON o.id_currency = c.id_currency
|
|
WHERE o.valid = 1
|
|
AND o.`invoice_date` BETWEEN '.$dateBetween);
|
|
|
|
$products = Db::getInstance()->getRow('
|
|
SELECT COUNT(od.`id_order_detail`) as products
|
|
FROM `'._DB_PREFIX_.'orders` o
|
|
LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.`id_order` = od.`id_order`
|
|
WHERE o.valid = 1
|
|
AND o.`invoice_date` BETWEEN '.$dateBetween);
|
|
|
|
$xtrems = Db::getInstance()->getRow('
|
|
SELECT MAX(`total_products`) as maxht, MIN(`total_products`) as minht, MAX(`total_paid`) as maxttc, MIN(`total_paid`) as minttc
|
|
FROM (
|
|
SELECT o.`total_paid` / c.conversion_rate as total_paid, o.`total_products` / c.conversion_rate as total_products
|
|
FROM `'._DB_PREFIX_.'orders` o
|
|
LEFT JOIN `'._DB_PREFIX_.'currency` c ON o.id_currency = c.id_currency
|
|
LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.`id_order` = od.`id_order`
|
|
WHERE o.valid = 1
|
|
AND o.`invoice_date` BETWEEN '.$dateBetween.') records');
|
|
|
|
return array_merge($result, array_merge($xtrems, $products));
|
|
}
|
|
|
|
public static function getCarts($dateBetween)
|
|
{
|
|
return Db::getInstance()->getRow('
|
|
SELECT AVG(cartsum) as average, MAX(cartsum) as highest, MIN(cartsum) as lowest
|
|
FROM (
|
|
SELECT SUM(
|
|
((1+t.rate/100) * p.`price` + IF(cp.id_product_attribute IS NULL OR cp.id_product_attribute = 0, 0, (
|
|
SELECT IFNULL(pa.price, 0)
|
|
FROM '._DB_PREFIX_.'product_attribute pa
|
|
WHERE pa.id_product = cp.id_product
|
|
AND pa.id_product_attribute = cp.id_product_attribute
|
|
))) * cp.quantity) / cu.conversion_rate as cartsum
|
|
FROM `'._DB_PREFIX_.'cart` c
|
|
LEFT JOIN `'._DB_PREFIX_.'currency` cu ON c.id_currency = cu.id_currency
|
|
LEFT JOIN `'._DB_PREFIX_.'cart_product` cp ON c.`id_cart` = cp.`id_cart`
|
|
LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product`
|
|
LEFT JOIN `'._DB_PREFIX_.'tax` t ON p.`id_tax` = t.`id_tax`
|
|
WHERE c.`date_upd` BETWEEN '.$dateBetween.'
|
|
GROUP BY c.`id_cart`
|
|
) carts');
|
|
}
|
|
|
|
public function display()
|
|
{
|
|
global $cookie;
|
|
|
|
$currency = Currency::getCurrency(Configuration::get('PS_CURRENCY_DEFAULT'));
|
|
$language = Language::getLanguage(intval($cookie->id_lang));
|
|
$iso = $language['iso_code'];
|
|
$dateBetween = ModuleGraph::getDateBetween();
|
|
|
|
$sales = self::getSales($dateBetween);
|
|
$carts = self::getCarts($dateBetween);
|
|
$records = self::getRecords($dateBetween);
|
|
|
|
echo '
|
|
<div style="float: left">';
|
|
$this->displayCalendar();
|
|
$this->displayMenu(false);
|
|
$this->displaySearch();
|
|
echo '
|
|
</div>
|
|
<div style="float: left; margin-left: 40px;">
|
|
<fieldset class="width3"><legend><img src="../img/admin/tab-stats.gif" /> '.$this->l('Help').'</legend>
|
|
<p>'.$this->l('Use the calendar on the left to select the time period.').'</p>
|
|
<p>'.$this->l('All available statistic modules are displayed in the Navigation list beneath the calendar.').'</p>
|
|
<p>'.$this->l('In the Settings sub-tab, you can also customize the Stats tab to fit your needs and resources, change the graph rendering engine, and adjust the database settings.').'</p>
|
|
</fieldset>
|
|
<br /><br />
|
|
<fieldset class="width3"><legend><img src="../img/admin/___info-ca.gif" style="vertical-align: middle" /> '.$this->l('Sales').'</legend>
|
|
<table>
|
|
<tr><td style="font-weight: bold">'.$this->l('Total placed orders').'</td><td style="padding-left: 20px">'.$sales['orders'].'</td></tr>
|
|
<tr><td style="font-weight: bold">'.$this->l('Total products sold').'</td><td style="padding-left: 20px">'.$sales['products'].'</td></tr>
|
|
</table>
|
|
<table cellspacing="0" cellpadding="0" class="table space">
|
|
<tr>
|
|
<th style="width: 150px"></th>
|
|
<th style="width: 180px; text-align: center; font-weight: bold">'.$this->l('total paid with tax').'</th>
|
|
<th style="width: 220px; text-align: center; font-weight: bold">'.$this->l('total products not incl. tax').'</th>
|
|
</tr>
|
|
<tr>
|
|
<th style="font-weight: bold">'.$this->l('Sales turnover').'</th>
|
|
<td align="right">'.Tools::displayPrice($sales['ttc'], $currency).'</td>
|
|
<td align="right">'.Tools::displayPrice($sales['ht'], $currency).'</td>
|
|
</tr>
|
|
<tr>
|
|
<th style="font-weight: bold">'.$this->l('Largest order').'</th>
|
|
<td align="right">'.Tools::displayPrice($sales['maxttc'], $currency).'</td>
|
|
<td align="right">'.Tools::displayPrice($sales['maxht'], $currency).'</td>
|
|
</tr>
|
|
<tr>
|
|
<th style="font-weight: bold">'.$this->l('Smallest order').'</th>
|
|
<td align="right">'.Tools::displayPrice($sales['minttc'], $currency).'</td>
|
|
<td align="right">'.Tools::displayPrice($sales['minht'], $currency).'</td>
|
|
</tr>
|
|
</table>
|
|
</fieldset>
|
|
<br /><br />
|
|
<fieldset class="width3"><legend><img src="../img/admin/products.gif" style="vertical-align: middle" /> '.$this->l('Carts').'</legend>
|
|
<table cellspacing="0" cellpadding="0" class="table">
|
|
<tr>
|
|
<th style="width: 150px"></th>
|
|
<th style="width: 180px; text-align: center; font-weight: bold">'.$this->l('Products total all tax inc.').'</th>
|
|
</tr>
|
|
<tr>
|
|
<th style="font-weight: bold">'.$this->l('Average cart').'</th>
|
|
<td align="right">'.Tools::displayPrice($carts['average'], $currency).'</td>
|
|
</tr>
|
|
<tr>
|
|
<th style="font-weight: bold">'.$this->l('Largest cart').'</th>
|
|
<td align="right">'.Tools::displayPrice($carts['highest'], $currency).'</td>
|
|
</tr>
|
|
<tr>
|
|
<th style="font-weight: bold">'.$this->l('Smallest cart').'</th>
|
|
<td align="right">'.Tools::displayPrice($carts['lowest'], $currency).'</td>
|
|
</tr>
|
|
</table>
|
|
</fieldset>';
|
|
|
|
if (strtolower($cookie->stats_granularity) != 'd' AND $records AND is_array($records))
|
|
{
|
|
echo '
|
|
<br /><br />
|
|
<fieldset class="width3"><legend><img src="../img/admin/medal.png" style="vertical-align: middle" />'.$this->l('Records').'</legend>
|
|
<table cellspacing="0" cellpadding="0" class="table">
|
|
<tr>
|
|
<th style="width: 150px"></th>
|
|
<th style="width: 100px; text-align: center; font-weight: bold">'.$this->l('date').'</th>
|
|
<th style="width: 120px; text-align: center; font-weight: bold">'.$this->l('with tax').'</th>
|
|
<th style="width: 180px; text-align: center; font-weight: bold">'.$this->l('only products not incl. tax').'</th>
|
|
</tr>';
|
|
if (strtolower($cookie->stats_granularity) == 'y')
|
|
echo '
|
|
<tr>
|
|
<th style="font-weight: bold">'.$this->l('Best month').'</th>
|
|
<td align="right">'.$this->displayDate($records['bestmonth']['date'], $iso).'</td>
|
|
<td align="right">'.Tools::displayPrice($records['bestmonth']['totalttc'], $currency).'</td>
|
|
<td align="right">'.Tools::displayPrice($records['bestmonth']['totalht'], $currency).'</td>
|
|
</tr>
|
|
<tr>
|
|
<th style="font-weight: bold">'.$this->l('Worst month').'</th>
|
|
<td align="right">'.$this->displayDate($records['worstmonth']['date'], $iso).'</td>
|
|
<td align="right">'.Tools::displayPrice($records['worstmonth']['totalttc'], $currency).'</td>
|
|
<td align="right">'.Tools::displayPrice($records['worstmonth']['totalht'], $currency).'</td>
|
|
</tr>';
|
|
echo '
|
|
<tr>
|
|
<th style="font-weight: bold">'.$this->l('Best day').'</th>
|
|
<td align="right">'.$this->displayDate($records['bestday']['date'], $iso).'</td>
|
|
<td align="right">'.Tools::displayPrice($records['bestday']['totalttc'], $currency).'</td>
|
|
<td align="right">'.Tools::displayPrice($records['bestday']['totalht'], $currency).'</td>
|
|
</tr>
|
|
<tr>
|
|
<th style="font-weight: bold">'.$this->l('Worst day').'</th>
|
|
<td align="right">'.$this->displayDate($records['worstday']['date'], $iso).'</td>
|
|
<td align="right">'.Tools::displayPrice($records['worstday']['totalttc'], $currency).'</td>
|
|
<td align="right">'.Tools::displayPrice($records['worstday']['totalht'], $currency).'</td>
|
|
</tr>
|
|
</table>
|
|
</fieldset>';
|
|
}
|
|
|
|
echo '
|
|
</div>
|
|
<div class="clear"></div>';
|
|
}
|
|
|
|
static public function displayDate($date, $iso)
|
|
{
|
|
$tmpTab = explode('-', $date);
|
|
if (strtolower($iso == 'fr'))
|
|
return (isset($tmpTab[2]) ? ($tmpTab[2].'-') : '').$tmpTab[1].'-'.$tmpTab[0];
|
|
else
|
|
return $tmpTab[0].'-'.$tmpTab[1].(isset($tmpTab[2]) ? ('-'.$tmpTab[2]) : '');
|
|
}
|
|
}
|
|
|
|
?>
|