Jump to content

Problème de commande sans statut


Shaun T

Recommended Posts

Bonjour à tous,

J'ai pas mal de problèmes en ce moment avec des commandes sans statut.

Cela se passe très souvent lorsqu'un bon de réduction est utilisé et que ce bon est d'un montant supérieur à la commande.

(cela devrait générer un 2e bon de réduction avec la différence mais là ça bloque, le bon initial n'est pas désactivé, la commande ne passe pas et un 2e bon est généré dans la foulée)

Voici mon erreur trouvé dans les logs : 

*ERROR*     2018/08/09 - 12:14:43: Duplicate entry '3368-3354' for key 'PRIMARY'<br /><br /><pre>
        INSERT INTO `ps_cart_rule_combination` (`id_cart_rule_1`, `id_cart_rule_2`)
        (SELECT 3368, IF(id_cart_rule_1 != 3361, id_cart_rule_1, id_cart_rule_2) FROM `ps_cart_rule_combination`
        WHERE `id_cart_rule_1` = 3361 OR `id_cart_rule_2` = 3361)</pre> at line 791 in file classes/db/Db.php

Je suis sous Prestashop 1.6.1.15.

Merci d'avance pour votre aide

Link to comment
Share on other sites

Vous avez un override sur cartrule ou payement module ?

Car normalement ca doit générer un nouveau bon avec un autre id alors que là il semblerait que cela veuille dupliquer l'existant. C'est possible mais dans ce cas il faut faire un update et non pas un insert.

Link to comment
Share on other sites

Merci pour votre retour !

Non je n'ai pas d'override sur ces cartrule et payement module.

Par contre j'en vois un sur cart.

Voici son contenu : 

class Cart extends CartCore
{
    /*
    * module: lgfreeshippingzones
    * date: 2017-02-11 16:45:37
    * version: 1.3.1
    */
    public function getPackageShippingCost(
        $id_carrier = null,
        $use_tax = true,
        Country $default_country = null,
        $product_list = null,
        $id_zone = null,
        $id_shop = null
    ) {
        if (Module::isInstalled('lgfreeshippingzones')) {
            if (!$id_zone) {
                $addr = new Address($this->id_address_delivery);
                if (Validate::isLoadedObject($addr)) {
                    $id_zone = State::getIdZone($addr->id_state);
                    if (!$id_zone) {
                        $id_zone = CountryCore::getIdZone($addr->id_country);
                    }
                }
            } if (!$id_zone && $default_country) {
                $id_zone = $default_country->id_zone;
            } if ($id_zone == false) {
                $id_zone = (int)(Configuration::get('PS_LGFREESHIPPINGZONES_DEFZONE'));
            }
            if ($id_carrier == false) {
                $id_carrier = (int)(Configuration::get('PS_LGFREESHIPPINGZONES_DEFCARRIER_ZONE'.$id_zone.''));
            }
            $cache_id = 'Cart::getPackageShippingCost'.md5($id_carrier.$use_tax.$id_zone);
            include_once(_PS_MODULE_DIR_.'lgfreeshippingzones/lgfreeshippingzones.php');
            $lgfsz = new LGFreeshippingzones();
            if ((int)Configuration::get('PS_LGFREESHIPPINGZONES_TAX') == 1) {
                if (
                    $lgfsz->FSCheck(
                        $id_zone,
                        $this->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING, null, null, false),
                        $this->getTotalWeight(),
                        $id_carrier,
                        $id_shop
                    )
                 ) {
                    $shipping_cost = 0;
                    Cache::store($cache_id, $shipping_cost);
                    return Cache::retrieve($cache_id);
                }
            } if ((int)Configuration::get('PS_LGFREESHIPPINGZONES_TAX') == 0) {
                if (
                    $lgfsz->FSCheck(
                        $id_zone,
                        $this->getOrderTotal(false, Cart::BOTH_WITHOUT_SHIPPING, null, null, false),
                        $this->getTotalWeight(),
                        $id_carrier,
                        $id_shop
                    )
                ) {
                    $shipping_cost = 0;
                    Cache::store($cache_id, $shipping_cost);
                    return Cache::retrieve($cache_id);
                }
            }
        }
        return parent::getPackageShippingCost($id_carrier, $use_tax, $default_country, $product_list, $id_shop);
    }
}

Merci pour votre aide.

Link to comment
Share on other sites

*ERROR*     2018/08/09 - 12:14:43: Duplicate entry '3368-3354' for key 'PRIMARY'<br /><br /><pre>
        INSERT INTO `ps_cart_rule_combination` (`id_cart_rule_1`, `id_cart_rule_2`)
        (SELECT 3368, IF(id_cart_rule_1 != 3361, id_cart_rule_1, id_cart_rule_2) FROM `ps_cart_rule_combination`
        WHERE `id_cart_rule_1` = 3361 OR `id_cart_rule_2` = 3361)</pre> at line 791 in file classes/db/Db.php

 

En fait je ne sais même pas comment ce problème peut arriver...

Nous sommes dans la fonction qui copie les propriétés de la première règle panier (3361) vers la nouvelle tout juste créée (3368)

Comment peut-il déjà avoir une combinaison de règle la concernant alors qu'elle vient d'être créée ???

La seule explication serait un nettoyage à l'arrache des règles panier (genre supprimées de ps_cart_rule mais pas de ps_cart_rule_combination) et on retombe sur d'anciennes données obsolètes.

Pour vous sortir de ce mauvais pas (à moins que vous ayez le temps de nettoyer correctement cette table) serait d'ajouter "IGNORE" dans la requête vers la ligne 223 de cartRule.php:

		INSERT INTO `'._DB_PREFIX_.'cart_rule_combination` (`id_cart_rule_1`, `id_cart_rule_2`)
		(SELECT '.(int)$id_cart_rule_destination.', IF(id_cart_rule_1 != '.(int)$id_cart_rule_source.', id_cart_rule_1, id_cart_rule_2) FROM `'._DB_PREFIX_.'cart_rule_combination`
		WHERE `id_cart_rule_1` = '.(int)$id_cart_rule_source.' OR `id_cart_rule_2` = '.(int)$id_cart_rule_source.')');

Deviendrait:

		INSERT IGNORE INTO `'._DB_PREFIX_.'cart_rule_combination` (`id_cart_rule_1`, `id_cart_rule_2`)
		(SELECT '.(int)$id_cart_rule_destination.', IF(id_cart_rule_1 != '.(int)$id_cart_rule_source.', id_cart_rule_1, id_cart_rule_2) FROM `'._DB_PREFIX_.'cart_rule_combination`
		WHERE `id_cart_rule_1` = '.(int)$id_cart_rule_source.' OR `id_cart_rule_2` = '.(int)$id_cart_rule_source.')');

Et non, pas grand monde a du avoir ce problème car peu de gens bidouillent leur base de données...

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...