Jump to content

Relais colis TNT


Recommended Posts

Bonjour à tous et à toute l'équipe Prestashop !

Je suis confronté à un problème concernant l'installation d'un module de relais Colis chez TNT.
J'ai besoin de l'installer sur la plateforme Presta mais je ne parviens pas à cerner comment le faire marcher.

Jusqu'ici j'ai réussi à l'installer sur la page des transporteurs lors de la commande du client et il marche plutot pas mal.
Mais après ca je ne situe pas quoi faire pour valider tout ceci. Je pense qu'il y a beaucoup de chose à manipuler dans les sdcripts et j'ai un peur de faire n'importe quoi.

Quelqu'un pourrait m'aiguiller svp ?

Je vous remercie d'avance
A plus tard

Link to comment
Share on other sites

Oui je peux t'aider je l'ai développé pour mon site MusicDestock.fr
C'est pas très compliqué mais il faut un peu de conception avant tout de même...
Pour ma part :
- je propose au client le relai colis TNT
- Si'il a choisi TNT, s'assurer qu'il a bien saisi un relai sinon message d'erreur
- S'il a a choisi TNT et que tout est OK, créer l'adresse choisie et l'associer au client.
Après cela dépends de ce que vous voulez...

Link to comment
Share on other sites

Bonjour Julien,
c'est sous forme de module ta solution ?
Moi la mienne tout comme tout le reste je peux le mettre à contribution mais c'est plus un patch qu'un module vu que par exemple pour twenga il faut rajouter un répertoire (ok...) mais modifier le fichier order-carrier.tpl afin d'ajouter le code requis par TNT. Rien de sorcier mais cela implique que lors d'une mise à jour de prestashop il faut penser à merger ce genre de fichier.
En même temps je ne pense pas qu'il y ait pour TNT relais colis d'autre solution...

Link to comment
Share on other sites

Salut, oui bien sûr.

Donc tu en es où ? Tu as créé un "Transporteur" qui s'appelle "TNT Relais Colis"...
Et tu es bloqué ensuite c'est çà ?
Avant de tout expliquer je veux savoir où t'en es ?
Tu as copié quelquepart un dossier "relaisTNT" contenant les fichiers suivisColis etc. que t'ont fourni TNT ?

Il te manque juste les modif à apporter pour afficher et traiter correctement le relais choisi par le client, c'est bien cela ?

Link to comment
Share on other sites

Voilà c'est bien ça

J'ai donc créé un trasporteur "relais Colis TNT"
Parmi les fichiers fournis par TNT :
- j'ai mis le dossier "proxy" à la racine du site
- Ensuite les fichiers js, css et images dans le thème du template avec ceci dans header.tpl

<script type="text/javascript" src="{$base_dir}themes/site/js/relaisColis/jquery-1.2.3.min.js"<</script<
<script type="text/javascript" src="{$base_dir}themes/site/js/relaisColis/relaisColis.js"<</script<
<script type="text/javascript" src="{$base_dir}themes/site/js/relaisColis/jqModal.js"<</script<
<link href="{$base_dir}themes/site/css/tntB2CRelaisColis.css" rel="stylesheet" type="text/css" media="all" /> 



- Après je bloque !!!

Je te remercie beaucoup pour ton aide en tout cas...

Link to comment
Share on other sites

Je te conseille :

