Jump to content

[Résolu] Frais de port / problème


Recommended Posts

Bonjour,

Je rencontre un problème avec les frais de port, je vous explique:

Je souhaite avoir pour la FRANCE 3 transporteurs:

1) colissimo standard
2) colissimo recommandé
3) chronopost

Jusqu'ici pas de problème, je crée mes 3 transporteurs avec leur fourchette de poids & prix.

Mais voila, actuellement j'offre les frais de ports a partir de 149 € d'achat.

Bien sur j'offre les frais de port que pour le colissimo standard (le moins cher )

Hors, lorsque mon panier arrive a + de 149 € ces 3 transporteurs suivants deviennent gratuit.

Comment faire pour que le colissimo standard passe en gratuit, pendant que les autres affiche toujours leur tarifs réel ?

*Dommage que la classe "offrir les frais de port à partir de ...." ne soit pas unique pour chaque transporteur*

Merci pour votre aide

Cordialement

Link to comment
Share on other sites

Il est possible de configurer le prix de ta livraison par tranche de prix et donc tu peu ainsi avoir des ports gratuit pour des prix differents en fonction du transporteur.

Perso j'utilise ca chez moi pour les differents pays, mais j'ai un tarif unique de livraison !

Par contre je ne suis pas sur que ce soit compatible avec les tranches de poids ? Qulequ'un a-t-il essayé ?

Link to comment
Share on other sites

Il est possible de configurer le prix de ta livraison par tranche de prix et donc tu peu ainsi avoir des ports gratuit pour des prix differents en fonction du transporteur.

Perso j'utilise ca chez moi pour les differents pays, mais j'ai un tarif unique de livraison !

Par contre je ne suis pas sur que ce soit compatible avec les tranches de poids ? Qulequ'un a-t-il essayé ?


Je trouve que en fonction du prix c'est trop aléatoire, j'ai des articles cher, mais léger, et vice et versa :(
Link to comment
Share on other sites

C'est très simple à modifier :

editer classes/cart.php lignes 684 , exemple ici la gratuité s'appliquera uniquement au transporteur par défaut que vous avez coché dans votre BO :

// Free fees
       if (isset($configuration['PS_SHIPPING_FREE_PRICE']) AND $orderTotal >= floatval($configuration['PS_SHIPPING_FREE_PRICE']) AND floatval($configuration['PS_SHIPPING_FREE_PRICE']) > 0     and Configuration::get('PS_CARRIER_DEFAULT')==$id_carrier)
           return $shipping_cost;
       if (isset($configuration['PS_SHIPPING_FREE_WEIGHT']) AND $this->getTotalWeight() >= floatval($configuration['PS_SHIPPING_FREE_WEIGHT']) AND floatval($configuration['PS_SHIPPING_FREE_WEIGHT']) > 0  and Configuration::get('PS_CARRIER_DEFAULT')==$id_carrier )
           return $shipping_cost;

Link to comment
Share on other sites

C'est très simple à modifier :

editer classes/cart.php lignes 684 , exemple ici la gratuité s'appliquera uniquement au transporteur par défaut que vous avez coché dans votre BO :
// Free fees
       if (isset($configuration['PS_SHIPPING_FREE_PRICE']) AND $orderTotal >= floatval($configuration['PS_SHIPPING_FREE_PRICE']) AND floatval($configuration['PS_SHIPPING_FREE_PRICE']) > 0     and Configuration::get('PS_CARRIER_DEFAULT')==$id_carrier)
           return $shipping_cost;
       if (isset($configuration['PS_SHIPPING_FREE_WEIGHT']) AND $this->getTotalWeight() >= floatval($configuration['PS_SHIPPING_FREE_WEIGHT']) AND floatval($configuration['PS_SHIPPING_FREE_WEIGHT']) > 0  and Configuration::get('PS_CARRIER_DEFAULT')==$id_carrier )
           return $shipping_cost;



Merci bcp je transmet ca a mno webmaster
Link to comment
Share on other sites

regreg, thank you sooo much for posting this change you cannot imagine how you made our life easier.

I have 2 questions for you if you dont mind:

1) when i have multiple carriers, the cart block does not show the price of the default carrier, but it just randomly display the price of any carrier (however, i would like it to select the default automatically and calculate based on that because it is the cheapest.
how can i make it do that?

2)when i get to the shipment page, all my 4 carriers are listed correctly, but again the radio button is selected randomly everytime, how can i make it automatically selecting the default carrier (maybe this was related question?)

3)how can i arrange or list the carriers by price (the cheapest on the top and the most expensive at the bottom)?

