Jump to content

[Solucionado] - Modulo "Mas Vendidos" no funciona


Recommended Posts

Buenos días, he buscado por internet una posible solución a mi problema pero no encuentro nada.

 

Mi versión de prestashop es la 1.5.6. La plantilla que he utilizado es la General aunque he modificado bastantes cosas.

 

El problema es que el módulo de LO MAS VENDIDO que aparece a la derecha, muestra los 5 productos que efectivamente más se han vendido pero si pincho para que me muestre TODOS, no me sale ningún artículo.

 

También me he dado cuenta que si entro en estadísticas no tiene en cuenta los pedidos, muestra las estadísiticas de clientes pero en todo lo referente a pedidos está a cero.

 

Este es el link para que veáis el problema:

 

http://www.caprichoyplacer.es/mas-vendidos

 

Os agradecería mucho alguna solución.

Edited by asasanse (see edit history)
Link to comment
Share on other sites

Si no estas usando la 1.5.6.2 y estas usando la 1.5.6 o 1.5.6.1, deja tu fichero:

/classes/ProductSale.php

Asi:

<?php
/*
* 2007-2013 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* 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 [email protected] 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 http://www.prestashop.com for more information.
*
*  @author PrestaShop SA <[email protected]>
*  @copyright  2007-2013 PrestaShop SA
*  @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*/

class ProductSaleCore
{
        /*
        ** Fill the `product_sale` SQL table with data from `order_detail`
        ** @return bool True on success
        */
        public static function fillProductSales()
        {
                $sql = 'REPLACE INTO '._DB_PREFIX_.'product_sale
                                (`id_product`, `quantity`, `sale_nbr`, `date_upd`)
                                SELECT od.product_id, SUM(od.product_quantity), COUNT(od.product_id), NOW()
                                                        FROM '._DB_PREFIX_.'order_detail od GROUP BY od.product_id';
                return Db::getInstance()->execute($sql);
        }

        /*
        ** Get number of actives products sold
        ** @return int number of actives products listed in product_sales
        */
        public static function getNbSales()
        {
                $sql = 'SELECT COUNT(ps.`id_product`) AS nb
                                FROM `'._DB_PREFIX_.'product_sale` ps
                                LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = ps.`id_product`
                                '.Shop::addSqlAssociation('product', 'p', false).'
                                WHERE product_shop.`active` = 1';
                return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
        }