mettre tous les fichiers TNT dans un répertoire à la base du site par exemple un dossier RELAISTNT
qui contient donc :
suiviColis.html
css/*
img/*
js/*
proxy/*

Ensuite tu édites le fichier
theme/site/order-carrier.tpl

Si tu as nommé le transporteur ainsi : "TNT Relais colis" sinon change dans la condition "if"avec ce que tu as mis exactement comme nom de société pour le transporteur TNT
tu ajoutes dans le foreach (à la fin) la condition dans le cas où c'est TNT pour affichier le div et inclure les javascripts (attention remplacer BALISE_SCRIPT par script bien sûr.... là j'ai mis çà sinon çà c'est évidemment automatiquement enlevé du message par sécurité):

{foreach from=$carriers item=carrier name=myLoop}


                       <input type="radio" name="id_carrier" value="{$carrier.id_carrier|intval}" id="id_carrier{$carrier.id_carrier|intval}" {if $carrier.id_carrier == $checked || ($checked == 0 && $i == 0) || ($carriers|@sizeof == 1)}checked="checked"{/if} />



                           {if $carrier.img}{else}{$carrier.name|escape:'htmlall':'UTF-8'}{/if}


{$carrier.delay|escape:'htmlall':'UTF-8'}
{if $carrier.price}{convertPrice price=$carrier.price}{else}{l s='Free!'}{/if}

           {if $carrier.name|escape:'htmlall':'UTF-8' == 'TNT Relais colis'} 




                       <style type="text/css">@import url(RELAISTNT/css/tntB2CRelaisColis.css);</style>
                        


           {/if}                
           {/foreach}



Ensuite il faut modifier la fonction processCarrier() du fichier order.php afin d'ajouter l'adresse TNT si c'est un relais colis qui a été ajouté :
Fichier /order.php dans la fonction processCarrier() juste avant l'appel $cart->update(); il faut ajouter :


$carrier=Carrier::getCarrierNameById($cart->id_carrier);

   if(strcmp($carrier,'TNT Relais colis')==0)
   {    if(empty($_POST['tntRCSelectedCode'])) // Case error : the customer didn't choose a 'relais' but selected Relais Colis TNT as a carrier 
           $errors[] = Tools::displayError('Avec la livraison TNT, vous devez choisir le relais dans lequel votre colis sera livré (saisissez le code postal et cliquer sur le bouton OK). Sinon choisissez un autre mode de livraison');
       else
       {
           // In case the customer already tried for this cart to validate his order with a Relais Colis TNT Carrier...
           Db::getInstance()->delete('ps_address','alias LIKE "TNT-'.$cart->id.'%'.'"');

           // We build the delivery address : Nota bene here it's adapted for delivery in France : $address_TNT->id_country=61;
           $address_TNT = new Address();
           $address_TNT->id_customer=$cart->id_customer;
           $address_TNT->id_country=61;
           $address_TNT->alias='TNT-'.$cart->id.'-'.$_POST['tntRCSelectedCode'];
           $address_TNT->lastname='TNT';
           $address_TNT->firstname='Relais Colis';
           $address_TNT->company=$_POST['tntRCSelectedNom'];
           $address_TNT->address1=$_POST['tntRCSelectedAdresse'];            
           $address_TNT->postcode=$_POST['tntRCSelectedCodePostal'];
           $address_TNT->city=$_POST['tntRCSelectedCommune'];

           $address_TNT->save();

           $cart->id_address_delivery = Address::getAddressByAlias($address_TNT->alias);

       }
   }



Après moi j'ai fait en plus dans cette fonction une insertion dans une table spécificque TNT pour sauvegarder tous les paramètre du relais colis choisi afin d'éditer plus tard automatiquement les étiquettes

voilou en gros il me semble... quoi que la fonction getAddressByAlias de la classe Address ne doit pas exister de base...
il faut donc la rajouter : fichier classes/Address.php

   /**
    * Get address id for a given alias
    *
    * @param integer $id_address Address id for which we want to get zone id
    * @return integer Zone id
    */
   public static function getAddressByAlias($alias)
   {
       $result = Db::getInstance()->getRow('
       SELECT a.`id_address`
       FROM `'._DB_PREFIX_.'address` a
       WHERE a.`alias` LIKE "'.pSQL($alias).'"' );

       return ($result['id_address']);
   }

Link to comment
Share on other sites

Bonjour et merci beaucoup pour cette petite contrib qui vaut son pesant dor !!! :)

Je rencontre toutefois des problèmes...
Notamment concernant le fichier order.php et le code qui lui ai attribué. En gros, lorsque je valide afin de passer à l'étape suivant (c'est à dire le récapitulatif de la commande) j'obtiens alors une page blanche...

Et cela quel que soit le transporteur choisi !
J'ai regardé le code et n'est pas constaté d'erreurs supectes, avez vous une idée ?

Tout le reste fonctionne et une autre question concernant les tarifs de TNT pour le relais colis, comment ca se passe ? J'ai rentré la grille tarifaire mais je ne pense pas que cela ai une incidence... Comment ca marche ?

Merci en tout cas pour votre aide, c'est vraiment super !!
@ bientot

Link to comment
Share on other sites

Bonjour,

tu as fais tout ce que j'ai dit plus haut ?

Tu as bien tout mis de ce qui concerne TNT dans un répertoire à la base du site dans dans le répertoire RELAISTNT ou bien avec un nom différent mais tu as répercuté çà dans le code...

Alors la solution pour trouvger d'ou provient l'erreur est de checker dans ton fichier de log php Vides-le dans ton environnement de test ou de qualif' et lance la procédure jusqu'à la page blanche.

Sinon pour la grille des prix du coup si c'est une grille par rapport au poids il faut que tu sélectionnes dans Admin > Transport :
"En fonction du poids total"

