Prestashop – Mise à jour automatique des stocks

Pour la réalisation d’un projet de boutique en ligne je me suis intéressé à Prestashop. Il existe d’autres moteurs de boutique web mais aujourd’hui je vais seulement parler de celui ci.

Ma problématique était de mettre à jour automatiquement les stocks en lignes par rapport aux stocks réels de la boutique physique. La chance que j’ai c’est que l’outil informatique de la boutique physique permet d’exporter un fichier csv des produits et que Prestashop sait traiter ce type de fichier. Seulement tout ça se fait sur la partie administration et manuellement. J’ai donc chercher à automatiser cette partie.

Il existe surement de multiple solutions je vous propose la solution que j’ai trouvé et qui utilise la commande WGET. Ainsi il sera possible de faire un simple script Shell qui sera exécuté par CRON. Voici les détails de ce script :

Configuration du script

Pour faciliter la configuration du script j’ai renseigné des variables au début. Veillez à bien renseigner chacune des variables avec les paramètres de votre site. Le script entier est en téléchargement à la fin de l’article. Il est composé de nombreux commentaires pour vous aider.

Détails des paramètres : Ici je m’identifie avec l’email « cron@prestashop » et le mot de passe « motdepass » qui doit correspondre à un employé enregistré dans prestashop. « urladminsite » dois contenir l’adresse de la partie administration de presatshop. Je lui dis que je veux aller dans la partir « Import » en renseignant la variable « tab« . Puis que je souhaite importer le fichier « monfichier.csv » (fichier qui dois se trouver dans le répertoire « import » de « adminxxx » de votre prestashop). Pour finir je décris chaque colonne de mon fichier csv à l’aide de type_value[num_colonne]=type_de_colonne.

email=cron@prestashop.com
passwd=motdepass
tab=Import
admintab='Admin'$tab
urladminsite=http://www.prestashop.eu/adminxxx/
csvfile='monfichier.csv'
typevalue='&type_value[0]=id&type_value[1]=name&type_value[2]=no&type_value[3]=quantity'

Identification automatique

Une fois tous ces paramètres renseignés, il faut s’en servir. Pour cela il faut s’identifier au près de notre administartion prestashop, enregistrer le cookie d’identification et récupérer un « token » donnant droit à accéder à la partie que l’on souhaite (ici la partie Import).

Première étape Identification et enregistrement du cookie :

Ici nous envoyons l’email et le mot de passe au script « login.php » de notre boutique. Nous demandons aussi d’enregistrer le cookie dans « cookie.txt« . Vous remarquez que j’enregistre aussi le résultat dans un fichier nommé « login.php« , je m’en sert dans mon script pour détecter les erreurs.

wget --save-cookies=cookie.txt --post-data='email='$email'&passwd='$passwd'&Submit=submit' --keep-session-cookies -q -O login.php $urladminsite'login.php'

 

Deuxième étape récupération du TOKEN :

Qu’est ce que le « token » ?
Le « token » est en fait un « code » généré par prestashop qui réuni des informations relatives à l’employé et à l’onglet qu’il veut visiter. Il est la pour sécuriser l’accès à votre boutique et vous éviter de faire des choses qui vous serez commandé par quelqu’un d’autre au travers d’un lien. Sans « token« , quelqu’un de mal intentionné pourrait vous envoyer un lien contenant des paramètres pouvant altérer votre base de données. Étant identifié comme administrateur sur votre ordinateur ce code n’aurait aucun mal à être exécuté. Le « token » étant connu que de vous seul et de votre prestashop toutes commandes exempts de ce token sera refusées.

Revenons à notre code. Ici aussi j’utilise la commande WGET, elle est très présente dans ce script. On va charger le cookie enregistré précédemment et attaquer la page d’index (index.php) de notre administration. Très important cette fois ci j’enregistre le résultat dans un fichier « index.php » pour récupérer le token qui nous intéresse.

Dans la deuxième ligne je récupère le token avec les commandes standards GREP et SED. Je ne rentre pas dans les détails mais je vais chercher le token se rapportant à l’onglet que je souhaite (Import).

