Jump to content

Problème remise quantité et déclinaisons


Recommended Posts

Bonjour,

 

J'ai une boutique sous PS 1.4.9 et une boutique sous PS 1.5.4.

 

J'ai le même produit avec des déclinaisons sur lequel j'ai appliqué un prix spécifique dépendant de la quantité.

 

Sur la boutique PS 1.4.9, le prix spécifique s'applique sur le nombre total de produits mis dans le panier quel que soit la déclinaison.

 

Sur la boutique PS 1.5.4, le prix spécifique s'applique de façon indépendante sur chaque déclinaison de produit.

 

Je souhaiterais que ma boutique PS 1.5.4 fonctionne sur ce point de la même façon que la 1.4.9.

 

J'ai bien vu dans Préférences separator_breadcrumb.png Produits qu'on pouvait spécifier :

 

Remises des quantités basées sur : Produits ou Déclinaisons mais le résultat est le même.

 

Est-ce un bug , est-ce qu'il y a quelque chose qui m'échappe ?

 

Si ce n'est pas clair, je peux donner un exemple si besoin.

 

Merci d'avance.

Link to comment
Share on other sites

C'est très très embêtant pour ma boutique donc très simplement si quelqu'un peut faire le test suivant sous 1.5.4 :

 

Dans le back office :

1) créer un produit à 100€ avec 2 déclinaisons A et B qui ne jouent pas sur le prix

2) créer un prix spécifique 50€ à partir de 10 produits achetés

 

En front office :

Mettre dans le panier 5 produits avec déclinaison A et 5 produits avec déclinaison B

 

Dans mon cas, le produit reste à 100€ alors que je souhaiterais bien entendu qu'il passe à 50€.

 

Merci si vous avez une idée sinon je passe ça en bug car ça fonctionnait très bien en 1.4.9.

Link to comment
Share on other sites

Non, à ma grande surprise personne n'a répondu sur le forum alors que le bug est reproductible et que le souci est partiellement identifié. Je ne suis pas du tout développeur donc impossible de corriger le bug qui n'est peut être pas quelque chose de très complexe mais à vrai dire je n'en sais rien.

 

Je ne suis pas très doué en anglais mais je vais tâcher d'ajouter le problème dans le bug tracker.

 

Pour contourner le problème, même si ce n'est pas satisfaisant j'ai utilisé l'onglet règles panier qui permet de générer des codes promo que l'on peut directement intégrer dans le panier.

 

Au passage, même si je suis déçu de ne pas avoir eu de réponse de la team prestashop, je les félicite tout de même pour cette version 1.5.4 qui présente des avancées très intéressantes par rapport à la 1.4.9.

Link to comment
Share on other sites

Bonjour,

 

Je suis en 1.5.4.0 et je pense faire face au même souci : je dois mettre en vente des gels douche de 3 parfums différents, avec un prix unitaire + un prix pour un lot de 3, quelle que soit la combinaison de parfums.

 

J'avais repéré la fonction "déclinaisons" pour arriver à mes fins mais au final, si on commande 3 parfums (déclinisons) différentes, le prix unitaire est appliqué 3 fois. On n'obtient le prix du lot de 3 que si on met en panier 3 fois la même déclinaison.

 

Personne n'aurait une piste pour résoudre ce problème ?

Link to comment
Share on other sites

Oui, c'est un bug que j'ai ouvert ici :http://forge.prestashop.com/browse/PSCFV-8186

 

Pour la correction, fichier /classes/SpecificPrice.php, dans la methode getPricePrice(), remplacer $quantity par $real_quantity dans la requete

AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$quantity.' ,'.(int)$real_quantity.')' : 'AND `from_quantity` <= '

Pour obtenir

AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$real_quantity.' ,'.(int)$real_quantity.')' : 'AND `from_quantity` <= '

Link to comment
Share on other sites

bon, ben j'ai pas de bol, ça marche toujours pas... j'ai eu un espoir en lisant votre post sur forge : j'avais laissé "remises des quantités basées sur" à "produits", mais même en mettant "déclinaisons", ça ne fonctionne toujours pas correctement :-(

Link to comment
Share on other sites

Le report de bug a été fait sur la 1.5.3.

En 1.5.4.1, une modification du coeur fait que les quantités par produit ne fonctionnent pas, même avec la modification suggérée ci dessus.

 