sorry 3 questions not 2/

Link to comment
Share on other sites

  • 1 month later...
// Free fees
if (isset($configuration['PS_SHIPPING_FREE_PRICE']) AND $orderTotal >= floatval($configuration['PS_SHIPPING_FREE_PRICE']) AND floatval($configuration['PS_SHIPPING_FREE_PRICE']) > 0 and Configuration::get('PS_CARRIER_DEFAULT')==$id_carrier)
return $shipping_cost;
if (isset($configuration['PS_SHIPPING_FREE_WEIGHT']) AND $this->getTotalWeight() >= floatval($configuration['PS_SHIPPING_FREE_WEIGHT']) AND floatval($configuration['PS_SHIPPING_FREE_WEIGHT']) > 0 and Configuration::get('PS_CARRIER_DEFAULT')==$id_carrier )
return $shipping_cost;


Voici le problème maitenant, c'est qu'il n'est plus possible d'attribbuer de fourchette de poid en fonction du transporteur,

quelqu'un a une idée? j'ouvre le magasin dans 4 jours et il faut une solution à ce problème.

merci

*update*

tout fonctionne, j'avais effectué un mauvais test
Link to comment
Share on other sites

donc ça fonctionnerait ça ? c'est exactly ce que je cherche en attendant que Phil nous ponde un truc top de chez top... tks regreg !!

je venais à peine de répondre ici quand je tombe sur cette soluce. je vais tester ça.


ouep ca marche c nikel :)
Link to comment
Share on other sites

question subsidiaire :
je souhaite ajouter la mention du poids dans le descriptif du transporteur, ainsi je pose un code ici (TotalWeight) mais ça ne fonctioonne pas.
qu'est ce qui cloche ? une idée ? merci

{$carrier.delay|escape:'htmlall':'UTF-8'}{$TotalWeight|escape:'htmlall':'UTF-8'}

Link to comment
Share on other sites

  • 2 weeks later...

Je fais remonter le sujet :

L'astuce marche trés bien, par contre un petit truc Gênant.

Je calcule mes frais de port par tranche de poids.

J'ai la lettre suivi de 1g à 499g et le colissimo de 500g à 10000g.

Quand une personne commande un article qui fait 81g par exemple, j'ai les 2 modes de livraison proposé : La lettre suivi et le colissimo.

Y a t il moyen de cacher le colissimo et de garder que le mode d'envoi approprié dans cette tranche de poids ?

Merci

Link to comment
Share on other sites

Ouep c'est une bonne question ça, je viens de tester, et même en modifiant le comportement dans le cas ou la tranche de poids n'existe pas le problème persiste.

En fait je pensais pouvoir commencer la tranche de poids du colissimo à 500gr mais le transporteur st quand même présent dans la liste :s

Il faudrait coder un p'tit truc pour déterminer si le poids total de la commande correspond à une tranche dans les transporteurs. Seuls les transporteurs qui ont une tranche définie pour ce poids seraient affichés.

Link to comment
Share on other sites

Ben il me semble que ça devait être le comportement normal. Sur quelle version testez-vous ça ?


Hello,

Moi c'est sur 1.1.0.5
En fait pour voir exactement de quoi il parlait j'ai modifié un peu mes réglages pour tester:

lettre de 0 à 499
colissimo 500 à 2000 (et d'autres tranches au dessus jusqu'à 30'000gr)

Ensuite je suis allé dans le transporteur colissimo pour régler le "comportement des tranches", on a le choix entre "prend la tranche la plus grande" ou "désactiver le transporteur"

Le résultat c'est que le transporteur colissimo apparait quand même avec le réglage "désactiver le transporteur".

A mon avis ce n'est pas un 'bug' puisque je pense que ça concerne le cas où le poids du panier dépasse la tranche la plus haute des transporteur... Ce n'est pas le cas (au contraire) donc il apparait et c'est "logique" par rapport au programme.

Par contre effectivement je pense qu'il faudrait pouvoir désactiver le transporteur quand le cas inverse se présente, c'est à dire que le poids total du panier est inférieur à la première tranche d'un transporteur.
Link to comment
Share on other sites

euhhh j'avance un peu :D

ca se passe dans ./classes/Carrier.php

   static public function checkDeliveryPriceByWeight($id_carrier, $totalWeight, $id_zone)
   {
       $result = Db::getInstance()->getRow('
       SELECT d.`price`
       FROM `'._DB_PREFIX_.'delivery` d
       LEFT JOIN `'._DB_PREFIX_.'range_weight` w ON d.`id_range_weight` = w.`id_range_weight`
       WHERE d.`id_zone` = '.intval($id_zone).'
       AND '.floatval($totalWeight).' < w.`delimiter2`
       AND d.`id_carrier` = '.intval($id_carrier).'
       ORDER BY w.`delimiter1` ASC');
       if (!isset($result['price']))
           return false;
       return true;
   }



je crois qu'il va me falloir un peu de temps pour comprendre la fonction (mdr)

En tout cas je comprends mieux pourquoi on voit le transporteur affiché dans le cas qui nous interesse puisque cette fonction va renvoyer TRUE quelque soit le poids de départ pour ce transporteur :/
C'est évident parce que si le transporteur existe il y a au moins une tranche de poids : la première...
Ca explique aussi pourquoi le prix affiché pour ce transporteur est celui de la tranche la plus basse (index [0] du tableau).

Ce qu'il faut faire là, c'est comparer le poids du panier avec le poids de départ de la première tranche, si inférieur : FALSE (ie le poids le plus bas de ce transporteur est supérieur au poids du panier).

Je sais pas si c'est clair, mais je suis sûr que c'est là que ça se passe :D

Link to comment
Share on other sites

Bon...

Sw00p je te propose de tester une modif qui devrait aller dans le bon sens.

But recherché :
Pouvoir définir des transporteurs qui se désactivent dans la liste de choix des transporteurs (lorsque le client doit faire ce choix) quand la tranche de poids la plus basse d'un transporteur est supérieur au poids du panier (ou disons plutot que le panier pèse moins que la première tranche défini pour un ou plusieurs transporteurs)

Exemple (en grammes):
Transporteur "la Poste LETTRE" : de 0.001 à 0.250
Transporteur "La Poste COLISSIMO" : de 0.251 à 0.500 (+ toutes les autres tranches supérieures jusqu'à 30'000 par exemple)
Transporteur "Tartanpion" : de 30001 à 100000

Si le poids du panier est de 180gr : SEUL le transporteur LETTRE sera proposé.
Si le poids du panier est situé entre 251gr et 30kg : SEUL le transporteur COLISSIMO sera proposé.
Si le poids du panier est > 30kg : SEUL le transporteur Tartanpion sera proposé...

Cela implique, pour chaque transporteur, de sélectionner "Désactiver le transporteur" dans le champ "Comportement des tranches". Il n'y a que dans ce cas que la fonction modifiée est appelée.
Ca implique aussi de ne pas croiser avec les poids dans différent transporteurs (sauf si tu veux qu'il apparaisse justement...), et également de prévoir tous les cas de figure de poids pour éviter les erreurs (genre un panier plus lourd que les tranches des transporteurs programmées :-/ )

Modif:
Sauvegarder le fichier ./classes/Carrier.php
Editer ce fichier et ajouter cette ligne dans la fonction "static public function checkDeliveryPriceByWeight($id_carrier, $totalWeight, $id_zone)"

AND '.floatval($totalWeight).' > w.`delimiter1`




Fonction complète AVANT modif:

   static public function checkDeliveryPriceByWeight($id_carrier, $totalWeight, $id_zone)
   {
       $result = Db::getInstance()->getRow('
       SELECT d.`price`
       FROM `'._DB_PREFIX_.'delivery` d
       LEFT JOIN `'._DB_PREFIX_.'range_weight` w ON d.`id_range_weight` = w.`id_range_weight`
       WHERE d.`id_zone` = '.intval($id_zone).'
       AND '.floatval($totalWeight).' < w.`delimiter2`
       AND d.`id_carrier` = '.intval($id_carrier).'
       ORDER BY w.`delimiter1` ASC');
       if (!isset($result['price']))
           return false;
       return true;
   }



Fonction complète APRES modif:

   static public function checkDeliveryPriceByWeight($id_carrier, $totalWeight, $id_zone)
   {
       $result = Db::getInstance()->getRow('
       SELECT d.`price`
       FROM `'._DB_PREFIX_.'delivery` d
       LEFT JOIN `'._DB_PREFIX_.'range_weight` w ON d.`id_range_weight` = w.`id_range_weight`
       WHERE d.`id_zone` = '.intval($id_zone).'
       AND '.floatval($totalWeight).' < w.`delimiter2`
       AND '.floatval($totalWeight).' > w.`delimiter1`
       AND d.`id_carrier` = '.intval($id_carrier).'
       ORDER BY w.`delimiter1` ASC');
       if (!isset($result['price']))
           return false;
       return true;
   }



Evidemment j'ai testé, mais comme j'ai un mal de crâne de première catégorie (!!) j'arrête pour ce soir.
Il faut bien vérifier les incidences possibles et innatendues dans certains cas de figures....

Link to comment
Share on other sites

Alors..
Ca a l'air de fonctionner, mais par contre il y a un petit bug :

Dans le panier en haut à droite j'ai ça :

Expédition 0,00 €
Total 13,00 €

Dés que j'ajoute des produits, forcément le poids augmente et à un moment donné, je passe à la tranche supérieur, avec mon autre transporteur. Là ca fonctionne, le panier se met à jour.
Mon premier transporteur est mon transporteur par défaut. Je l'utilise afin d'attribuer les frais de ports gratuit, uniquement par ce transporteur (modif d'un fichier, dans un autre post).

Le problème vient peut être de là

Link to comment
Share on other sites

Oui j'ai remarqué ça aussi en début d'après-midi, donc ça ne vient pas forcément de ton autre modif.
je pense qu'il y a un cas de figure où il ne faudrait pas tenir compte du "delimiter1".

Je pense à une chose: je vais dupliquer cette fonction et la renommer, comme ça on aura l'ancienne fonction avec le nom d'origine pour tous les programmes de PS qui l'appellent (ie maj du port du bloc panier), et on utilisera la nouvelle (dupliquée + modif) pour le cas bien ciblé de l'affichage des transporteurs sur la page qui nous intérresse. la modif deviendra donc exclusive pour le cas qui nous interresse.

Mais de toute façon le prix du port indiqué dans le bloc panier est toujours plus ou moins "faux" puisque si l'utilisateur a d'autre choix que le transporteur par défaut lors de la commande ce prix sera ajusté en conséquence...
(mais c'est vrai que le coup du 0.00 ça lui laisse trop de faux espoirs lol)

Enfin je dis ça de mémoire, je regarderais ce soir si c'est une vrai solution.

Link to comment
Share on other sites

Bon j'ai regardé ça.
Pour des questions de sécurité, au cas ou d'autres parties de PS feraient appel à cette fonction, et aussi parce que d'autres modules existants ou futurs pourrait faire appel à cette fonction... je l'ai dupliqué pour qu'elle reste à son état initial quand elle est appelé avec son nom initial. La fonction dupliquée a le même nom + "AD" à la fin (pour AllDelimiter).

Dans ./classes/Carrier.php

   static public function checkDeliveryPriceByWeight($id_carrier, $totalWeight, $id_zone)
   {
       $result = Db::getInstance()->getRow('
       SELECT d.`price`
       FROM `'._DB_PREFIX_.'delivery` d
       LEFT JOIN `'._DB_PREFIX_.'range_weight` w ON d.`id_range_weight` = w.`id_range_weight`
       WHERE d.`id_zone` = '.intval($id_zone).'
       AND '.floatval($totalWeight).' < w.`delimiter2`
       AND d.`id_carrier` = '.intval($id_carrier).'
       ORDER BY w.`delimiter1` ASC');
       if (!isset($result['price']))
           return false;
       return true;
   }

static public function checkDeliveryPriceByWeightAD($id_carrier, $totalWeight, $id_zone)
   {
       $result = Db::getInstance()->getRow('
       SELECT d.`price`
       FROM `'._DB_PREFIX_.'delivery` d
       LEFT JOIN `'._DB_PREFIX_.'range_weight` w ON d.`id_range_weight` = w.`id_range_weight`
       WHERE d.`id_zone` = '.intval($id_zone).'
       AND '.floatval($totalWeight).' < w.`delimiter2`
       AND '.floatval($totalWeight).' > w.`delimiter1`
       AND d.`id_carrier` = '.intval($id_carrier).'
       ORDER BY w.`delimiter1` ASC');
       if (!isset($result['price']))
           return false;
       return true;
   }




Dans ./order.php

if ((Configuration::get('PS_SHIPPING_METHOD') AND (!Carrier::checkDeliveryPriceByWeightAD($row['id_carrier'], $cart->getTotalWeight(), $id_zone))) OR (!Configuration::get('PS_SHIPPING_METHOD') AND (!Carrier::checkDeliveryPriceByPrice($row['id_carrier'], $cart->getOrderTotal(true, 4), $id_zone))))



Ca ne règle pas le problème du block panier avec éventuellement un prix de port à zéro (ou autre), pour une raison simple : ce prix affiché dynamiquement tient compte du transporteur par défaut, OU, si j'ai bien compris, du transporteur choisi par le client lors de sa dernière visite (cookies).

Le problème c'est qu'avec notre nouveau système on est amené à désactiver le transporteur par défaut... (donc on obtient 0.00 euro) ce qui explique d'ailleurs que quand on arrive sur le choix du transporteur on ne voit aucun bouton-radio de coché.

Donc voilà :/ en plus de cette modif il faudrait changer dynamiquement le transporteur par défaut s'il est désactivé du fait de la modif (ie aucune tranche de poid correspondante à ce transporteur pour le poids actuel du panier).
euhhhhh c'est pas gagné avec le peu de connaissance que j'ai de PS ^^


[EDIT]
euhh non, le problème du tarif du port dans le panier n'a rien à voir avec "notre" modif puisque maintenant la fonction originale est remise en place. Donc ce phénomène a toujours existé! (?). Je le vois depuis hier parce que maintenant mon transporteur par défaut ne démarre pas de tranche à 0.001gr .....

Link to comment
Share on other sites

question subsidiaire :
je souhaite ajouter la mention du poids dans le descriptif du transporteur, ainsi je pose un code ici (TotalWeight) mais ça ne fonctioonne pas.
qu'est ce qui cloche ? une idée ? merci

{$carrier.delay|escape:'htmlall':'UTF-8'}{$TotalWeight|escape:'htmlall':'UTF-8'}



J'ai testé avec ça:
{$cart->getTotalWeight()}



Ca fonctionne. reste plus qu'à chopper "kg" ou "gr" (ou de le forcer puisque c'est réglé une bonne fois pour toute dans la boutique à priori).

[EDIT]
Dans mon thème ça donne ça:

{l s='Choose your delivery method'} - {l s='Poids du panier:'} {$cart->getTotalWeight()} Kg

9254_PdCmvTORRuGiVTX6ATj4_t

Link to comment
Share on other sites


[EDIT]
euhh non, le problème du tarif du port dans le panier n'a rien à voir avec "notre" modif puisque maintenant la fonction originale est remise en place. Donc ce phénomène a toujours existé! (?). Je le vois depuis hier parce que maintenant mon transporteur par défaut ne démarre pas de tranche à 0.001gr .....


Je confirme que ce problème a toujours existé.

Ce qu'il faudrait faire pour le calcul provisoir des frais de port dans le bloc-panier, et ce à chaque fois qu'un produit est ajouté, c'est :

Boucler tous les transporteurs avec la nouvelle fonction modifiée "checkDeliveryPriceByWeightAD" et afficher le prix le plus bas s'il y a plusieurs transporteurs renvoyant un tarif pour le poids actuel.

Par exemple concernant ma boutique ça afficherait le poids "LETTRE" au premier produit ajouté (si son poids correspond à ce type detransporteur évidemment), ensuite "COLISSIMO", etc..

Parce que dans l'état actuel des choses, si tu avais quitté la boutique la fois précédente en ayant choisi "colissimo" le bloc panier va calculer les frais de port sur CE transporteur, et pas un autre :/
C'est particulièrement chiant si le client vient d'ajouter un produit de quelques grammes qui passerait par lettre...
C'est un coup à le faire fuir, pas de doute.

Je vais essayer de coder ça mais c'est pas garanti lol ^^
Link to comment
Share on other sites

  • 3 weeks later...

Attention a "ma" modif sur le delimiter1

il faut écrire

AND '.floatval($totalWeight).' >= w.`delimiter1`



(supérieur OU EGAL) et non pas "Supérieur" seulement...

Parce que quand on fait une tranche de 0.500 à 1.000 par exemple, PS agit de 0.500 à 0.99999 (tranche supérieure NON incluse, ce "détail" est maintenant précisé dans le BO de la version 1.2, mais pas dans la 1.1)

Forcément un panier de 1.0kg pile désactive le transporteur. Ceux qui ont fait cette modif doivent éditer ./classes/Carrier.php et modifier le ">" en ">=" concernant le délimiter 1 de la fonction modifiée "checkDeliveryPriceByWeight"

Link to comment
Share on other sites

  • 4 weeks later...

Personnellement j'utlise expeditor inet qui impose de travailler avec le même carrier pour toutes les expeditions cad la poste.
je ne peut donc pas utliser ni l'astuce d'avoir un transporteur par zone avec gratuité au delà d'un montant (ou pas gratuit)
ni vos modification de code utilisant le transporteur par default.

Par contre ce qui fonctionnerait serait de n'appliquer le critère de gratuité de port que sur le pays par défault.

Quelqu'un pourrait-il essayer de me montrer le code php. (voir post de regreg et alekhine et al plus haut pour inspiration)

merci d'avance

jb

Link to comment
Share on other sites

  • 1 year later...

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