wget --load-cookies=cookie.txt --keep-session-cookies -q -O index.php $urladminsite'index.php'
token=$(grep 'index.php?tab='$admintab'\&token=' index.php | sed 's/.*token=\(.*\)\">'$tab'.*/\1/g')

Voici pour ce qui est de l’identification. Passons maintenant à l’exécution de notre mise à jour csv.

Mise à jour des stocks

On ne change pas une équipe qui gagne. Ici encore j’utilise la commande WGET. Comme pour la commande précédente j’attaque la page « index.php » et je lui envoie le cookie. Petite différence ici, j’ajoute des paramètres qui vont être envoyés par la méthode POST à mon script. Il aura alors l’impression que je lui envoi des données renseignées par un formulaire, ici notre formulaire d’importation. Pour cela j’utilise la commande « post-data » de « wget« .

Les premiers paramètres sont l’onglet et le token précédemment récupéré. Ensuite viennent les paramètres utiles à l’importation. A vous de changer ces paramètres à votre guise suivant le format de votre fichier csv. Les paramètres de type de colonne sont récupéré de la variable « typevalue » renseigné dans la partie configuration en début de script.

wget --load-cookies=cookie.txt --keep-session-cookies --post-data='tab='$admintab'&token='$token'&skip=0&csv='$csvfile'&entity=1&iso_lang=fr&separator=;&multiple_value_separator=,'$typevalue'&import=Import CSV data' -q -O maj.php $urladminsite'index.php'

Voilà j’espère que tout ceci aidera le plus grand nombre. Je vous met le code complet de mon script et un lien pour le télécharger si vous le souhaitez. Vous restera plus qu’a executer ce script au travers de CRON pour avoir une mise à jour régulière. 😉

Le script :

#!/bin/sh

#####################################################################

#                                                                   #

#                    SRIPT DE YANNICK KERMAREC                      #

#                     HTTP://WWW.KERMAREC.COM                       #

#                                                                   #

#####################################################################

####################### PARAMÈTRES PRESTASHOP #######################

email=cron@prestashop.com

passwd=motdepass

tab=Import # Onglet auquel vous voulez accéder

admintab='Admin'$tab # Les script de prestashop vont chercher les onglets avec Admin devant

urladminsite=http://www.prestashop.com/adminxxx/ # L'url de la partie administration de prestashop

csvfile='monfichiert.csv' # Le nom de votre fichier csv se trouvant dans le répertoire 'import' de la partie adminxxx

# Les type de valeur pour chaque colonne de votre CSV :

# /!\ ATTENTION /!\ N'oubliez pas de bien renseigner cette partie car c'est ce qui va être utilisé pour mettre à jour la BD

typevalue='&type_value[0]=id&type_value[1]=name&type_value[2]=no&type_value[3]=quantity'

####################### IDENTIFICATION #######################
# Identification et récupération du cookie
wget --save-cookies=cookie.txt --post-data='email='$email'&passwd='$passwd'&Submit=submit' --keep-session-cookies -q -O login.php $urladminsite'login.php'
if [ -n "$(grep 'error' login.php)" ]
then
  error=$(grep '<li>.*</li>' login.php | sed 's/.*<li>\(.*\)<\/li>/\1/g')
  echo 'ERREUR : '$error
else
  # Si pas d'erreur premier accès à la partie administration
  wget --load-cookies=cookie.txt --keep-session-cookies -q -O index.php $urladminsite'index.php' # Accès à la partie administration
  token=$(grep 'index.php?tab='$admintab'\&token=' index.php | sed 's/.*token=\(.*\)\">'$tab'.*/\1/g') # Extraction du token de la page index.php pour l'onglet qui nous intéresse
fi

####################### IMPORTATION CSV #######################
if [ -n "$(echo $token | grep ^[a-z0-9]*)" ]
then
  echo 'TOKEN : '$token # Affichage du token récupéré
  wget --load-cookies=cookie.txt --keep-session-cookies --post-data='tab='$admintab'&token='$token'&skip=0&csv='$csvfile'&entity=1&iso_lang=fr&separator=;&multiple_value_separator=,'$typevalue'&import=Import CSV data' -q -O maj.php $urladminsite'index.php'
else
  echo 'ERREUR : Pas de token'
