Shaun T Posted August 16, 2018 Share Posted August 16, 2018 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 More sharing options...
Eolia Posted August 16, 2018 Share Posted August 16, 2018 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 More sharing options...
Shaun T Posted August 16, 2018 Author Share Posted August 16, 2018 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 More sharing options...
Eolia Posted August 16, 2018 Share Posted August 16, 2018 non celle-ci ne concerne pas les cart_rules Que dit la modification de fichiers dans Paramètres avancés ->Informations ? Link to comment Share on other sites More sharing options...
Shaun T Posted August 16, 2018 Author Share Posted August 16, 2018 Fichiers modifiés (5) admin..../autoupgrade/index.php classes/controller/AdminController.php classes/stock/StockAvailable.php config/config.inc.php config/defines.inc.php Link to comment Share on other sites More sharing options...
Eolia Posted August 16, 2018 Share Posted August 16, 2018 Curieux... Et aucun override sur les contrôleurs non plus ? Link to comment Share on other sites More sharing options...
Shaun T Posted August 16, 2018 Author Share Posted August 16, 2018 Si sur classes/FrontController.php FrontController.php Link to comment Share on other sites More sharing options...
Eolia Posted August 16, 2018 Share Posted August 16, 2018 Non plus (mais là ce n'est plus un override mais carrément le controleur au complet^^) Link to comment Share on other sites More sharing options...
Shaun T Posted August 16, 2018 Author Share Posted August 16, 2018 Quelqu'un a déjà eu ce problème svp?? Link to comment Share on other sites More sharing options...
Eolia Posted August 16, 2018 Share Posted August 16, 2018 *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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now