Virginie_DF Posted May 21, 2014 Share Posted May 21, 2014 Bonjour, J'ai sur mon site une problématique assez complexe en terme de gestion des frais de port et de transporteurs. J'utilise un module qui me permet de gérer mes frais de port par code postaux et par transporteurs en fonction d'une tranche de poids. Jusque là tout va bien. Tout réagit parfaitement bien. Mais selon la taille de mes produits ou le nombre de produits mis au panier, je dois désactiver un transporteur (TNT en l’occurrence) J'ai donc assigné à mon transporteur TNT une limite de taille à 100cm et j'ai configuré les hauteur / largeur / profondeur de mes produits afin que, si on met au panier 1 produit X, il peut passer par TNT mais s'il y en a 2, il ne peut plus car la dimension dépasse 100cm (limite TNT) Hors ça ne fonctionne pas. Avez-vous déjà eu ce problème ? Comment l'avez-vous réglé ? Est-ce que cela peut venir du module installé (Qui se nomme "frais de port par code postaux") ? J'ai regardé sur le forum mais pas de réponse à ma question... Merci de votre aide. Link to comment Share on other sites More sharing options...
Virginie_DF Posted May 27, 2014 Author Share Posted May 27, 2014 Personne n'a de réponse ? Est-ce que Prestashop additionne les dimension des produits ? Merci de votre retour. Link to comment Share on other sites More sharing options...
pliciweb_stephane Posted June 5, 2014 Share Posted June 5, 2014 (edited) D'après mes recherches, sur Prestashop 1.5.6.1 effectivement l'organisation des colis ne semble pas convenir à votre besoin. L'algorithme est le suivant : Prestashop regarde que pour chaque produit il tienne bien dans les dimensions limites du transporteur. Mais il regarde produit par produit (sans même tenir compte de la quantité de ce produit). Donc, on est très loin de technique de "bin packing" (toujours d'après ce que j'ai pu voir dans le code) http://fr.wikipedia.org/wiki/Problème_de_bin_packing . Il existe des api/système pour gérer cela parfaitement, par exemple : http://www.3dbinpacking.com/ Donc, voici une modification que j'ai réalisée qui permet que : lors de la recherche d'un transporteur, pour un produit, il tienne compte des quantités. Par contre, si on met plusieurs gros produits différents ensemble mais qu'ils ne dépassent pas 1m par 1m par 1m(par exemple) en ayant un transporteur qui accepte 1.10m par 1.10 par 1.10m. Prestashop va toujours proposer le transporteur qui accepte le 1.1 par 1.1 par 1.1. Voici le code de notre amélioration (à placer dans /overide/classes/Carrier.php : <?php class Carrier extends CarrierCore { public static function getAvailableCarrierList(\Product $product, $id_warehouse, $id_address_delivery = null, $id_shop = null, $cart = null) { $carrier_list = parent::getAvailableCarrierList($product, $id_warehouse, $id_address_delivery, $id_shop, $cart); if (is_null($cart)) $cart = Context::getContext()->cart; if (is_object($cart)) { // on récupère les articles que l'on index par leur ID PRODUIT $cart_products = $cart->getProducts(); foreach($cart_products as $k => $cart_product) { unset($cart_products[$k]); $cart_products[$cart_product['id_product']] = $cart_product; } // on va tester chaque transporteur avec les tailles,hauteur,profondeur du produit foreach ($carrier_list as $key => $id_carrier) { $carrier = new Carrier($id_carrier); // on récupère la quantité de l'article dans le panier (cela peut jouer sur le choix du transporteur) $quantity = (isset($cart_products[$product->id]) && isset($cart_products[$product->id]['quantity'])?$cart_products[$product->id]['quantity'] : 1); // on calcul combien de fois on peut mettre ce produit dans la longueur,largeur, hauteur maximum du transporteur $carrier_space_calcultaed = false; $nb_box_in_this_box = 1; if ($carrier->max_width > 0 && $product->width > 0) { $nb_box_in_this_box = $nb_box_in_this_box * floor($carrier->max_width / $product->width); $carrier_space_calcultaed = true; } if ($carrier->max_height > 0 && $product->height > 0) { $nb_box_in_this_box = $nb_box_in_this_box * floor($carrier->max_height / $product->height); $carrier_space_calcultaed = true; } if ($carrier->max_depth > 0 && $product->depth > 0) { $nb_box_in_this_box = $nb_box_in_this_box * floor($carrier->max_depth / $product->depth); $carrier_space_calcultaed = true; } // si notre quantité ne tient pas dans la taille maximum du transporteur, on annul ce transporteur if ($carrier_space_calcultaed && !($quantity <= $nb_box_in_this_box)) unset($carrier_list[$key]); } } return $carrier_list; } } Si vous avez besoin d'une solution complète n'hésitez pas à nous contacter. Edited June 5, 2014 by pliciweb_stephane (see edit history) Link to comment Share on other sites More sharing options...
abondon Posted January 10, 2015 Share Posted January 10, 2015 Bonjour, Merci pour ce bout de code. Vous testez que les produits "rentrent" s'il y en a plusieurs de la même sorte ... mais quid du cas où j'ai plusieurs poduits différents? Est ce que les poids sont bien additionnés pour vérifier que cela est bien en dessous du poids limite? Comment sait on que ca va "rentrer", ne devrait il pas y avoir une dimension (par ex la profondeur) qui est celle que l'on additionne quand on a pusieurs items dans un colis? Y a t il une doc qui explique cela car je n'en ai pas trouvé? Merci de votre aide et bonne journée, AB Link to comment Share on other sites More sharing options...
pliciweb_stephane Posted January 12, 2015 Share Posted January 12, 2015 Bonjour, Ceci sous toute réserve et uniquement en l'état de ma connaissance actuelle: - Je ne crois pas qu'il y ait de doc - Le code fourni n'ajoute pas les produits différents - ce bout de script ne correspond qu'aux problème de dimension, pas des poids. En cas de besoin et uniquement par mp, nous sommes une agence spécialisée en développement sur Prestashop. Link to comment Share on other sites More sharing options...
Sapoak Posted June 27, 2016 Share Posted June 27, 2016 Bonjour, je tiens juste a préciser que le code ci-dessus est un exemple. Il ne fonctionne pas en l’état. Il y a beaucoup de correction et d’amélioration a apporter. Pliciweb a travers ce post veut simplement vous facturer une prestation. Ce n'est pas trop dans l'esprit forum... mais bon... C'est ainsi. Link to comment Share on other sites More sharing options...
Virginie_DF Posted June 27, 2016 Author Share Posted June 27, 2016 Bonjour Sapoak et merci de votre retour. Oui c'est tout à fait possible que ce ne soit qu'une partie du développement. En tout cas, je tiens juste à préciser que le correctif développé par Pliciweb remplit pleinement sa fonction depuis sa mise en place sur mon site. Je pense qu'ils ont juste voulu participer et aider la communauté en expliquant le problème. Je travaille avec eux depuis maintenant plus de 2 ans (donc bien avant ce post), ils sont très sérieux, pro-actifs, réactifs et sympas ! ;-). Merci en tout cas de votre vigilance ! Virginie Link to comment Share on other sites More sharing options...
pliciweb_stephane Posted June 28, 2016 Share Posted June 28, 2016 Bonjour sapoak, Le forum de Prestashop est un espace d'entraide entre tous les utilisateurs de Prestashop et nous avons voulu apporter une solution à Virginie. Ce n'est peut être pas la meilleure, et peut être qu'elle ne correspond pas à vos besoins, mais elle a le mérite d'apporter une réponse à un utilisateur dans le besoin. Je vous encourage à partager les corrections / améliorations que vous avez pu apporter afin que tout le monde puisse en profiter. Ce qui est le principe même de ce Forum et du mouvement de l'Open Source en général. Impatient de lire vos améliorations, je vous souhaite une bonne journée. Stéphane 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