        /*
        ** Get required informations on best sales products
        **
        ** @param integer $id_lang Language id
        ** @param integer $page_number Start from (optional)
        ** @param integer $nb_products Number of products to return (optional)
        ** @return array from Product::getProductProperties
        */
        public static function getBestSales($id_lang, $page_number = 0, $nb_products = 10, $order_by = null, $order_way = null)
        {
                if ($page_number < 0) $page_number = 0;
                if ($nb_products < 1) $nb_products = 10;
                $final_order_by = $order_by;
                $order_table = '';                 
                if (is_null($order_by) || $order_by == 'position' || $order_by == 'price') $order_by = 'sales';
                if ($order_by == 'date_add' || $order_by == 'date_upd')
                        $order_table = 'product_shop';                                 
                if (is_null($order_way) || $order_by == 'sales') $order_way = 'DESC';
                $groups = FrontController::getCurrentCustomerGroups();
                $sql_groups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1');
                $interval = Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20;

                //Subquery: get product ids in a separate query to (greatly!) improve performances and RAM usage
                $sql = 'SELECT cp.`id_product`
                                FROM `'._DB_PREFIX_.'category_group` cg
                                INNER JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
                                WHERE cp.`id_product` IS NOT NULL AND cg.`id_group` '.$sql_groups;
                $products = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
                $ids = array();
                foreach ($products as $product)
                        $ids[$product['id_product']] = 1;
                $ids = array_keys($ids);
                $ids = array_filter($ids);
                sort($ids);
                $ids = count($ids) > 0 ? implode(',', $ids) : 'NULL';
                
                //Main query
                $sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity,
                                        pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`,
                                        pl.`meta_keywords`, pl.`meta_title`, pl.`name`,
                                        m.`name` AS manufacturer_name, p.`id_manufacturer` as id_manufacturer,
                                        MAX(image_shop.`id_image`) id_image, il.`legend`,
                                        ps.`quantity` AS sales, t.`rate`, pl.`meta_keywords`, pl.`meta_title`, pl.`meta_description`,
                                        DATEDIFF(p.`date_add`, DATE_SUB(NOW(),
                                        INTERVAL '.$interval.' DAY)) > 0 AS new
                                FROM `'._DB_PREFIX_.'product_sale` ps
                                LEFT JOIN `'._DB_PREFIX_.'product` p ON ps.`id_product` = p.`id_product`
                                '.Shop::addSqlAssociation('product', 'p', false).'
                                LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
                                        ON p.`id_product` = pl.`id_product`
                                        AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').'
                                LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product`)'.
                                Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1').'
                                LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')
                                LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`)
                                LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (product_shop.`id_tax_rules_group` = tr.`id_tax_rules_group`)
                                        AND tr.`id_country` = '.(int)Context::getContext()->country->id.'
                                        AND tr.`id_state` = 0
                                LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`)
                                '.Product::sqlStock('p').'
                                WHERE product_shop.`active` = 1
                                        AND p.`visibility` != \'none\'
                                        AND p.`id_product` IN ('.$ids.')
                                GROUP BY product_shop.id_product
                                ORDER BY '.(!empty($order_table) ? '`'.pSQL($order_table).'`.' : '').'`'.pSQL($order_by).'` '.pSQL($order_way).'
                                LIMIT '.(int)($page_number * $nb_products).', '.(int)$nb_products;

                $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);

                if ($final_order_by == 'price')
                        Tools::orderbyPrice($result, $order_way);
                if (!$result)
                        return false;
                return Product::getProductsProperties($id_lang, $result);
        }

        /*
        ** Get required informations on best sales products
        **
        ** @param integer $id_lang Language id
        ** @param integer $page_number Start from (optional)
        ** @param integer $nb_products Number of products to return (optional)
        ** @return array keys : id_product, link_rewrite, name, id_image, legend, sales, ean13, upc, link
        */
        public static function getBestSalesLight($id_lang, $page_number = 0, $nb_products = 10, Context $context = null)
        {
                if (!$context)
                        $context = Context::getContext();
                if ($page_number < 0) $page_number = 0;
                if ($nb_products < 1) $nb_products = 10;

                $groups = FrontController::getCurrentCustomerGroups();
                $sql_groups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1');

                //Subquery: get product ids in a separate query to (greatly!) improve performances and RAM usage
                $sql = 'SELECT cp.`id_product`
                FROM `'._DB_PREFIX_.'category_group` cg
                INNER JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
                WHERE cp.`id_product` IS NOT NULL AND cg.`id_group` '.$sql_groups.' AND cp.`id_product` IS NOT NULL';
                $products = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
                $ids = array();
                foreach ($products as $product)
                        $ids[$product['id_product']] = 1;
                $ids = array_keys($ids);
                sort($ids);
                $ids = array_filter($ids);
                $ids = count($ids) > 0 ? implode(',', $ids) : 'NULL';

                //Main query
                $sql = 'SELECT p.id_product, pl.`link_rewrite`, pl.`name`, pl.`description_short`, MAX(image_shop.`id_image`) id_image, il.`legend`,
                                        ps.`quantity` AS sales, p.`ean13`, p.`upc`, cl.`link_rewrite` AS category, p.show_price, p.available_for_order, p.quantity, p.customizable,
                                        IFNULL(pa.minimal_quantity, p.minimal_quantity) as minimal_quantity, p.out_of_stock
                                FROM `'._DB_PREFIX_.'product_sale` ps
                                LEFT JOIN `'._DB_PREFIX_.'product` p ON ps.`id_product` = p.`id_product`
                                '.Shop::addSqlAssociation('product', 'p').'
                                LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (ps.`id_product` = pa.`id_product` AND pa.default_on = 1)
                                LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
                                        ON p.`id_product` = pl.`id_product`
                                        AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').'
                                LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product`)'.
                                Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1').'
                                LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')
                                LEFT JOIN `'._DB_PREFIX_.'category_lang` cl
                                        ON cl.`id_category` = product_shop.`id_category_default`
                                        AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').'
                                WHERE product_shop.`active` = 1
                                        AND p.`visibility` != \'none\'
                                        AND p.`id_product` IN ('.$ids.')
                                GROUP BY product_shop.id_product
                                ORDER BY sales DESC
                                LIMIT '.(int)($page_number * $nb_products).', '.(int)$nb_products;

                if (!$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql))
                        return false;

                foreach ($result as &$row)
                {
                         $row['link'] = $context->link->getProductLink($row['id_product'], $row['link_rewrite'], $row['category'], $row['ean13']);
                         $row['id_image'] = Product::defineProductImage($row, $id_lang);
                        $row['allow_oosp'] = Product::isAvailableWhenOutOfStock($row['out_of_stock']);
                        $row['price_tax_exc'] = Product::getPriceStatic(
                                                (int)$row['id_product'],
                                                false,
                                                ((isset($row['id_product_attribute']) && !empty($row['id_product_attribute'])) ? (int)$row['id_product_attribute'] : null),
                                                (Product::$_taxCalculationMethod == PS_TAX_EXC ? 2 : 6)
                                        );
                }
                return $result;
        }

        public static function addProductSale($product_id, $qty = 1)
        {
                return Db::getInstance()->execute('
                        INSERT INTO '._DB_PREFIX_.'product_sale
                        (`id_product`, `quantity`, `sale_nbr`, `date_upd`)
                        VALUES ('.(int)$product_id.', '.(int)$qty.', 1, NOW())
                        ON DUPLICATE KEY UPDATE `quantity` = `quantity` + '.(int)$qty.', `sale_nbr` = `sale_nbr` + 1, `date_upd` = NOW()');
        }

        public static function getNbrSales($id_product)
        {
                $result = Db::getInstance()->getRow('SELECT `sale_nbr` FROM '._DB_PREFIX_.'product_sale WHERE `id_product` = '.(int)$id_product);
                if (!$result || empty($result) || !key_exists('sale_nbr', $result))
                        return -1;
                return (int)$result['sale_nbr'];
        }

        public static function removeProductSale($id_product, $qty = 1)
        {
                $total_sales = ProductSale::getNbrSales($id_product);
                if ($total_sales > 1)
                        return Db::getInstance()->execute('
                                UPDATE '._DB_PREFIX_.'product_sale
                                SET `quantity` = `quantity` - '.(int)$qty.', `sale_nbr` = `sale_nbr` - 1, `date_upd` = NOW()
                                WHERE `id_product` = '.(int)$id_product
                        );
                elseif ($total_sales == 1)
                        return Db::getInstance()->delete('product_sale', 'id_product = '.(int)$id_product);
                return true;
        }
}

Link to comment
Share on other sites

Estupendo, ahora sí que funciona.

 

Muchas gracias por tu ayuda.

 

Un placer ayudarte y servirte !

 

PD: Como he visto que has añadido la palabra "Solucionado" en el titulo del tema, procedo a cerrar el tema.

 

Saludos,

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...