* @copyright 2007-2011 PrestaShop SA
* @version Release: $Revision: 6626 $
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
if (!defined('_CAN_LOAD_FILES_'))
exit;
class StatsCheckUp extends Module
{
function __construct()
{
$this->name = 'statscheckup';
$this->tab = 'analytics_stats';
$this->version = 1.0;
$this->author = 'PrestaShop';
$this->need_instance = 0;
parent::__construct();
$this->displayName = $this->l('Catalog evaluation');
$this->description = $this->l('Quick evaluation of your catalog quality.');
}
public function install()
{
foreach (array('CHECKUP_DESCRIPTIONS_LT'=>100,'CHECKUP_DESCRIPTIONS_GT'=>400,'CHECKUP_IMAGES_LT'=>1,'CHECKUP_IMAGES_GT'=>2,'CHECKUP_SALES_LT'=>1,'CHECKUP_SALES_GT'=>2,'CHECKUP_STOCK_LT'=>1,'CHECKUP_STOCK_GT'=>3) as $confname => $confdefault)
if (!Configuration::get($confname))
Configuration::updateValue($confname, (int)$confdefault);
return (parent::install() && $this->registerHook('AdminStatsModules'));
}
function hookAdminStatsModules()
{
global $cookie, $currentIndex;
if (Tools::isSubmit('submitCheckup'))
{
foreach (array('CHECKUP_DESCRIPTIONS_LT','CHECKUP_DESCRIPTIONS_GT','CHECKUP_IMAGES_LT','CHECKUP_IMAGES_GT','CHECKUP_SALES_LT','CHECKUP_SALES_GT','CHECKUP_STOCK_LT','CHECKUP_STOCK_GT') as $confname)
Configuration::updateValue($confname, (int)Tools::getValue($confname));
echo '
'.$this->l('Configuration updated').'
';
}
if (Tools::isSubmit('submitCheckupOrder'))
{
$cookie->checkup_order = (int)Tools::getValue('submitCheckupOrder');
echo ' '.$this->l('Configuration updated').'
';
}
if (!isset($cookie->checkup_order))
$cookie->checkup_order = 1;
$db = Db::getInstance(_PS_USE_SQL_SLAVE_);
$employee = new Employee((int)($cookie->id_employee));
$prop30 = ((strtotime($employee->stats_date_to.' 23:59:59') - strtotime($employee->stats_date_from.' 00:00:00')) / 60 / 60 / 24) / 30;
$languages = $db->ExecuteS('SELECT * FROM '._DB_PREFIX_.'lang');
$arrayColors = array(
0 => '',
1 => '',
2 => ''
);
$tokenProducts = Tools::getAdminToken('AdminCatalog'.(int)(Tab::getIdFromClassName('AdminCatalog')).(int)($cookie->id_employee));
$divisor = 4;
$totals = array('products' => 0, 'active' => 0, 'images' => 0, 'sales' => 0, 'stock' => 0);
foreach ($languages as $language)
{
$divisor++;
$totals['description_'.$language['iso_code']] = 0;
}
$orderBy = 'p.id_product';
if ($cookie->checkup_order == 2)
$orderBy = 'pl.name';
elseif ($cookie->checkup_order == 3)
$orderBy = 'nbSales DESC';
$result = $db->ExecuteS('
SELECT p.id_product, p.active, pl.name, (
SELECT COUNT(*)
FROM '._DB_PREFIX_.'image i
WHERE i.id_product = p.id_product
) as nbImages, (
SELECT SUM(od.product_quantity)
FROM '._DB_PREFIX_.'orders o
LEFT JOIN '._DB_PREFIX_.'order_detail od ON o.id_order = od.id_order
WHERE od.product_id = p.id_product
AND o.invoice_date BETWEEN '.ModuleGraph::getDateBetween().'
) as nbSales, IFNULL((
SELECT SUM(pa.quantity)
FROM '._DB_PREFIX_.'product_attribute pa
WHERE pa.id_product = p.id_product
), p.quantity) as stock
FROM '._DB_PREFIX_.'product p
LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (p.id_product = pl.id_product AND pl.id_lang = '.(int)$cookie->id_lang.')
ORDER BY '.$orderBy);
$arrayConf = array(
'DESCRIPTIONS' => array('name' => $this->l('Descriptions'), 'text' => $this->l('chars (without HTML)')),
'IMAGES' => array('name' => $this->l('Images'), 'text' => $this->l('images')),
'SALES' => array('name' => $this->l('Sales'), 'text' => $this->l('orders / month')),
'STOCK' => array('name' => $this->l('Stock'), 'text' => $this->l('items'))
);
$html = '
'.$this->l('ID').' |
'.$this->l('Item').' |
'.$this->l('Active').' | ';
foreach ($languages as $language)
$html .= ''.$this->l('Desc.').' ('.strtoupper($language['iso_code']).') | ';
$html .= '
'.$this->l('Images').' |
'.$this->l('Sales').' |
'.$this->l('Stock').' |
'.$this->l('Global').' |
';
foreach ($result as $row)
{
$totals['products']++;
$scores = array(
'active' => ($row['active'] ? 2 : 0),
'images' => ($row['nbImages'] < Configuration::get('CHECKUP_IMAGES_LT') ? 0 : ($row['nbImages'] > Configuration::get('CHECKUP_IMAGES_GT') ? 2 : 1)),
'sales' => (($row['nbSales'] * $prop30 < Configuration::get('CHECKUP_SALES_LT')) ? 0 : (($row['nbSales'] * $prop30 > Configuration::get('CHECKUP_SALES_GT')) ? 2 : 1)),
'stock' => (($row['stock'] < Configuration::get('CHECKUP_STOCK_LT')) ? 0 : (($row['stock'] > Configuration::get('CHECKUP_STOCK_GT')) ? 2 : 1)),
);
$totals['active'] += (int)$scores['active'];
$totals['images'] += (int)$scores['images'];
$totals['sales'] += (int)$scores['sales'];
$totals['stock'] += (int)$scores['stock'];
$descriptions = $db->ExecuteS('SELECT iso_code, description FROM '._DB_PREFIX_.'product_lang pl LEFT JOIN '._DB_PREFIX_.'lang l ON pl.id_lang = l.id_lang WHERE id_product = '.(int)$row['id_product']);
foreach ($descriptions as $description)
{
$row['desclength_'.$description['iso_code']] = Tools::strlen(strip_tags($description['description']));
$scores['description_'.$description['iso_code']] = ($row['desclength_'.$description['iso_code']] < Configuration::get('CHECKUP_DESCRIPTIONS_LT') ? 0 : ($row['desclength_'.$description['iso_code']] > Configuration::get('CHECKUP_DESCRIPTIONS_GT') ? 2 : 1));
$totals['description_'.$description['iso_code']] += $scores['description_'.$description['iso_code']];
}
$scores['average'] = array_sum($scores) / $divisor;
$scores['average'] = ($scores['average'] < 1 ? 0 : ($scores['average'] > 1.5 ? 2 : 1));
$html .= '
'.$row['id_product'].' |
'.Tools::substr($row['name'], 0, 42).' |
'.$arrayColors[$scores['active']].' | ';
foreach ($languages as $language)
if (isset($row['desclength_'.$language['iso_code']]))
$html .= ''.(int)$row['desclength_'.$language['iso_code']].' '.$arrayColors[$scores['description_'.$language['iso_code']]].' | ';
else
$html .= '0 '.$arrayColors[0].' | ';
$html .= '
'.(int)$row['nbImages'].' '.$arrayColors[$scores['images']].' |
'.(int)$row['nbSales'].' '.$arrayColors[$scores['sales']].' |
'.(int)$row['stock'].' '.$arrayColors[$scores['stock']].' |
'.$arrayColors[$scores['average']].' |
';
}
$totals['active'] = $totals['active'] / $totals['products'];
$totals['active'] = ($totals['active'] < 1 ? 0 : ($totals['active'] > 1.5 ? 2 : 1));
$totals['images'] = $totals['images'] / $totals['products'];
$totals['images'] = ($totals['images'] < 1 ? 0 : ($totals['images'] > 1.5 ? 2 : 1));
$totals['sales'] = $totals['sales'] / $totals['products'];
$totals['sales'] = ($totals['sales'] < 1 ? 0 : ($totals['sales'] > 1.5 ? 2 : 1));
$totals['stock'] = $totals['stock'] / $totals['products'];
$totals['stock'] = ($totals['stock'] < 1 ? 0 : ($totals['stock'] > 1.5 ? 2 : 1));
foreach ($languages as $language)
{
$totals['description_'.$language['iso_code']] = $totals['description_'.$language['iso_code']] / $totals['products'];
$totals['description_'.$language['iso_code']] = ($totals['description_'.$language['iso_code']] < 1 ? 0 : ($totals['description_'.$language['iso_code']] > 1.5 ? 2 : 1));
}
$totals['average'] = array_sum($totals) / $divisor;
$totals['average'] = ($totals['average'] < 1 ? 0 : ($totals['average'] > 1.5 ? 2 : 1));
$html .= '
|
'.$this->l('Active').' | ';
foreach ($languages as $language)
$html .= ''.$this->l('Desc.').' ('.strtoupper($language['iso_code']).') | ';
$html .= '
'.$this->l('Images').' |
'.$this->l('Sales').' |
'.$this->l('Stock').' |
'.$this->l('Global').' |
|
'.$arrayColors[$totals['active']].' | ';
foreach ($languages as $language)
$html .= ''.$arrayColors[$totals['description_'.$language['iso_code']]].' | ';
$html .= '
'.$arrayColors[$totals['images']].' |
'.$arrayColors[$totals['sales']].' |
'.$arrayColors[$totals['stock']].' |
'.$arrayColors[$totals['average']].' |
';
return $html;
}
}