Jump to content

Recommended Posts

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

  • 2 weeks later...

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 by pliciweb_stephane (see edit history)
Link to comment
Share on other sites

  • 7 months later...

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

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

  • 1 year later...

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

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

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

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