Mais du coup tout est calculé pour tous les transporteurs en fonction du poids total.

Pour ma part parfois c'est en fonction du poids parfois en fonction du total de la commande.... Mais pour obtenir çà il faut encore mettre la main dans l'cambouis

çà va pas être évident de débugger à distance comme çà ! Mais regarde tes fichiers de logs. Et surtout as-tu bien rajouter la fonction getAddressByAlias() dans classes/Address.php ?

Ciao

Link to comment
Share on other sites

Oui j'ai bien fait tout ce que tu as dis plus haut (répertoire jusqu' à la méthode getAdressByAlias() dans la classe Address.php !

Je vais passer un peu de temps ce soir dessus en rentrant pour voir ce qui ne va pas exactement et te tiens au courant
merci encore !

A bientot

Link to comment
Share on other sites

/* Carrier step */
function processCarrier()
{
   global $cart, $smarty, $isVirtualCart, $orderTotal;

   $errors = array();

   $cart->recyclable = (isset($_POST['recyclable']) AND !empty($_POST['recyclable'])) ? 1 : 0;

   if (isset($_POST['gift']) AND !empty($_POST['gift']))
   {
        if (!Validate::isMessage($_POST['gift_message']))
           $errors[] = Tools::displayError('invalid gift message');
       else
       {
           $cart->gift = 1;
           $cart->gift_message = strip_tags($_POST['gift_message']);
       }
   }
   else
       $cart->gift = 0;

   $address = new Address(intval($cart->id_address_delivery));
   $id_zone = Address::getZoneById($address->id);
   if (isset($_POST['id_carrier']) AND Validate::isInt($_POST['id_carrier']) AND sizeof(Carrier::checkCarrierZone(intval($_POST['id_carrier']), intval($id_zone))))
       $cart->id_carrier = intval($_POST['id_carrier']);
   elseif (!$isVirtualCart)
       $errors[] = Tools::displayError('invalid carrier or no carrier selected');

// *****************************************************************************

$carrier=Carrier::getCarrierNameById($cart->id_carrier);

   if(strcmp($carrier,'TNT Relais colis')==0)
   {    
       if(empty($_POST['tntRCSelectedCode'])) // Case error : the customer didn't choose a 'relais' but selected Relais Colis TNT as a carrier 
           $errors[] = Tools::displayError('Avec la livraison TNT, vous devez choisir le relais dans lequel votre colis sera livré (saisissez le code postal et cliquer sur le bouton OK). Sinon choisissez un autre mode de livraison');
       else
       {
           // In case the customer already tried for this cart to validate his order with a Relais Colis TNT Carrier...
           Db::getInstance()->delete('address','alias LIKE "TNT-'.$cart->id.'%'.'"');

           // We build the delivery address : Nota bene here it's adapted for delivery in France : $address_TNT->id_country=61;
           $address_TNT = new Address();
           $address_TNT->id_customer=$cart->id_customer;
           $address_TNT->id_country=61;
           $address_TNT->alias='TNT-'.$cart->id.'-'.$_POST['tntRCSelectedCode'];
           $address_TNT->lastname='TNT';
           $address_TNT->firstname='Relais Colis';
           $address_TNT->company=$_POST['tntRCSelectedNom'];
           $address_TNT->address1=$_POST['tntRCSelectedAdresse'];            
           $address_TNT->postcode=$_POST['tntRCSelectedCodePostal'];
           $address_TNT->city=$_POST['tntRCSelectedCommune'];

           $address_TNT->save();

           $cart->id_address_delivery = Address::getAddressByAlias($address_TNT->alias);

       }
   } 

// *****************************************************************************

   $cart->update();

   if (sizeof($errors))
   {
       $smarty->assign('errors', $errors);
       displayCarrier();
       include(dirname(__FILE__).'/footer.php');
       exit;
   }
   $orderTotal = $cart->getOrderTotal();
}




Je mets la méthode processCarrier() pour une éventuelle aide concernant cette erreur . Entre les astérisques, le code ajouté : je le mets, page blanche ; je l'enlève, la page s'affiche.
Voilà merci encore

Link to comment
Share on other sites

Ah bah ouai !
C'est vrai que j'ai ajouté aussi cette fonction !
Carrier::getCarrierNameById().

2 solutions : tu ajoutes la fonction dans ce fichier ou tu fais la requete dans processCarrier()
Moi j'ai opté pour la fonction histoire de pouvoir la réutilisé au cas où ailleurs ;)

Bon donc tu ajoutes dans le fichier classes/Carrier.php
ce code :