Donc jusqu'à 1.5.4.0, appliquer la modification ci-dessus.

 

Pour 1.5.4.1, modif à faire dans le fichier /classes/Product.php, methode getPriceStatic(), il faut supprimer une ligne dans le block suivant :

  $cart_quantity = 0;
 if ((int)$id_cart)
 {
  $condition = '';
  $cache_name = (int)$id_cart.'_'.(int)$id_product.'_'.(int)$id_product_attribute;
  if (!isset(self::$_cart_quantity[$cache_name]) || self::$_cart_quantity[$cache_name] != (int)$quantity)
   self::$_cart_quantity[$cache_name] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
   SELECT SUM(`quantity`)
   FROM `'._DB_PREFIX_.'cart_product`
   WHERE `id_product` = '.(int)$id_product.'
   [color=#ff0000]AND `id_product_attribute` = '.(int)$id_product_attribute.'[/color]
   AND `id_cart` = '.(int)$id_cart);
  $cart_quantity = self::$_cart_quantity[$cache_name];
 }

 

pour obtenir :

  $cart_quantity = 0;
 if ((int)$id_cart)
 {
  $condition = '';
  $cache_name = (int)$id_cart.'_'.(int)$id_product.'_'.(int)$id_product_attribute;
  if (!isset(self::$_cart_quantity[$cache_name]) || self::$_cart_quantity[$cache_name] != (int)$quantity)
   self::$_cart_quantity[$cache_name] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
   SELECT SUM(`quantity`)
   FROM `'._DB_PREFIX_.'cart_product`
   WHERE `id_product` = '.(int)$id_product.'
   AND `id_cart` = '.(int)$id_cart);
  $cart_quantity = self::$_cart_quantity[$cache_name];
 }

Link to comment
Share on other sites

BOnjour,

Je suis en 1.5.4.1 et je rencontre encore le problème même en ayant appliquer le patch de la Forge (http://forge.prestas...owse/PSCFV-8186)

Ce qui est curieux, c'est qu'il semble y avoir un pb de cache qq part, ça marche... puis on remplit un panier... ça marche plus... c bizare.. ça fait 4 heures que je suis la dessus...

Ce code me renvoit toujours le prix en qté 1 ! :

$idProduct=82;
$product=new Product($idProduct,2);
$idProductAttribute=$product->getDefaultAttribute($idProduct);
$qty=1000;
$unitWithoutTaxesPrice=Product::getPriceStatic(
 $idProduct,
 false,
 $idProductAttribute,
 2,
 null,
 false,
 true,
 $qty,
 false,
 null,
 null,
 null,
 $specific_price,
 true,
 true,
 Context::getContext()
);
echo $unitWithoutTaxesPrice;

 

 

Help ?

VIns;

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

Suite à mon dernier message je viens de réussir à reproduire le bug...

Le code précédemment cité :

$idProduct=82;
$product=new Product($idProduct,2);
$idProductAttribute=$product->getDefaultAttribute($idProduct);
$qty=1000;
$unitWithoutTaxesPrice=Product::getPriceStatic(
 $idProduct,
 false,
 $idProductAttribute,
 2,
 null,
 false,
 true,
 $qty,
 false,
 null,
 null,
 null,
 $specific_price,
 true,
 true,
 Context::getContext()
);
echo $unitWithoutTaxesPrice;

 

fonctionne si et seulement si on est logué sur le site ! A noter que j'ai corrigé la fonction getPriceStatic() dans Product.php suivant le bugTracker.

 

Quelqu'un a t-il une idée ?

Link to comment
Share on other sites

En effet... si on applique l'une ou l'autre des solutions, ça ne fonctionne pas. Il faut appliquer les deux.

 

Je suis en 1.5.4 et voici ce que j'ai modifié :

 

-> Dans classes/SpecificPrice.php > function getSpecificPrice()

 

Remplacer l'avant dernière ligne de la requète SQL par :

 

(($real_quantity != 0 && !Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION')) ? ' AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$quantity.' ,'.(int)$real_quantity.')' : 'AND `from_quantity` <= '.(int)$quantity).'

 

 

-> Dans classes/Product.php > function getPriceStatic()

Dans la première requête SQL que vous voyez (vers lignes 2460/2470 environ) supprimez la condition "AND `id_product_attribute` = '.(int)$id_product_attribute.'" de la clause WHERE pour avoir donc :

 

 

self::$_cart_quantity[$cache_name] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('

SELECT SUM(`quantity`)

FROM `'._DB_PREFIX_.'cart_product`

WHERE `id_product` = '.(int)$id_product.'

 

AND `id_cart` = '.(int)$id_cart);

 

 

 

Et chez moi ça fonctionne nickel maintenant, connecté ou pas connecté !

  • Like 1
Link to comment
Share on other sites

MErci Mephistom,

Pour mon cas le problème était ailleurs. En fait, notre Presta a été upadaté récemment d'une version 1.3 à la 1.5.4.1 et dans la table SQL des prix dégressifs (ps_specific_price) les champs id_group étaient tous réglés à 1. Résultat, si tu n'étais pas logué, le prix dégressifs ne s'appliquait pas.

Si qq rencontre le même soucis, il faut donc aller dans la table ps_specific_price et passer tous les 1 à 0 dans le colonne id_group.

Vins.

Link to comment
Share on other sites

  • 2 weeks later...

Un peu dans le même style mais différent : dans le back office "aucun" prix spécifique de déclaré et pourtant s'affichent dans certains produits.

 

Je suis allée dans la table ps_specific_price et j'ai supprimé les 10 lignes de prix spécifiques.

 

Petite info au passage, les prix "spécifiques" s'affichent en prix "dégressifs" dans le front.

Link to comment
Share on other sites

  • 2 months later...

Bonjour

 

je reviens sur ce post,

 

apres avoir installer le module a jour FO Quantity price d'Olea pour mon PS 1.5.4.1 je vois dans les parametres du modules les modifications a faire en cas de prix identique

 

Suivant version de Prestashop, il se peut que les prix par quantité dans les tables de déclinaisons du Front-Office soient tous identiques.

Il est reporté ici : http://www.prestasho...ost__p__1204700

Pour le corriger :

- Ouvrez le fichier /classes/SpecificPrice.php

- Cherchez la ligne suivant dans la méthode getSpecificPrices() :

(($real_quantity != 0 && !Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION')) ? ' AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$quantity.' ,'.(int)$real_quantity.')' : 'AND `from_quantity` <= '.(int)$real_quantity).'

- Modifiez-la en remplaçant le $quantity par $real_quantity

(($real_quantity != 0 && !Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION')) ? ' AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)/*$quantity*/ ((int)$id_cart ? (int)$quantity : (int)$real_quantity ).' ,'.(int)$real_quantity.')' : 'AND `from_quantity` <= '.(int)$real_quantity).'

 

j'applique les 2 modifications et j'obtiens une belle erreur 500 :wacko:

 

bien sur en bon bourrin, je n'est pas fais de sauvegarde du fichier original, donc pas de retour en arriere

 

je decide d'appliquer les modifications de Mephistom (15) et celle de rGaillard mais sans succés

 

 

comment puis je retrouver les fichiers d'origines

classes/SpecificPrice.php

classes/Product.php

 

 

le probleme n'est pas de resoudre le bug, mais de remettre mon site en ligne

 

Merci a tous

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

  • 3 months later...

En effet... si on applique l'une ou l'autre des solutions, ça ne fonctionne pas. Il faut appliquer les deux.

 

Je suis en 1.5.4 et voici ce que j'ai modifié :

 

-> Dans classes/SpecificPrice.php > function getSpecificPrice()

 

Remplacer l'avant dernière ligne de la requète SQL par :

 

(($real_quantity != 0 && !Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION')) ? ' AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$quantity.' ,'.(int)$real_quantity.')' : 'AND `from_quantity` <= '.(int)$quantity).'

 

 

-> Dans classes/Product.php > function getPriceStatic()

Dans la première requête SQL que vous voyez (vers lignes 2460/2470 environ) supprimez la condition "AND `id_product_attribute` = '.(int)$id_product_attribute.'" de la clause WHERE pour avoir donc :

 

 

self::$_cart_quantity[$cache_name] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('

SELECT SUM(`quantity`)

FROM `'._DB_PREFIX_.'cart_product`

WHERE `id_product` = '.(int)$id_product.'

 

AND `id_cart` = '.(int)$id_cart);

 

 

 

Et chez moi ça fonctionne nickel maintenant, connecté ou pas connecté !

Bonjour

je suis en 1.5.6.1 et j'ais également le problème de remise quantité qui n'est pas prix en compte. j'ais bien lu le post mais n'étant pas très qualifié je ne sais pas comment déterminer l'avant dernière ligne de la requête sql.

pourriez vous m'aider à la déterminer. j'aimerais essayer cette solution en éspèrant que cela résolve mon problème et que je puisse enfin appliqué des tarifs degressifs

merci par avance

cdlt

Link to comment
Share on other sites

  • 2 weeks later...

Bonjour

je suis en 1.5.6.1 et j'ais également le problème de remise quantité qui n'est pas prix en compte. j'ais bien lu le post mais n'étant pas très qualifié je ne sais pas comment déterminer l'avant dernière ligne de la requête sql.

pourriez vous m'aider à la déterminer. j'aimerais essayer cette solution en éspèrant que cela résolve mon problème et que je puisse enfin appliqué des tarifs degressifs

merci par avance

cdlt

Bonjour,

 

Peux-tu mettre ici ta requête complète pour voir ce qu'il faut modifier ?

Link to comment
Share on other sites

classe/specific price

 

<?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 SpecificPriceCore extends ObjectModel
{
    public    $id_product;
    public    $id_specific_price_rule = 0;
    public    $id_cart = 0;
    public    $id_product_attribute;
    public    $id_shop;
    public    $id_shop_group;
    public    $id_currency;
    public    $id_country;
    public    $id_group;
    public    $id_customer;
    public    $price;
    public    $from_quantity;
    public    $reduction;
    public    $reduction_type;
    public    $from;
    public    $to;

    /**
     * @see ObjectModel::$definition
     */
    public static $definition = array(
        'table' => 'specific_price',
        'primary' => 'id_specific_price',
        'fields' => array(
            'id_shop_group' =>             array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
            'id_shop' =>                 array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
            'id_cart' =>             array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
            'id_product' =>             array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
            'id_product_attribute' =>     array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
            'id_currency' =>             array('type' => self::TYPE_INT, 'required' => true),
            'id_specific_price_rule' =>    array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
            'id_country' =>             array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
            'id_group' =>                 array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
            'id_customer' =>             array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
            'price' =>                     array('type' => self::TYPE_FLOAT, 'validate' => 'isNegativePrice', 'required' => true),
            'from_quantity' =>             array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true),
            'reduction' =>                 array('type' => self::TYPE_FLOAT, 'validate' => 'isPrice', 'required' => true),
            'reduction_type' =>         array('type' => self::TYPE_STRING, 'validate' => 'isReductionType', 'required' => true),
            'from' =>                     array('type' => self::TYPE_DATE, 'validate' => 'isDateFormat', 'required' => true),
            'to' =>                     array('type' => self::TYPE_DATE, 'validate' => 'isDateFormat', 'required' => true),
        ),
    );

    protected $webserviceParameters = array(
        'objectsNodeName' => 'specific_prices',
        'objectNodeName' => 'specific_price',
            'fields' => array(
            'id_shop_group' =>             array('xlink_resource' => 'shop_groups'),
            'id_shop' =>                 array('xlink_resource' => 'shops', 'required' => true),
            'id_cart' =>                 array('xlink_resource' => 'carts', 'required' => true),
            'id_product' =>             array('xlink_resource' => 'products', 'required' => true),
            'id_product_attribute' =>         array('xlink_resource' => 'product_attributes'),
            'id_currency' =>             array('xlink_resource' => 'currencies', 'required' => true),
            'id_country' =>             array('xlink_resource' => 'countries', 'required' => true),
            'id_group' =>                 array('xlink_resource' => 'groups', 'required' => true),
            'id_customer' =>             array('xlink_resource' => 'customers', 'required' => true),
              ),
    );


    protected static $_specificPriceCache = array();
    protected static $_cache_priorities = array();

    public function add($autodate = true, $nullValues = false)
    {
        if (parent::add($autodate, $nullValues))
        {
            // Flush cache when we adding a new specific price
            SpecificPrice::$_specificPriceCache = array();
            Product::flushPriceCache();
            // Set cache of feature detachable to true
            Configuration::updateGlobalValue('PS_SPECIFIC_PRICE_FEATURE_ACTIVE', '1');
            return true;
        }
        return false;
    }

    public function update($null_values = false)
    {
        if (parent::update($null_values))
        {
            // Flush cache when we updating a new specific price
            SpecificPrice::$_specificPriceCache = array();
            Product::flushPriceCache();
            return true;
        }
        return false;
    }

    public function delete()
    {
        if (parent::delete())
        {
            // Flush cache when we deletind a new specific price
            SpecificPrice::$_specificPriceCache = array();
            Product::flushPriceCache();
            // Refresh cache of feature detachable
            Configuration::updateGlobalValue('PS_SPECIFIC_PRICE_FEATURE_ACTIVE', SpecificPrice::isCurrentlyUsed($this->def['table']));
            return true;
        }
        return false;
    }

    public static function getByProductId($id_product, $id_product_attribute = false, $id_cart = false)
    {
        return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
            SELECT *
            FROM `'._DB_PREFIX_.'specific_price`
            WHERE `id_product` = '.(int)$id_product.
            ($id_product_attribute ? ' AND id_product_attribute = '.(int)$id_product_attribute : '').'
            AND id_cart = '.(int)$id_cart);
    }

    public static function deleteByIdCart($id_cart, $id_product = false, $id_product_attribute = false)
    {
        return Db::getInstance()->execute('
            DELETE FROM `'._DB_PREFIX_.'specific_price`
            WHERE id_cart='.(int)$id_cart.
            ($id_product ? ' AND id_product='.(int)$id_product.' AND id_product_attribute='.(int)$id_product_attribute : ''));
    }

    public static function getIdsByProductId($id_product, $id_product_attribute = false, $id_cart = 0)
    {
        return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
            SELECT `id_specific_price`
            FROM `'._DB_PREFIX_.'specific_price`
            WHERE `id_product` = '.(int)$id_product.'
            AND id_product_attribute='.(int)$id_product_attribute.'
            AND id_cart='.(int)$id_cart);
    }

    /**
     * score generation for quantity discount
     */
    protected static function _getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group, $id_customer)
    {
        $select = '(';

       $now = date('Y-m-d H:i:s');
       $select .= ' IF (\''.$now.'\' >= `from` AND \''.$now.'\' <= `to`, '.pow(2, 0).', 0) + ';

        $priority = SpecificPrice::getPriority($id_product);
        foreach (array_reverse($priority) as $k => $field)
            if (!empty($field))
                $select .= ' IF (`'.bqSQL($field).'` = '.(int)$$field.', '.pow(2, $k + 1).', 0) + ';

        return rtrim($select, ' +').') AS `score`';
    }

    public static function getPriority($id_product)
    {
        if (!SpecificPrice::isFeatureActive())
            return explode(';', Configuration::get('PS_SPECIFIC_PRICE_PRIORITIES'));

        if (!isset(SpecificPrice::$_cache_priorities[(int)$id_product]))
        {
            SpecificPrice::$_cache_priorities[(int)$id_product] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
                SELECT `priority`, `id_specific_price_priority`
                FROM `'._DB_PREFIX_.'specific_price_priority`
                WHERE `id_product` = '.(int)$id_product.'
                ORDER BY `id_specific_price_priority` DESC
            ');
        }

        $priority = SpecificPrice::$_cache_priorities[(int)$id_product];

        if (!$priority)
            $priority = Configuration::get('PS_SPECIFIC_PRICE_PRIORITIES');
        $priority = 'id_customer;'.$priority;

        return preg_split('/;/', $priority);
    }

    public static function getSpecificPrice($id_product, $id_shop, $id_currency, $id_country, $id_group, $quantity, $id_product_attribute = null, $id_customer = 0, $id_cart = 0, $real_quantity = 0)
    {
        if (!SpecificPrice::isFeatureActive())
            return array();
        /*
        ** The date is not taken into account for the cache, but this is for the better because it keeps the consistency for the whole script.
        ** The price must not change between the top and the bottom of the page
        */

        $key = ((int)$id_product.'-'.(int)$id_shop.'-'.(int)$id_currency.'-'.(int)$id_country.'-'.(int)$id_group.'-'.(int)$quantity.'-'.(int)$id_product_attribute.'-'.(int)$id_cart.'-'.(int)$id_customer.'-'.(int)$real_quantity);
        if (!array_key_exists($key, SpecificPrice::$_specificPriceCache))
        {
            $now = date('Y-m-d H:i:s');
            $query = '
            SELECT *, '.SpecificPrice::_getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group, $id_customer).'
                FROM `'._DB_PREFIX_.'specific_price`
                WHERE `id_product` IN (0, '.(int)$id_product.')
                AND `id_product_attribute` IN (0, '.(int)$id_product_attribute.')
                AND `id_shop` IN (0, '.(int)$id_shop.')
                AND `id_currency` IN (0, '.(int)$id_currency.')
                AND `id_country` IN (0, '.(int)$id_country.')
                AND `id_group` IN (0, '.(int)$id_group.')
                AND `id_customer` IN (0, '.(int)$id_customer.')
                AND
                (
                    (`from` = \'0000-00-00 00:00:00\' OR \''.$now.'\' >= `from`)
                    AND
                    (`to` = \'0000-00-00 00:00:00\' OR \''.$now.'\' <= `to`)
                )
                AND id_cart IN (0, '.(int)$id_cart.') ';

            if ($real_quantity != 0 && !Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION'))
                $query .= ' AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$quantity.' ,'.(int)$real_quantity.')';
            else
            {
                $qty_to_use = $id_cart ? (int)$quantity : (int)$real_quantity;
                $query .= 'AND `from_quantity` <= '.max(1, $qty_to_use);
            }

            $query .= ' ORDER BY `id_product_attribute` DESC, `from_quantity` DESC, `id_specific_price_rule` ASC, `score` DESC';
            
            SpecificPrice::$_specificPriceCache[$key] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($query);
                
        }
        return SpecificPrice::$_specificPriceCache[$key];
    }

    public static function setPriorities($priorities)
    {
        $value = '';
        if (is_array($priorities))
            foreach ($priorities as $priority)
                $value .= pSQL($priority).';';

        SpecificPrice::deletePriorities();

        return Configuration::updateValue('PS_SPECIFIC_PRICE_PRIORITIES', rtrim($value, ';'));
    }

    public static function deletePriorities()
    {
        return Db::getInstance()->execute('
        TRUNCATE `'._DB_PREFIX_.'specific_price_priority`
        ');
    }

    public static function setSpecificPriority($id_product, $priorities)
    {
        $value = '';
        foreach ($priorities as $priority)
            $value .= pSQL($priority).';';

        return Db::getInstance()->execute('
        INSERT INTO `'._DB_PREFIX_.'specific_price_priority` (`id_product`, `priority`)
        VALUES ('.(int)$id_product.',\''.pSQL(rtrim($value, ';')).'\')
        ON DUPLICATE KEY UPDATE `priority` = \''.pSQL(rtrim($value, ';')).'\'
        ');
    }

    public static function getQuantityDiscounts($id_product, $id_shop, $id_currency, $id_country, $id_group, $id_product_attribute = null, $all_combinations = false, $id_customer = 0)
    {
        if (!SpecificPrice::isFeatureActive())
            return array();

        $now = date('Y-m-d H:i:s');
        $res = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
            SELECT *,
                    '.SpecificPrice::_getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group, $id_customer).'
            FROM `'._DB_PREFIX_.'specific_price`
            WHERE
                    `id_product` IN(0, '.(int)$id_product.') AND
                    '.(!$all_combinations ? '`id_product_attribute` IN(0, '.(int)$id_product_attribute.') AND ' : '').'
                    `id_shop` IN(0, '.(int)$id_shop.') AND
                    `id_currency` IN(0, '.(int)$id_currency.') AND
                    `id_country` IN(0, '.(int)$id_country.') AND
                    `id_group` IN(0, '.(int)$id_group.') AND
                    `id_customer` IN(0, '.(int)$id_customer.')
                    AND
                    (
                        (`from` = \'0000-00-00 00:00:00\' OR \''.$now.'\' >= `from`)
                        AND
                        (`to` = \'0000-00-00 00:00:00\' OR \''.$now.'\' <= `to`)
                    )
                    ORDER BY `id_product_attribute` DESC, `from_quantity` DESC, `id_specific_price_rule` ASC, `score` DESC
        ');

        $targeted_prices = array();
        $last_quantity = array();

        foreach ($res as $specific_price)
        {
            if (!isset($last_quantity[(int)$specific_price['id_product_attribute']]))
                 $last_quantity[(int)$specific_price['id_product_attribute']] = $specific_price['from_quantity'];
            elseif ($last_quantity[(int)$specific_price['id_product_attribute']] == $specific_price['from_quantity'])
                continue;

            $last_quantity[(int)$specific_price['id_product_attribute']] = $specific_price['from_quantity'];
            if ($specific_price['from_quantity'] > 1)
                $targeted_prices[] = $specific_price;
        }

        return $targeted_prices;
    }

    public static function getQuantityDiscount($id_product, $id_shop, $id_currency, $id_country, $id_group, $quantity, $id_product_attribute = null, $id_customer = 0)
    {
        if (!SpecificPrice::isFeatureActive())
            return array();

        $now = date('Y-m-d H:i:s');
        return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
            SELECT *,
                    '.SpecificPrice::_getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group, $id_customer).'
            FROM `'._DB_PREFIX_.'specific_price`
            WHERE
                    `id_product` IN(0, '.(int)$id_product.') AND
                    `id_product_attribute` IN(0, '.(int)$id_product_attribute.') AND
                    `id_shop` IN(0, '.(int)$id_shop.') AND
                    `id_currency` IN(0, '.(int)$id_currency.') AND
                    `id_country` IN(0, '.(int)$id_country.') AND
                    `id_group` IN(0, '.(int)$id_group.') AND
                    `id_customer` IN(0, '.(int)$id_customer.') AND
                    `from_quantity` >= '.(int)$quantity.'
                    AND
                    (
                        (`from` = \'0000-00-00 00:00:00\' OR \''.$now.'\' >= `from`)
                        AND
                        (`to` = \'0000-00-00 00:00:00\' OR \''.$now.'\' <= `to`)
                    )
                    ORDER BY `from_quantity` DESC, `score` DESC
        ');
    }

    public static function getProductIdByDate($id_shop, $id_currency, $id_country, $id_group, $beginning, $ending, $id_customer = 0, $with_combination_id = false)
    {
        if (!SpecificPrice::isFeatureActive())
            return array();

        $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
            SELECT `id_product`, `id_product_attribute`
            FROM `'._DB_PREFIX_.'specific_price`
            WHERE    `id_shop` IN(0, '.(int)$id_shop.') AND
                    `id_currency` IN(0, '.(int)$id_currency.') AND
                    `id_country` IN(0, '.(int)$id_country.') AND
                    `id_group` IN(0, '.(int)$id_group.') AND
                    `id_customer` IN(0, '.(int)$id_customer.') AND
                    `from_quantity` = 1 AND
                    (
                        (`from` = \'0000-00-00 00:00:00\' OR \''.pSQL($beginning).'\' >= `from`)
                        AND
                        (`to` = \'0000-00-00 00:00:00\' OR \''.pSQL($ending).'\' <= `to`)
                    )
                    AND
                    `reduction` > 0
        ', false);
        $ids_product = array();
        while ($row = Db::getInstance()->nextRow($result))
            $ids_product[] = $with_combination_id ? array('id_product' => (int)$row['id_product'], 'id_product_attribute' => (int)$row['id_product_attribute']) : (int)$row['id_product'];
        return $ids_product;
    }

    public static function deleteByProductId($id_product)
    {
        if (Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'specific_price` WHERE `id_product` = '.(int)$id_product))
        {
            // Refresh cache of feature detachable
            Configuration::updateGlobalValue('PS_SPECIFIC_PRICE_FEATURE_ACTIVE', SpecificPrice::isCurrentlyUsed('specific_price'));
            return true;
        }
        return false;
    }

    public function duplicate($id_product = false)
    {
        if ($id_product)
            $this->id_product = (int)$id_product;
        unset($this->id);
        return $this->add();
    }

    /**
     * This method is allow to know if a feature is used or active
     * @since 1.5.0.1
     * @return bool
     */
    public static function isFeatureActive()
    {
        static $feature_active = null;

        if ($feature_active === null)
            $feature_active = Configuration::get('PS_SPECIFIC_PRICE_FEATURE_ACTIVE');
        return $feature_active;
    }
    
    public static function exists($id_product, $id_product_attribute, $id_shop, $id_group, $id_country, $id_currency, $id_customer, $from_quantity, $from, $to, $rule = false)
    {
        $rule = ' AND `id_specific_price_rule`'.(!$rule ? '=0' : '!=0');
        return (int)Db::getInstance()->getValue('SELECT `id_specific_price`
                                                                FROM '._DB_PREFIX_.'specific_price
                                                                WHERE `id_product`='.(int)$id_product.' AND
                                                                    `id_product_attribute`='.(int)$id_product_attribute.' AND
                                                                    `id_shop`='.(int)$id_shop.' AND
                                                                    `id_group`='.(int)$id_group.' AND
                                                                    `id_country`='.(int)$id_country.' AND
                                                                    `id_currency`='.(int)$id_currency.' AND
                                                                    `id_customer`='.(int)$id_customer.' AND
                                                                    `from_quantity`='.(int)$from_quantity.' AND
                                                                    `from` >= \''.pSQL($from).'\' AND
                                                                     `to` <= \''.pSQL($to).'\''.$rule);
    }
}
 

Link to comment
Share on other sites

bonjour

désolé je ne savais pas quelle partie je devais mettre j'ais donc mis le fichier complet.

par contre as tu besoin aussi du fichier product.php ?

 

merci

Non, pas besoin.

 

C'est ici qu'il faut changer (fait une copie de ce fichier avant toute modif bien sur)

 

   public static function getSpecificPrice($id_product, $id_shop, $id_currency, $id_country, $id_group, $quantity, $id_product_attribute = null, $id_customer = 0, $id_cart = 0, $real_quantity = 0)

    {

        if (!SpecificPrice::isFeatureActive())

            return array();

        /*

        ** The date is not taken into account for the cache, but this is for the better because it keeps the consistency for the whole script.

        ** The price must not change between the top and the bottom of the page

        */

 

        $key = ((int)$id_product.'-'.(int)$id_shop.'-'.(int)$id_currency.'-'.(int)$id_country.'-'.(int)$id_group.'-'.(int)$quantity.'-'.(int)$id_product_attribute.'-'.(int)$id_cart.'-'.(int)$id_customer.'-'.(int)$real_quantity);

        if (!array_key_exists($key, SpecificPrice::$_specificPriceCache))

        {

            $now = date('Y-m-d H:i:s');

            $query = '

            SELECT *, '.SpecificPrice::_getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group, $id_customer).'

                FROM `'._DB_PREFIX_.'specific_price`

                WHERE `id_product` IN (0, '.(int)$id_product.')

                AND `id_product_attribute` IN (0, '.(int)$id_product_attribute.')

                AND `id_shop` IN (0, '.(int)$id_shop.')

                AND `id_currency` IN (0, '.(int)$id_currency.')

                AND `id_country` IN (0, '.(int)$id_country.')

                AND `id_group` IN (0, '.(int)$id_group.')

                AND `id_customer` IN (0, '.(int)$id_customer.')

                AND

                (

                    (`from` = \'0000-00-00 00:00:00\' OR \''.$now.'\' >= `from`)

                    AND

                    (`to` = \'0000-00-00 00:00:00\' OR \''.$now.'\' <= `to`)

                )

                AND id_cart IN (0, '.(int)$id_cart.') ';

 

            if ($real_quantity != 0 && !Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION'))

                $query .= ' AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$quantity.' ,'.(int)$real_quantity.')';

            else

            {

                $qty_to_use = $id_cart ? (int)$quantity : (int)$real_quantity;

                $query .= 'AND `from_quantity` <= '.max(1, $qty_to_use);

            }

 

            $query .= ' ORDER BY `id_product_attribute` DESC, `from_quantity` DESC, `id_specific_price_rule` ASC, `score` DESC';

            

            SpecificPrice::$_specificPriceCache[$key] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($query);

                

        }

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

je remplace la phrase en rouge par :

 

(($real_quantity != 0 && !Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION')) ? ' AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$quantity.' ,'.(int)$real_quantity.')' : 'AND `from_quantity` <= '.(int)$quantity).'

 

c'est bien ca ?

Link to comment
Share on other sites

j'ais remplacé les lignes, résultat c'est la page blanche sur le site. tout est bloqué

Remet le fichier que tu as sauvegardé avant et tu n'auras plus de page blanche.

 

Si ce code ne fonctionne pas, alors il faut voir avec la personne (Mephistom) qui a suggéré ce code...

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...