Subida del módulo y tema de PrestaShop

This commit is contained in:
Kaloyan
2026-04-09 18:31:51 +02:00
parent 12c253296f
commit 16b3ff9424
39262 changed files with 7418797 additions and 0 deletions

2256
modules/dashactivity/composer.lock generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" ?>
<module>
<name>dashactivity</name>
<displayName><![CDATA[Dashboard Activity]]></displayName>
<version><![CDATA[2.1.1]]></version>
<description><![CDATA[]]></description>
<author><![CDATA[PrestaShop]]></author>
<tab><![CDATA[dashboard]]></tab>
<is_configurable>0</is_configurable>
<need_instance>1</need_instance>
<limited_countries></limited_countries>
</module>

View File

@@ -0,0 +1,433 @@
<?php
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @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 dashactivity extends Module
{
protected static $colors = ['#1F77B4', '#FF7F0E', '#2CA02C'];
public function __construct()
{
$this->name = 'dashactivity';
$this->tab = 'administration';
$this->version = '2.1.1';
$this->author = 'PrestaShop';
parent::__construct();
$this->displayName = $this->trans('Dashboard Activity', [], 'Modules.Dashactivity.Admin');
$this->description = $this->trans('Check in one glance what is happening on your store with a list of KPI on your dashboard.', [], 'Modules.Dashactivity.Admin');
$this->ps_versions_compliancy = ['min' => '1.7.7.0', 'max' => _PS_VERSION_];
}
public function install()
{
Configuration::updateValue('DASHACTIVITY_CART_ACTIVE', 30);
Configuration::updateValue('DASHACTIVITY_CART_ABANDONED_MIN', 24);
Configuration::updateValue('DASHACTIVITY_CART_ABANDONED_MAX', 48);
Configuration::updateValue('DASHACTIVITY_VISITOR_ONLINE', 30);
return parent::install()
&& $this->registerHook('dashboardZoneOne')
&& $this->registerHook('dashboardData')
&& $this->registerHook('actionAdminControllerSetMedia')
;
}
public function hookActionAdminControllerSetMedia()
{
if (get_class($this->context->controller) == 'AdminDashboardController') {
$this->context->controller->addJs($this->_path . 'views/js/' . $this->name . '.js');
$this->context->controller->addJs(
[
_PS_JS_DIR_ . 'date.js',
_PS_JS_DIR_ . 'tools.js',
] // retro compat themes 1.5
);
}
}
public function hookDashboardZoneOne($params)
{
$this->context->smarty->assign($this->getConfigFieldsValues());
$this->context->smarty->assign(
[
'dashactivity_config_form' => $this->renderConfigForm(),
'date_subtitle' => $this->trans('(from %s to %s)', [], 'Modules.Dashactivity.Admin'),
'date_format' => $this->context->language->date_format_lite,
'link' => $this->context->link,
]
);
return $this->display(__FILE__, 'dashboard_zone_one.tpl');
}
public function hookDashboardData($params)
{
if (Tools::strlen($params['date_from']) == 10) {
$params['date_from'] .= ' 00:00:00';
}
if (Tools::strlen($params['date_to']) == 10) {
$params['date_to'] .= ' 23:59:59';
}
if (Configuration::get('PS_DASHBOARD_SIMULATION')) {
$days = (strtotime($params['date_to']) - strtotime($params['date_from'])) / 3600 / 24;
$online_visitor = rand(10, 50);
$visits = rand(200, 2000) * $days;
return [
'data_value' => [
'pending_orders' => round(rand(0, 5)),
'return_exchanges' => round(rand(0, 5)),
'abandoned_cart' => round(rand(5, 50)),
'products_out_of_stock' => round(rand(1, 10)),
'new_messages' => round(rand(1, 10) * $days),
'product_reviews' => round(rand(5, 50) * $days),
'new_customers' => round(rand(1, 5) * $days),
'online_visitor' => round($online_visitor),
'active_shopping_cart' => round($online_visitor / 10),
'new_registrations' => round(rand(1, 5) * $days),
'total_suscribers' => round(rand(200, 2000)),
'visits' => round($visits),
'unique_visitors' => round($visits * 0.6),
],
'data_trends' => [
'orders_trends' => ['way' => 'down', 'value' => 0.42],
],
'data_list_small' => [
'dash_traffic_source' => [
'<i class="icon-circle" style="color:' . self::$colors[0] . '"></i> prestashop.com' => round($visits / 2),
'<i class="icon-circle" style="color:' . self::$colors[1] . '"></i> google.com' => round($visits / 3),
'<i class="icon-circle" style="color:' . self::$colors[2] . '"></i> Direct Traffic' => round($visits / 4),
],
],
'data_chart' => [
'dash_trends_chart1' => [
'chart_type' => 'pie_chart_trends',
'data' => [
['key' => 'prestashop.com', 'y' => round($visits / 2), 'color' => self::$colors[0]],
['key' => 'google.com', 'y' => round($visits / 3), 'color' => self::$colors[1]],
['key' => 'Direct Traffic', 'y' => round($visits / 4), 'color' => self::$colors[2]],
],
],
],
];
}
$visits = $unique_visitors = 0;
$row = Db::getInstance((bool) _PS_USE_SQL_SLAVE_)->getRow('
SELECT COUNT(*) as visits, COUNT(DISTINCT `id_guest`) as unique_visitors
FROM `' . _DB_PREFIX_ . 'connections`
WHERE `date_add` BETWEEN "' . pSQL($params['date_from']) . '" AND "' . pSQL($params['date_to']) . '"
' . Shop::addSqlRestriction(false)
);
extract($row);
if ($maintenance_ips = Configuration::get('PS_MAINTENANCE_IP')) {
$maintenance_ips = implode(',', array_filter(array_map('ip2long', array_map('trim', explode(',', $maintenance_ips))), '\strlen'));
}
if (Configuration::get('PS_STATSDATA_CUSTOMER_PAGESVIEWS')) {
$sql = 'SELECT c.id_guest, c.ip_address, c.date_add, c.http_referer, pt.name as page
FROM `' . _DB_PREFIX_ . 'connections` c
LEFT JOIN `' . _DB_PREFIX_ . 'connections_page` cp ON c.id_connections = cp.id_connections
LEFT JOIN `' . _DB_PREFIX_ . 'page` p ON p.id_page = cp.id_page
LEFT JOIN `' . _DB_PREFIX_ . 'page_type` pt ON p.id_page_type = pt.id_page_type
INNER JOIN `' . _DB_PREFIX_ . 'guest` g ON c.id_guest = g.id_guest
WHERE (g.id_customer IS NULL OR g.id_customer = 0)
' . Shop::addSqlRestriction(false, 'c') . '
AND cp.`time_end` IS NULL
AND (\'' . pSQL(date('Y-m-d H:i:00', time() - 60 * (int) Configuration::get('DASHACTIVITY_VISITOR_ONLINE'))) . '\' < cp.`time_start`)
' . ($maintenance_ips ? 'AND c.ip_address NOT IN (' . preg_replace('/[^,0-9]/', '', $maintenance_ips) . ')' : '') . '
GROUP BY c.id_connections
ORDER BY c.date_add DESC';
} else {
$sql = 'SELECT c.id_guest, c.ip_address, c.date_add, c.http_referer, "-" as page
FROM `' . _DB_PREFIX_ . 'connections` c
INNER JOIN `' . _DB_PREFIX_ . 'guest` g ON c.id_guest = g.id_guest
WHERE (g.id_customer IS NULL OR g.id_customer = 0)
' . Shop::addSqlRestriction(false, 'c') . '
AND (\'' . pSQL(date('Y-m-d H:i:00', time() - 60 * (int) Configuration::get('DASHACTIVITY_VISITOR_ONLINE'))) . '\' < c.`date_add`)
' . ($maintenance_ips ? 'AND c.ip_address NOT IN (' . preg_replace('/[^,0-9]/', '', $maintenance_ips) . ')' : '') . '
ORDER BY c.date_add DESC';
}
Db::getInstance((bool) _PS_USE_SQL_SLAVE_)->executeS($sql);
$online_visitor = Db::getInstance()->NumRows();
$pending_orders = Db::getInstance((bool) _PS_USE_SQL_SLAVE_)->getValue('
SELECT COUNT(*)
FROM `' . _DB_PREFIX_ . 'orders` o
LEFT JOIN `' . _DB_PREFIX_ . 'order_state` os ON (o.current_state = os.id_order_state)
WHERE os.paid = 1 AND os.shipped = 0
' . Shop::addSqlRestriction(Shop::SHARE_ORDER)
);
$abandoned_cart = Db::getInstance((bool) _PS_USE_SQL_SLAVE_)->getValue('
SELECT COUNT(*)
FROM `' . _DB_PREFIX_ . 'cart`
WHERE `date_upd` BETWEEN "' . pSQL(date('Y-m-d H:i:s', strtotime('-' . (int) Configuration::get('DASHACTIVITY_CART_ABANDONED_MAX') . ' MIN'))) . '" AND "' . pSQL(date('Y-m-d H:i:s', strtotime('-' . (int) Configuration::get('DASHACTIVITY_CART_ABANDONED_MIN') . ' MIN'))) . '"
AND id_cart NOT IN (SELECT id_cart FROM `' . _DB_PREFIX_ . 'orders`)
' . Shop::addSqlRestriction(Shop::SHARE_ORDER)
);
$return_exchanges = Db::getInstance((bool) _PS_USE_SQL_SLAVE_)->getValue('
SELECT COUNT(*)
FROM `' . _DB_PREFIX_ . 'orders` o
LEFT JOIN `' . _DB_PREFIX_ . 'order_return` or2 ON o.id_order = or2.id_order
WHERE or2.`date_add` BETWEEN "' . pSQL($params['date_from']) . '" AND "' . pSQL($params['date_to']) . '"
' . Shop::addSqlRestriction(Shop::SHARE_ORDER, 'o')
);
$products_out_of_stock = Db::getInstance((bool) _PS_USE_SQL_SLAVE_)->getValue('
SELECT SUM(IF(IFNULL(stock.quantity, 0) > 0, 0, 1))
FROM `' . _DB_PREFIX_ . 'product` p
' . Shop::addSqlAssociation('product', 'p') . '
LEFT JOIN `' . _DB_PREFIX_ . 'product_attribute` pa ON p.id_product = pa.id_product
' . Product::sqlStock('p', 'pa') . '
WHERE p.active = 1'
);
$new_messages = AdminStatsController::getPendingMessages();
$active_shopping_cart = Db::getInstance((bool) _PS_USE_SQL_SLAVE_)->getValue('
SELECT COUNT(*)
FROM `' . _DB_PREFIX_ . 'cart`
WHERE date_upd > "' . pSQL(date('Y-m-d H:i:s', strtotime('-' . (int) Configuration::get('DASHACTIVITY_CART_ACTIVE') . ' MIN'))) . '"
' . Shop::addSqlRestriction(Shop::SHARE_ORDER)
);
$new_customers = Db::getInstance((bool) _PS_USE_SQL_SLAVE_)->getValue('
SELECT COUNT(*)
FROM `' . _DB_PREFIX_ . 'customer`
WHERE `date_add` BETWEEN "' . pSQL($params['date_from']) . '" AND "' . pSQL($params['date_to']) . '"
' . Shop::addSqlRestriction(Shop::SHARE_ORDER)
);
$new_registrations = Db::getInstance((bool) _PS_USE_SQL_SLAVE_)->getValue('
SELECT COUNT(*)
FROM `' . _DB_PREFIX_ . 'customer`
WHERE `newsletter_date_add` BETWEEN "' . pSQL($params['date_from']) . '" AND "' . pSQL($params['date_to']) . '"
AND newsletter = 1
' . Shop::addSqlRestriction(Shop::SHARE_ORDER)
);
$total_suscribers = Db::getInstance((bool) _PS_USE_SQL_SLAVE_)->getValue('
SELECT COUNT(*)
FROM `' . _DB_PREFIX_ . 'customer`
WHERE newsletter = 1
' . Shop::addSqlRestriction(Shop::SHARE_ORDER)
);
$product_reviews = 0;
if (Module::isInstalled('productcomments')) {
$product_reviews += Db::getInstance((bool) _PS_USE_SQL_SLAVE_)->getValue('
SELECT COUNT(*)
FROM `' . _DB_PREFIX_ . 'product_comment` pc
LEFT JOIN `' . _DB_PREFIX_ . 'product` p ON (pc.id_product = p.id_product)
' . Shop::addSqlAssociation('product', 'p') . '
WHERE pc.deleted = 0
AND pc.`date_add` BETWEEN "' . pSQL($params['date_from']) . '" AND "' . pSQL($params['date_to']) . '"
' . Shop::addSqlRestriction(Shop::SHARE_ORDER)
);
}
return [
'data_value' => [
'pending_orders' => (int) $pending_orders,
'return_exchanges' => (int) $return_exchanges,
'abandoned_cart' => (int) $abandoned_cart,
'products_out_of_stock' => (int) $products_out_of_stock,
'new_messages' => (int) $new_messages,
'product_reviews' => (int) $product_reviews,
'new_customers' => (int) $new_customers,
'online_visitor' => (int) $online_visitor,
'active_shopping_cart' => (int) $active_shopping_cart,
'new_registrations' => (int) $new_registrations,
'total_suscribers' => (int) $total_suscribers,
'visits' => (int) $visits,
'unique_visitors' => (int) $unique_visitors,
],
'data_trends' => [
'orders_trends' => ['way' => 'down', 'value' => 0.42],
],
'data_list_small' => [
'dash_traffic_source' => $this->getTrafficSources($params['date_from'], $params['date_to']),
],
'data_chart' => [
'dash_trends_chart1' => $this->getChartTrafficSource($params['date_from'], $params['date_to']),
],
];
}
protected function getChartTrafficSource($date_from, $date_to)
{
$referers = $this->getReferer($date_from, $date_to);
$return = ['chart_type' => 'pie_chart_trends', 'data' => []];
$i = 0;
foreach ($referers as $referer_name => $n) {
$return['data'][] = ['key' => $referer_name, 'y' => $n, 'color' => self::$colors[$i++]];
}
return $return;
}
protected function getTrafficSources($date_from, $date_to)
{
$referrers = $this->getReferer($date_from, $date_to, 3);
$traffic_sources = [];
$i = 0;
foreach ($referrers as $referrer_name => $n) {
$traffic_sources['<i class="icon-circle" style="color:' . self::$colors[$i++] . '"></i> ' . $referrer_name] = $n;
}
return $traffic_sources;
}
protected function getReferer($date_from, $date_to, $limit = 3)
{
$direct_link = $this->trans('Direct link', [], 'Admin.Orderscustomers.Notification');
$websites = [$direct_link => 0];
$result = Db::getInstance()->ExecuteS('
SELECT http_referer
FROM ' . _DB_PREFIX_ . 'connections
WHERE date_add BETWEEN "' . pSQL($date_from) . '" AND "' . pSQL($date_to) . '"
' . Shop::addSqlRestriction() . '
LIMIT ' . (int) $limit
);
foreach ($result as $row) {
if (!isset($row['http_referer']) || empty($row['http_referer'])) {
++$websites[$direct_link];
} else {
$website = preg_replace('/^www./', '', parse_url($row['http_referer'], PHP_URL_HOST));
if (!isset($websites[$website])) {
$websites[$website] = 1;
} else {
++$websites[$website];
}
}
}
arsort($websites);
return $websites;
}
public function renderConfigForm()
{
$fields_form = [
'form' => [
'id_form' => 'step_carrier_general',
'input' => [],
'submit' => [
'title' => $this->trans('Save', [], 'Admin.Actions'),
'class' => 'btn btn-default pull-right submit_dash_config',
'reset' => [
'title' => $this->trans('Cancel', [], 'Admin.Actions'),
'class' => 'btn btn-default cancel_dash_config',
],
],
],
];
$fields_form['form']['input'][] = [
'label' => $this->trans('Active cart', [], 'Modules.Dashactivity.Admin'),
'hint' => $this->trans('How long (in minutes) a cart is to be considered as active after the last recorded change (default: 30 min).', [], 'Modules.Dashactivity.Admin'),
'name' => 'DASHACTIVITY_CART_ACTIVE',
'type' => 'select',
'options' => [
'query' => [
['id' => 15, 'name' => 15],
['id' => 30, 'name' => 30],
['id' => 45, 'name' => 45],
['id' => 60, 'name' => 60],
['id' => 90, 'name' => 90],
['id' => 120, 'name' => 120],
],
'id' => 'id',
'name' => 'name',
],
];
$fields_form['form']['input'][] = [
'label' => $this->trans('Online visitor', [], 'Modules.Dashactivity.Admin'),
'hint' => $this->trans('How long (in minutes) a visitor is to be considered as online after their last action (default: 30 min).', [], 'Modules.Dashactivity.Admin'),
'name' => 'DASHACTIVITY_VISITOR_ONLINE',
'type' => 'select',
'options' => [
'query' => [
['id' => 15, 'name' => 15],
['id' => 30, 'name' => 30],
['id' => 45, 'name' => 45],
['id' => 60, 'name' => 60],
['id' => 90, 'name' => 90],
['id' => 120, 'name' => 120],
],
'id' => 'id',
'name' => 'name',
],
];
$fields_form['form']['input'][] = [
'label' => $this->trans('Abandoned cart (min)', [], 'Modules.Dashactivity.Admin'),
'hint' => $this->trans('How long (in hours) after the last action a cart is to be considered as abandoned (default: 24 hrs).', [], 'Modules.Dashactivity.Admin'),
'name' => 'DASHACTIVITY_CART_ABANDONED_MIN',
'type' => 'text',
'suffix' => $this->trans('hrs', [], 'Modules.Dashactivity.Admin'),
];
$fields_form['form']['input'][] = [
'label' => $this->trans('Abandoned cart (max)', [], 'Modules.Dashactivity.Admin'),
'hint' => $this->trans('How long (in hours) after the last action a cart is no longer to be considered as abandoned (default: 24 hrs).', [], 'Modules.Dashactivity.Admin'),
'name' => 'DASHACTIVITY_CART_ABANDONED_MAX',
'type' => 'text',
'suffix' => $this->trans('hrs', [], 'Modules.Dashactivity.Admin'),
];
$helper = new HelperForm();
$helper->show_toolbar = false;
$helper->table = $this->table;
$lang = new Language((int) Configuration::get('PS_LANG_DEFAULT'));
$helper->default_form_language = $lang->id;
$helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0;
$helper->id = (int) Tools::getValue('id_carrier');
$helper->identifier = $this->identifier;
$helper->submit_action = 'submitDashConfig';
$helper->tpl_vars = [
'fields_value' => $this->getConfigFieldsValues(),
'languages' => $this->context->controller->getLanguages(),
'id_language' => $this->context->language->id,
];
return $helper->generateForm([$fields_form]);
}
public function getConfigFieldsValues()
{
return [
'DASHACTIVITY_CART_ACTIVE' => Tools::getValue('DASHACTIVITY_CART_ACTIVE', Configuration::get('DASHACTIVITY_CART_ACTIVE')),
'DASHACTIVITY_CART_ABANDONED_MIN' => Tools::getValue('DASHACTIVITY_CART_ABANDONED_MIN', Configuration::get('DASHACTIVITY_CART_ABANDONED_MIN')),
'DASHACTIVITY_CART_ABANDONED_MAX' => Tools::getValue('DASHACTIVITY_CART_ABANDONED_MAX', Configuration::get('DASHACTIVITY_CART_ABANDONED_MAX')),
'DASHACTIVITY_VISITOR_ONLINE' => Tools::getValue('DASHACTIVITY_VISITOR_ONLINE', Configuration::get('DASHACTIVITY_VISITOR_ONLINE')),
];
}
}

View File

@@ -0,0 +1,34 @@
<?php
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -0,0 +1,34 @@
<?php
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

View File

@@ -0,0 +1,37 @@
<?php
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @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;
}
function upgrade_module_2_1_0($object)
{
return $object->unregisterHook('actionObjectOrderAddAfter')
&& $object->unregisterHook('actionObjectCustomerAddAfter')
&& $object->unregisterHook('actionObjectCustomerMessageAddAfter')
&& $object->unregisterHook('actionObjectCustomerThreadAddAfter')
&& $object->unregisterHook('actionObjectOrderReturnAddAfter');
}

View File

@@ -0,0 +1,34 @@
<?php
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

View File

@@ -0,0 +1,156 @@
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
function pie_chart_trends(widget_name, chart_details)
{
nv.addGraph(function() {
var chart = nv.models.pieChart()
.x(function(d) { return d.key })
.y(function(d) { return d.y })
.color(d3.scale.category10().range())
.donut(true)
.showLabels(false)
.showLegend(false);
d3.select("#dash_traffic_chart2 svg")
.datum(chart_details.data)
.transition().duration(1200)
.call(chart);
nv.utils.windowResize(chart.update);
return chart;
});
}
//TODO unify this with other function in calenda.js and replace date.js functions
Date.parseDate = function(date, format) {
if (format === undefined)
format = 'Y-m-d';
var formatSeparator = format.match(/[.\/\-\s].*?/);
var formatParts = format.split(/\W+/);
var parts = date.split(formatSeparator);
var date = new Date();
if (parts.length === formatParts.length) {
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
date.setMilliseconds(0);
for (var i=0; i<=formatParts.length; i++) {
switch(formatParts[i]) {
case 'dd':
case 'd':
case 'j':
date.setDate(parseInt(parts[i], 10)||1);
break;
case 'mm':
case 'm':
date.setMonth((parseInt(parts[i], 10)||1) - 1);
break;
case 'yy':
case 'y':
date.setFullYear(2000 + (parseInt(parts[i], 10)||1));
break;
case 'yyyy':
case 'Y':
date.setFullYear(parseInt(parts[i], 10)||1);
break;
}
}
}
return date;
};
Date.prototype.format = function(format) {
if (format === undefined)
return this.toString();
var formatSeparator = format.match(/[.\/\-\s].*?/);
var formatParts = format.split(/\W+/);
var result = '';
for (var i=0; i<=formatParts.length; i++) {
switch(formatParts[i]) {
case 'd':
case 'j':
result += this.getDate() + formatSeparator;
break;
case 'dd':
result += (this.getDate() < 10 ? '0' : '')+this.getDate() + formatSeparator;
break;
case 'm':
result += (this.getMonth() + 1) + formatSeparator;
break;
case 'mm':
result += (this.getMonth() < 9 ? '0' : '')+(this.getMonth() + 1) + formatSeparator;
break;
case 'yy':
case 'y':
result += this.getFullYear() + formatSeparator;
break;
case 'yyyy':
case 'Y':
result += this.getFullYear() + formatSeparator;
break;
}
}
return result.slice(0, -1);
}
$(document).ready(function() {
if (typeof date_subtitle === "undefined")
var date_subtitle = '(from %s to %s)';
if (typeof date_format === "undefined")
var date_format = 'Y-mm-dd';
$('#date-start').change(function() {
start = Date.parseDate($('#date-start').val(), 'Y-m-d');
end = Date.parseDate($('#date-end').val(), 'Y-m-d');
$('#customers-newsletters-subtitle').html(sprintf(date_subtitle, start.format(date_format), end.format(date_format)));
$('#traffic-subtitle').html(sprintf(date_subtitle, start.format(date_format), end.format(date_format)));
});
$('#date-end').change(function() {
start = Date.parseDate($('#date-start').val(), 'Y-m-d');
end = Date.parseDate($('#date-end').val(), 'Y-m-d');
$('#customers-newsletters-subtitle').html(sprintf(date_subtitle, start.format(date_format), end.format(date_format)));
$('#traffic-subtitle').html(sprintf(date_subtitle, start.format(date_format), end.format(date_format)));
});
});

View File

@@ -0,0 +1,34 @@
<?php
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

View File

@@ -0,0 +1,181 @@
{**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*}
<section id="dashactivity" class="panel widget">
<div class="panel-heading">
<i class="icon-time"></i> {l s='Activity overview' d='Modules.Dashactivity.Admin'}
<span class="panel-heading-action">
<a class="list-toolbar-btn" href="#" onclick="toggleDashConfig('dashactivity'); return false;" title="{l s='Configure' d='Admin.Actions'}">
<i class="process-icon-configure"></i>
</a>
<a class="list-toolbar-btn" href="#" onclick="refreshDashboard('dashactivity'); return false;" title="{l s='Refresh' d='Admin.Actions'}">
<i class="process-icon-refresh"></i>
</a>
</span>
</div>
<section id="dashactivity_config" class="dash_config hide">
<header><i class="icon-wrench"></i> {l s='Configuration' d='Admin.Global'}</header>
{$dashactivity_config_form}
</section>
<section id="dash_live" class="loading">
<ul class="data_list_large">
{if Module::isEnabled('statslive')}
<li>
<span class="data_label size_l">
<a href="{$link->getAdminLink('AdminStats')|escape:'html':'UTF-8'}&amp;module=statslive">{l s='Online Visitors' d='Modules.Dashactivity.Admin'}</a>
<small class="text-muted"><br/>
{l s='in the last %d minutes' sprintf=$DASHACTIVITY_VISITOR_ONLINE|intval d='Modules.Dashactivity.Admin'}
</small>
</span>
<span class="data_value size_xxl">
<span id="online_visitor"></span>
</span>
</li>
{/if}
<li>
<span class="data_label size_l">
<a href="{$link->getAdminLink('AdminCarts')|escape:'html':'UTF-8'}">{l s='Active Shopping Carts' d='Modules.Dashactivity.Admin'}</a>
<small class="text-muted"><br/>
{l s='in the last %d minutes' sprintf=$DASHACTIVITY_CART_ACTIVE|intval d='Modules.Dashactivity.Admin'}
</small>
</span>
<span class="data_value size_xxl">
<span id="active_shopping_cart"></span>
</span>
</li>
</ul>
</section>
<section id="dash_pending" class="loading">
<header><i class="icon-time"></i> {l s='Currently Pending' d='Modules.Dashactivity.Admin'}</header>
<ul class="data_list">
<li>
<span class="data_label"><a href="{$link->getAdminLink('AdminOrders')|escape:'html':'UTF-8'}">{l s='Orders' d='Admin.Global'}</a></span>
<span class="data_value size_l">
<span id="pending_orders"></span>
</span>
</li>
<li>
<span class="data_label"><a href="{$link->getAdminLink('AdminReturn')|escape:'html':'UTF-8'}">{l s='Return/Exchanges' d='Modules.Dashactivity.Admin'}</a></span>
<span class="data_value size_l">
<span id="return_exchanges"></span>
</span>
</li>
<li>
<span class="data_label"><a href="{$link->getAdminLink('AdminCarts')|escape:'html':'UTF-8'}">{l s='Abandoned Carts' d='Admin.Global'}</a></span>
<span class="data_value size_l">
<span id="abandoned_cart"></span>
</span>
</li>
{if isset($stock_management) && $stock_management}
<li>
<span class="data_label"><a href="{$link->getAdminLink('AdminTracking')|escape:'html':'UTF-8'}">{l s='Out of Stock Products' d='Modules.Dashactivity.Admin'}</a></span>
<span class="data_value size_l">
<span id="products_out_of_stock"></span>
</span>
</li>
{/if}
</ul>
</section>
<section id="dash_notifications" class="loading">
<header><i class="icon-exclamation-sign"></i> {l s='Notifications' d='Admin.Advparameters.Feature'}</header>
<ul class="data_list_vertical">
<li>
<span class="data_label"><a href="{$link->getAdminLink('AdminCustomerThreads')|escape:'html':'UTF-8'}">{l s='New Messages' d='Modules.Dashactivity.Admin'}</a></span>
<span class="data_value size_l">
<span id="new_messages"></span>
</span>
</li>
{if Module::isEnabled('productcomments')}
<li>
<span class="data_label"><a href="{$link->getAdminLink('AdminModules')|escape:'html':'UTF-8'}&amp;configure=productcomments&amp;tab_module=front_office_features&amp;module_name=productcomments">{l s='Product Reviews' d='Modules.Dashactivity.Admin'}</a></span>
<span class="data_value size_l">
<span id="product_reviews"></span>
</span>
</li>
{/if}
</ul>
</section>
<section id="dash_customers" class="loading">
<header><i class="icon-user"></i> {l s='Customers & Newsletters' d='Modules.Dashactivity.Admin'} <span class="subtitle small" id="customers-newsletters-subtitle"></span></header>
<ul class="data_list">
<li>
<span class="data_label"><a href="{$link->getAdminLink('AdminCustomers')|escape:'html':'UTF-8'}">{l s='New Customers' d='Modules.Dashactivity.Admin'}</a></span>
<span class="data_value size_md">
<span id="new_customers"></span>
</span>
</li>
{if Module::isEnabled('statsnewsletter')}
<li>
<span class="data_label"><a href="{$link->getAdminLink('AdminStats')|escape:'html':'UTF-8'}&amp;module=statsnewsletter">{l s='New Subscriptions' d='Modules.Dashactivity.Admin'}</a></span>
<span class="data_value size_md">
<span id="new_registrations"></span>
</span>
</li>
{/if}
{if Module::isEnabled('ps_emailsubscription')}
<li>
<span class="data_label"><a href="{$link->getAdminLink('AdminModules')|escape:'html':'UTF-8'}&amp;configure=ps_emailsubscription&amp;module_name=ps_emailsubscription">{l s='Total Subscribers' d='Modules.Dashactivity.Admin'}</a></span>
<span class="data_value size_md">
<span id="total_suscribers"></span>
</span>
</li>
{/if}
</ul>
</section>
<section id="dash_traffic" class="loading">
<header>
<i class="icon-globe"></i> {l s='Traffic' d='Modules.Dashactivity.Admin'} <span class="subtitle small" id="traffic-subtitle"></span>
</header>
<ul class="data_list">
{if Module::isEnabled('statsforecast')}
<li>
<span class="data_label"><a href="{$link->getAdminLink('AdminStats')|escape:'html':'UTF-8'}&amp;module=statsforecast">{l s='Visits' d='Modules.Dashactivity.Admin'}</a></span>
<span class="data_value size_md">
<span id="visits"></span>
</span>
</li>
{/if}
{if Module::isEnabled('statsvisits')}
<li>
<span class="data_label"><a href="{$link->getAdminLink('AdminStats')|escape:'html':'UTF-8'}&amp;module=statsvisits">{l s='Unique Visitors' d='Modules.Dashactivity.Admin'}</a></span>
<span class="data_value size_md">
<span id="unique_visitors"></span>
</span>
</li>
{/if}
<li>
<span class="data_label">{l s='Traffic Sources' d='Modules.Dashactivity.Admin'}</span>
<ul class="data_list_small" id="dash_traffic_source">
</ul>
<div id="dash_traffic_chart2" class='chart with-transitions'>
<svg></svg>
</div>
</li>
</ul>
</section>
</section>
<script type="text/javascript">
date_subtitle = "{$date_subtitle|escape:'html':'UTF-8'}";
date_format = "{$date_format|escape:'html':'UTF-8'}";
</script>

View File

@@ -0,0 +1,34 @@
<?php
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

View File

@@ -0,0 +1,34 @@
<?php
/**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;