public static function getCarrierNameById($id)
   {
        $sql = '
           SELECT c.name
           FROM `'._DB_PREFIX_.'carrier` c
           WHERE c.`id_carrier`  = '.$id;
       $res = Db::getInstance()->ExecuteS($sql);
       return $res[0]['name'];
   }



J'ai été obligé de faire ainsi car à la base j'avais juste mis

if($cart->id_carrier==_ID_CARRIER_TNT)


au lieu de

$carrier=Carrier::getCarrierNameById($cart->id_carrier);
if(strcmp($carrier,'TNT Relais colis')==0) ...



Avec _ID_CARRIER_TNT défini dans le fichier de config mais le problème est que dès que tu modifies un pauvre truc dans les transporteurs çà modifie son ID ! Donc c'était trop chiant.

Link to comment
Share on other sites

  • 5 months later...

Bonjour à tous,

Je suis en train d'implémenter ce module. En regardant le fichier proxy.php fourni par TNT pour contourner la restriction serveur au niveau de l'ajax, je vois

$url = str_replace(' ', ' ', $_GET['url']);
$handle = fopen($url, 'rb');



Je ne sais pas si c'est moi qui suis parano, mais je trouve ça moyennement sécurisé. Ne devrait t'on pas mettre une regex au moins pour verifier que la requette pointe bien vers tnt et non pas www.hackezmoibienfort.com

Quelqu'un peut m'infirmer / me confirmer ?

Thanks

Link to comment
Share on other sites