fi

Le script : Mise à jour automatique des stocks de prestashop.

Un commentaire

  1. Bonjour,

    j’ai été obligé de faire une petite modif pour que ça fonctionne :

    #token=$(grep ‘index.php?tab=’$admintab’\&token=’ index.php | sed ‘s/.*token=\(.*\)\ »>’$tab’.*/\1/g’)

    token=$(grep ‘index.php?tab=’$admintab’\&token=’ index.php | sed ‘s/.*token=\(.*\)\ »>.*/\1/g’)

    Mais ça m’a bien aidé quand même, un grand merci pour ce script.

  2. Je n’avais pas eu a mettre l’onglet directement sur l’accueil mais je suis sous Prestashop 1.4. Tu peux aussi ajouter un autre wget qui va aller sur la page « Outils » si tu veux garder ton interface admin propre.

    Personnellement j’ai même ajouté un onglet « Import plus » dans cette page pour avoir un import plus complet avec des options personnelles. 😉

  3. A lire rapidement, je recherche un peu à faire cela, mais j’ai une boutique de vêtements et la quantité est la somme des stocks des attributs/déclinaisons d’un articles (1 chemise XL colori bleu par exemple). Votre système fonctionne-t-il pour cela ?

  4. Essayez de faire une mise à jour avec un fichier csv dans la partie importation de Prestashop. Si les stocks sont correctement mis à jour, ça devrait fonctionner.

  5. Pour ceux qui veulent je pense proposer un service de mise à jour automatique.
    – Mise à jour des produits
    – Mise à jour des déclinaisons
    – Mise à jour des catégories

    Contactez moi si vous êtes intéressé. 😉

  6. Voila qui m’intéresse beaucoup ! Je cherche actuellement une solution pour synchroniser un logiciel CRM qui exporte une base produit, avec un prestashop. Cela concernerait des champs comme le produit, ses déclinaisons, son prix, etc… Pouvez vous me contacter ?

  7. Bonjour, le script ne fonctionne pour moi sur mon prestashop v1.4.
    Je le met sur le server et lorsque je tappe via ma console ssh : ./importCSV.sh
    j’ai cette erreur :
    importCSV.sh: line 43: Erreur de syntaxe près du symbole inattendu « fi »
    importCSV.sh: line 43: `fi’

    Quelqu’un saurait-il d’où ca vient?

  8. Bonjour Yannnick et merci pour ce truc génial.
    je suis novice sur prestashop et en php aussi et je vais faire la mise à jour du mon stock (des produits +déclinaisons) prestashop a partir de mon stock magasin.
    j’ai téléchargé ton script mais je ne sais pas comment l’utiliser sur ma boutique en local? merci de me dire ou il faut mettre se script et comment je fais appel .
    merci d’avance

  9. Bonjour,

    Merci pour le script.
    Petite question , serait-il possible de faire une boucle pour importer tous les fichier *.csv d’un répertoire ?
    Pour faire simple , à chaque modification du stock magasin , celui-cui génére un fichier csv.
    Le Script d’import pour prestashop et dans un crontab toutes les heures et import tous les fichiers *.csv ?

    Cordialement ,

  10. @Overdoz : c’est un script shell il faut l’exécuter en ligne de commande ou dans un CRON.
    @Damien : Suffit d’ajouter une boucle en shell pour le faire. 😉

  11. Bonjour,

    Pour ma part je viens de mettre ca en place, et le rapport CRON que je recois m’affiche la totalité du fichier tel qu’il est écrit, alors que j’ai bien renseigné les variables de début et qu’un fichier « monfichier.csv » est présent dans import.

    Des idées ?

  12. Bonjour,

    Super tuto ! et tout fonctionne nickel !

    Ma question est simple: ou trouver le nom des variables à indiquer dans la ligne typevalue

    J’ai besoin de modifier les champs remise de l’onglet prix de la fiche produit avec les dates, montant etc …

    Merci pour votre réponse.

    Cordialement

  13. @Romuald : Ce sont les champs proposé dans la partie « outils > import » de l’administration de Prestashop. Si tu essayes d’importer un fichier de produits, tu as une liste de champs qui apparaît sur la droite de l’écran.

  14. Merci beaucoup Yannick !

    Je cherchais désespérement à faire exactement ce que ton script permet de faire.
    J’ai eu quelques difficultés à mettre le script en place, j’ai compris par la suite que mon PHP appelait le sh qui était dans le dossier admin de mon prestashop, du coup la création des « index.php, login.php… » ne fonctionnait pas. J’ai juste déplacé le sh dans un sous-dossier /cron de mon dossier admin et ça fonctionnait nickel chrome.

    En tous cas c’est de l’excellent boulot et ça m’a fait gagner pas mal de temps de dev sur un projet ;).

    Chapeau m’sieur !

  15. Oui pas de souci, j’ai testé le tout dans tous les sens, ça fonctionne sans problème ! Merci encore.

  16. Bonjour,

    Ce script me parait génial, j’ai simplement un message d’erreur a la fin du script « Pas de token ». Pouvez-vous m’éclairer ?
    Merci beaucoup.

  17. Je réponds ici aussi pour d’autres personnes qui auraient le problème :

    Le Token :
    Il n’a pas du réussir à récupérer le token après l’identification.
    Chaque page de l’admin a un token qui est généré par rapport à la personne connectée. Pour être sur que ce lien n’est pas un lien envoyé par quelqu’un d’extérieur. C’est une sécurité dans l’admin de Prestashop.

    A vérifier :
    – cURL est installé sur la machine
    – Le couple login, mot de passe est bon
    – La configuration du script est correcte

    A savoir :
    Ce script se connecte à l’administration via cURL, il peut donc être installé n’importe ou et sur n’importe quel serveur ayant un accès web.

  18. Bonjour Yannick,
    Merci pour ce script,
    dans ton dernier post tu parles de curl, mais dans ton script, il n’y a pas de trace de curl, mais wget.

    Tu parles également de la colonne « no » ( type_value[2]=no ), a quel colonne du fichier csv correspond t’elle ?

    Je te pose ces questions car j’ai aussi un ERREUR : Pas de token 🙁 que je n’arrive pas à résoudre.

    peut etre que mon problème de token vient du fait que mon fichier csv contient 3 colonnes :
    id;Name*;quantity
    1;toto;5

    au lieu des 4, avec le champ no.

    Je ne sais pas si c’est tres clair mon histoire!!!

  19. Oui j’ai confondu wget et curl car j’ai refait une version plus complète en php avec curl.
    Le token est une clé générée par sécurité donc rien à voir avec les champs du fichier csv.

  20. une version plus complète en php ???
    c’est disponible quelque part ?
    Car je dois t’avouer que tu es le seul à avoir développé ce genre d’outil que je cherche depuis un certain temps .

    Merci à toi

    Cordialement

  21. C’est une version que j’ai commercialisée c’est pour ça que je ne l’ai pas mise en ligne. Elle n’est compatible qu’avec les version 1.4 et supérieur de Prestashop.

  22. Je m’en sert surtout pour faire des exports personnalisés pour des boites qui me le demandent. Du coup je ne le vend pas tel quel car en plus on ajoute un traitement des données pour se caler au format existant. Exemple : Logiciel de caisse, logiciel de gestion des stocks etc …

  23. Bonjour,
    j’ai utilisé ce script pour insérer des produits issus d’un fichier csv
    petite question : j’ai paramétré le script correctement, il récupère bien le token, met à jour mes articles mais j’ai l’impression que la partie import csv tourne en boucle : une fois que les articles ont été insérés, l’insertion dans la base recommence… Une idée ?

    Merci d’avance

  24. Les identifiants pour l’import Prestashop c’est le nom des Produits et non l’identifiant. Possible que ça ré-importe si le nom n’est pas le même.

  25. Top, merci Yannick.

    Pou ceux qui patinent comme moi, placez le sh dans un dossier spécifique genre /adminxxx/cron/
    car le script copie des fichiers index.php et login.php
    Ne surtout pas le placer dans www/ donc.

    la modif de J-Yves Creusot fonctionne pour les versions 1.2

    enfin si vous n’avez pas accès au crontab, faite un petit fichier maj.php avec ces lignes pour tester le script:

    appelez ensuite maj.php par votre explorateur.

  26. Merci à toi de contribuer. Je crois que tes lignes de code ne sont pas passées. Si tu veux envoie les moi j’essayerai de les poster.
    Pour ceux qui veulent que du php il est possible de faire pareil avec Curl. 😉

  27. Bonjour,
    Moi, je n’arrive pas à le faire fonctionner…
    Lors de l’appel de la page, je reviens instantanément sur la page ou j’étais avant… et imort non réalisé.
    En cron, résultat ok, mais import non réalisé…
    Pouvez vous m’éclaircir ?

  28. Bonjour et merci pour ton script.
    Nous essayons de l’utiliser pour importer aussi les catégories et sous-catégories. Cela marche à part qu’il ne tient pas compte des catégories parents et met tout le monde sous « Home » alors que le fichier d’importation est OK car il fonctionne lors d’une importation à partir de « Outils->Import ». Pourrais-tu nous aider s’il te plaît ?

  29. Le script fait exactement la même chose que lors d’un importance manuel via options > import. Vérifiez bien qu’il n’y a pas un paramètre mal configuré.

  30. j’ai eu des problèmes sur le grep sed pour récupérer le token

    j’ai remplacé par :

    echo $(grep ‘index.php?tab=’$admintab’\&token=’ index.php | sed ‘s/.*index.php?tab=’$admintab’\&token=\([a-z0-9]*\)\ »>.*/\1/g’)

    et le script marche impec pour faire un dump sql avec prestashop
    par exemple en php ça donne :

    // le sh getTokenBackup.sh récupere QUE le token
    $tokenBackup = exec(« sh « ._PS_ADMIN_DIR_. »cron/getTokenBackup.sh -q », $output, $status);

    //Executer le backup
    exec(« wget –load-cookies=cookie.txt –keep-session-cookies -O backup.php ‘ ».$BASE_URL. »/index.php?tab=AdminBackup&addbackup&token= ».$tokenBackup. »‘ « , $output, $status);

    Merci pour le script ça m’a bien aidé 😉

  31. Bonjour,
    merci pour ce script !
    J’ai néanmoins un petit soucis : J’ai essayé durant un long moment de faire marche votre script. N’y arrivant pas, j’ai mis, sur la page de login de prestashop, un print de la variable $_POST, pour voir ce qu’il récupérais.
    Et là, OH stupéfaction, quand je lance le script et regarde le contenu de login.php, le print_r n’affiche rien, le wget ne semble donc pas avoir envoyé les identifiants en Post !

    Savez-vous d’où cela peut provenir ?

    Merci d’avance !

  32. je pense pas que tu peux récupérer en $_POST les données envoyées avec wget. il créé juste un fichier cookie.txt et login.php

    pour voir si le wget fonctionne bien, il faut l’exécuter sur le serveur et regarder les logs en enlevant le -q de la commande wget

  33. Bonjour et merci pour ces infos !

    Y a-t-il des modifications à apporter pour que cela fonctionne avec une version 1.5 de prestashop ?

    J’ai testé mais cela n’a pas l’air de fonctionner 🙁
    Deja , je pense que la partie &Submit=submit devient &Submit=submitLogin mais après je sèche un peu…

    Merci pour votre aide et vos conseils !

  34. Oui il y a surement des modifications à faire pour que cela marche sur PS 1.5.
    A mon avis il faudrait même peut être refaire le script en entier.

  35. Bonjour Yannick,

    Objectivement, j’admire. (bon j’avoue que j’admire tout autant l’astuce pour la remise en fonctionnement des feux automatique de la 206, car j’ai eu la meme galère…)

    tout comme Fred et chris, je suis desespérement a la recherche de la version qui fonctionnerait sur la 1.5. Car avec la possibilité de gestion de stock avancé, il est desormais possible de creer un entrepot par fournisser et de gérer ainsi les fichiers de CSV fournis par chaque fournisseur en changeant le nom de l’entrepot et en faisant plusieurs taches cron.

    Quelqu’un a-t-il developpé un module en ce sens ?

  36. A ma connaissance je n’ai pas vu ce genre de développement.
    Je me suis pas encore vraiment penché sur la 1.5 mais il y a surement mieux à faire qu’un script tel que celui là.
    Vu le monde qui demande je vais hésiter à développer un module.

  37. Bonsoir Yannick,

    Merci pour ta réponse rapide. Si tu développes, je suis très très trèèèès preneur (dans la mesure de nos petits moyens). Comme pour pas mal d’autres commercants desormais, mes fournisseurs m’envoient leur fichier produits CSV sur un FTP.

    Ils modifient leurs produits, en gardant les ref constructeur mais en modifiant le reste regulierement.

    En fait, pour en avoir parlé avec plusieurs autres revendeurs, le module qui manque cruellement sur la synchro est un module qui ferait une mise a jour en tache cron souple entre les champs de PrestaShop et ceux des CSV fournis par les fournisseurs ou les ERP.

    Un même module pourrait ainsi servir de maniere quasi universelle pour les différents types de commerces et fonctionner avec plusieurs fournisseurs sur une meme boutique.

    Le point peut etre plus complexe est de pouvoir dans ce module eventuel, ajouter les produits sur tel ou tel entrepot. Point important puisque le dropshiping, aujourd’hui assez fréquent, entraine des couts de livraison différents.

    La gestion d’un tel module en insérant les stocks dans les différents entrepots permettrait ainsi de resoudre le probleme.

    Il est clair qu’apres avoir effectue quelques recherches, c’est en fait… ton script a toi pour les anciennes versions qui reste le plus conseillé ! Sans te jeter des fleurs, j’ai meme eu des retours de personnes qui ne sont pas passés a la V1.5 pour garder la fonctionnalité que tu as developpée ! 🙂

    Si tu te laisses tenter et que tu décides de développer le module, je peux, si besoin, te mettre un PrestaShop sur mon serveur dédié. Ca pourra aider pour des tests eventuels, meme si je suppose que tu es egalement bien équipé.

    Et je te reconfirme que ce type de module, s’il est un peu souple pour nous permettre de synchroniser les CSV des différents fournisseurs, nous serait très utile.

  38. Pour être honnête quand la version 1.5 de Prestashop est sortie et que j’ai vu ce qu’on pouvait faire avec les entrepôts je me suis dit que j’allais développer un service pour connecter n’importe quel dropshopper ou ERP en commençant par les plus connus. J’en ai parlé à des amis développeurs mais personne n’a voulu me suivre. Ce blog est un peu un test pour connaître la demande. Ton message me confirme que j’avais bien mis le doigt sur un besoin réelle et que les professionnels utilisant les dropshopper ont bien la même idée sur l’utilisation de Prestashop et des entrepôts. 😉

  39. Effectivement, le probleme est souvent que certains developpeurs se penchent sur le cote « prouesse technique », type concours de celui qui fait la plus belle… prog. plutot que de s’interesser a ce qui peut etre utile. 🙂 . Les developpeurs indépendants comme toi l’ont bien compris. Il n’y a qu’a voir le succès de ton premier script. Résoudre des problemes complexe, c’est bien, mais resoudre des problemes complexes qui peuvent servir à quelque chose, c’est mieux, dans le monde de l’entreprise.

    La recherche fondamentale est necessaire et très utile, les concours de prog créent l’émulation mais répondre a un besoin, c’est tout aussi utile et nécessaire et accessoirement plus facilement rentable 🙂 .

    En tout cas, je partage tout a fait ton point de vue et la synchro est effectivement non seulement utile pour les synchronisation d’articles avec des fournisseurs mais comme tu le soulignes toi aussi, c’est également utile pour une synchro avec les ERP, même si les ERP ne permettent que rarement la génération régulière et automatique d’un export en CSV sans que cela ne soit fait manuellement.

    A priori en permettant une coordination entre les colonnes du CSV et les données possibles de PrestaShop (comme le fait la fonction Import de la 1.5), cela résoudrait le probleme en CRON. A condition de reussir a changer les stocks sans écraser le reste de la fiche produit ou en tout en ne modifiant que ce qui a été modifié dans le CSV.

    Je suis absolument nul en prog, mais si tu te lances dans l’aventure, ce serait vraiment top.

Leave a Comment.