* @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 => ''.$this->l('bad').'', 1 => ''.$this->l('average').'', 2 => ''.$this->l('good').'' ); $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 = '
'; foreach ($arrayConf as $conf => $translations) $html .= ''; $html .= '
'.$arrayColors[0].' '.$this->l('Not enough').''.$arrayColors[2].' '.$this->l('Alright').'
'.$translations['name'].' '.$this->l('lower than').' '.$translations['text'].' '.$this->l('greater than').' '.$translations['text'].'
 
'.$this->l('Order by').'
 
'; foreach ($languages as $language) $html .= ''; $html .= ' '; 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 .= ''; foreach ($languages as $language) if (isset($row['desclength_'.$language['iso_code']])) $html .= ''; else $html .= ''; $html .= ' '; } $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 .= ' '; foreach ($languages as $language) $html .= ''; $html .= ' '; foreach ($languages as $language) $html .= ''; $html .= '
'.$this->l('ID').' '.$this->l('Item').' '.$this->l('Active').''.$this->l('Desc.').' ('.strtoupper($language['iso_code']).')'.$this->l('Images').' '.$this->l('Sales').' '.$this->l('Stock').' '.$this->l('Global').'
'.$row['id_product'].' '.Tools::substr($row['name'], 0, 42).' '.$arrayColors[$scores['active']].''.(int)$row['desclength_'.$language['iso_code']].' '.$arrayColors[$scores['description_'.$language['iso_code']]].'0 '.$arrayColors[0].''.(int)$row['nbImages'].' '.$arrayColors[$scores['images']].' '.(int)$row['nbSales'].' '.$arrayColors[$scores['sales']].' '.(int)$row['stock'].' '.$arrayColors[$scores['stock']].' '.$arrayColors[$scores['average']].'
'.$this->l('Active').''.$this->l('Desc.').' ('.strtoupper($language['iso_code']).')'.$this->l('Images').' '.$this->l('Sales').' '.$this->l('Stock').' '.$this->l('Global').'
'.$arrayColors[$totals['active']].''.$arrayColors[$totals['description_'.$language['iso_code']]].''.$arrayColors[$totals['images']].' '.$arrayColors[$totals['sales']].' '.$arrayColors[$totals['stock']].' '.$arrayColors[$totals['average']].'
 
'; return $html; } }