Bonjour,
Dans mon cas, je propose uniquement ce mode de livraison. (pas le choix d'autres transporteurs)

J'ai bien suivi les indications de daYmo, jusqu'au bout (fonction getCarrierNameById).

> J'entre un code postal
> Je choisis une ville / un point relais
> Je clique sur "Suivant"
> J'ai le message : Il y a 1 erreur : 1. Avec la livraison TNT, vous devez choisir le relais dans lequel votre colis sera livré.
Comme si "tntRCSelectedCode" était vide...

Merci de votre aide !

Julien Rojo

Link to comment
Share on other sites

Bonjour,
Dans mon cas, je propose uniquement ce mode de livraison. (pas le choix d'autres transporteurs)

J'ai bien suivi les indications de daYmo, jusqu'au bout (fonction getCarrierNameById).

> J'entre un code postal
> Je choisis une ville / un point relais
> Je clique sur "Suivant"
> J'ai le message : Il y a 1 erreur : 1. Avec la livraison TNT, vous devez choisir le relais dans lequel votre colis sera livré.
Comme si "tntRCSelectedCode" était vide...

Merci de votre aide !

Julien Rojo


OK, résolu. Détail tout bête : il manquait name='tntRCSelectedCode' dans la balise INPUT du fichier RelaisColis.js

Question bonus : Comment annuler le choix "Relais colis" si le client revient sur une étape précédente du process de commande ?
Merci à Damien pour son aide précieuse.
Link to comment
Share on other sites



Je ne sais pas si c'est moi qui suis parano, mais je trouve ça moyennement sécurisé. Ne devrait t'on pas mettre une regex au moins pour verifier que la requette pointe bien vers tnt et non pas www.hackezmoibienfort.com

Quelqu'un peut m'infirmer / me confirmer ?


Hello,

Tout d'abord merci pour cette contribution. Je souhaiterais apporter ma pierre au cas ou quelqu'un passe par là, mon client utilisant TNT.

Tout d'abord, il me semble important de vous sensibiliser à l'utilisation du code des proxys donnés. Pour moi ce sont des exemples et non des fichiers à utiliser tels quels sur votre site. Transformer son site en proxy web, à la racine, sans les mesures de sécurité que demande l'établissement d'un proxy web c'est tendu. Avec ce code, il est possible de faire pas mal de choses sous le couvert de l'ip de votre serveur.

Le TNT est dans la partie loggée, il faut vérifier que la requête vienne d'un compte et qu'elle se dirige vers TNT. Il faudrait même vérifier qu'elle vient de l'url de mon site. TNT ils sont sympas, mais coller un proxy php pour contourner les limitations de sécurité des fonctions dites ajax, sans avertir sur la sécurité qu'il faut remplacer, perso je trouve ça douteux. En règle générale ne pas utiliser des fichiers les yeux fermés...
Je me trompe peu être mais je préfère que le site de mon client ne serve pas de proxy.

Pour modules/TNT/proxy.php (merci Rémi pour le coup de main au passage)

include(dirname(__FILE__).'/../../../config/config.inc.php');
include(dirname(__FILE__).'/../../../init.php');

$cookie = new Cookie('ps');

if (!$cookie->isLogged())
{
   Tools::displayError('authentication required');
   exit();    
}

$url = str_replace(' ', ' ', $_GET['url']);
if (preg_match('/^http:\/\/www.tnt.fr\/.*/Ui', $url))
   $handle = fopen($url, 'rb');

if (isset($handle) AND $handle) {

   $contents = '';

   while (!feof($handle)) {
       $contents .= fread($handle, 8192);
   } 

   //gestion des entetes
   header("Content-type: text/xml");

   //on affiche la page
   print_r(utf8_encode($contents)); 

   fclose($handle);
}



EDIT

Link to comment
Share on other sites

  • 1 month later...
  • 3 months later...

Bonjour,

Et merci pour ce super bout de code !!!

J'ai un soucis cependant avec la mise en ligne... Sniff...

En local ça fonctionne impec !

Lors de la mise en ligne, après avoir rentré le code postal, il m'affiche :

Error !: [object XMLHttpRequest]

Arght !!!

Please, help !!

Merci,
BC

Link to comment
Share on other sites

  • 1 month later...

Salut, j'ai trouvé la solution,
Il faut que tu vérifie dans le fichier relaisColis.js les deux lignes suivantes :
il faut mettre l'adresse en dur de ton shop

var proxyPHP = ......../proxy.php
var pathToImages = ......./img/

Après, par contre, je sais pas, je l'ai pas chopé sur le store...

Link to comment
Share on other sites

Bonjour,

A toute fin utile pour les autres, il faut que que votre hebergement autorise la commande fopen sur des urls externes, ce qui est souvent bridé pour des raisons de sécurité (safe mode). Ce qui est le cas sur votre serveur "file-access is disabled in the server configuration". Il faut contacter votre hébergeur pour faire autoriser le contact vers le site de TNT.

http://php.net/manual/en/function.fopen.php

Cordialement,

Link to comment
Share on other sites

  • 2 months later...

J'ai achevé un module complet et fonctionnel pour relais colis.
Quand je parle de module c'est exactement le cas , dans le sens ou aucune modification du code presta n'est nécessaire.
Je ne peux pas le comparer au module proposé sur prestastore, étant donné que justement , je ne l'ai pas acheté.
Ce module néanmoins fonctionne parfaitement et s'intègre très facilement.
Je ne suis pas encore décidé pour savoir si je le livre gratuitement , ou si je le vends sur un shop , à petit prix, même si celà viendra sans doute.
Dans tous les cas je trouve un peu excessif pour un seul transporteur d'avoir 130€ à débourser. Non que je ne les débourserais pas moi même , juste que mes clients , eux , ne veulent pas en entendre parler dans le prix de développement de leur boutique, mais pourtant en ont tous besoin.

Pour ceux que celà interesse....en tout cas , je réponds volontier à vos questions

Link to comment
Share on other sites

  • 5 months later...

bonjour a tous
un topic très intéressant, pour moi j'aimerais bien intégrer comme chrono relais comme transporteur dans ma boutique.
J'ai cherché s'il y avait un module de point de relais pour Chronopost mais a parement il n'existe pas alors je cherche comment le créer mais je suis débutant dans la création des modules prestashop.
j'ai lu des postes qui parle d'une kit Chronopost, est elle nécessaire pour développer ce module??
merci a une gentille âme de me guider et me donner quelque infos utiles.
merci d'avance

Link to comment
Share on other sites

Bonjour,

Le kit mentionné est indispensable au bon développement de ce type de module, car il documente les apis ou web services du transporteur. Sans cela dur dur ....
Il peut t'être fourni assez facilement par le service développement du transporteur.
Je n'ai pas plus d'infos que ça concernant chronopost, je n'ai pas non plus ce fameux kit.

Link to comment
Share on other sites

merci
alors je doit contacter Chronopost pour leur demander ce fameux kit
autre question : est ce qu'il y a un module de transport(autre que mondialrealy car c vraiment compliqué de déchiffrer son code) qui contient des point de relais sur prestashop peut âtre que je peut le transformer un module pour Chronopost?
thx

Link to comment
Share on other sites

  • 2 months later...

bonjour
j'ai réussi a récupérer la liste des point relais mais j'arrive pas a les affiché dans le processus du commande si je coche le bouton radio correspondant.
j'utilise aussi mondial_relay (dont je l'ai pris comme référence) avec la version PS 1.2.5
un coup de main svp c très urgent, merci

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