Jump to content

[Résolu] Récupérer les messages client dans un CSV


Recommended Posts

Bonjour à tous et à toutes,

J'administre 3 sites Internet sous Prestashop.

Pour une obscure raison, la personne que je remplace à ce poste, n'a pas fait de multiboutique mais bien 3 sites/boutiques distinct(e)s.

(Je vais essayer de faire court) Comme mon prédécesseur touchait sa bille en programmation (contrairement à moi qui débute), il a développé plusieurs modules dont 1 pour préparer les commandes, qui va chercher, sur les 3 sites, les informations sur les commandes (N° commande, qui a commandé, quel transporteur, quel produit ont été commandés, ... ET les éventuels messages des clients) pour les combiner dans un fichier CSV.

Tous les matins, la personne qui s'occupe de préparer les commandes, lance ce module sur le site maitre (sur lequel est rapatrié toutes les infos sur les commandes des 2 autres sites) pour générer le fichier CSV, imprimer cette liste de commandes et aller chercher les produits correspondants.

Si je viens poser ma question aujourd'hui, c'est parce qu'il y a un bug sur ce module : depuis quelque temps, pour une raison encore inconnue, certains messages laissés par les clients ou par nous en interne, ne remontent pas et n'apparaissent pas sur ce fichier CSV.

En cherchant dans le dossier du module en question, où étaient appelés/récupérés les messages, j'ai trouvé les lignes de code suivantes dans /classes/orderArrayCreator.class.php :

foreach ($orderList as $line) {
            $message = DB::getInstance()->getValue("SELECT message
					FROM " . pSQL(_DB_PREFIX_) . "customer_message cm
					LEFT JOIN " . pSQL(_DB_PREFIX_) . "customer_thread ct ON (cm.id_customer_thread=ct.id_customer_thread)
					WHERE ct.id_order = " . (int)$line['id_order'] . "
					AND cm.id_customer_message = 
					(
					SELECT max(id_customer_message)  FROM " . pSQL(_DB_PREFIX_) . "customer_message cm
					WHERE ct.id_order = " . (int)$line['id_order'] . "
					)"
                  );
    $tab = array( CHR(13) => " ", CHR(10) => " ");
    $messageModified = strtr($message, $tab);
    $messageReduced = '';
                
    if ($messageModified != '') {
    $messageReduced = Tools::substr($messageModified, 0, 50) . ' [...]';
            }

puis, plus loin dans le fichier, le code suivant :

$customerThreadToGet = array(
                            'resource'          =>'customer_threads',
                            'display'           => '[id]',
                            'filter[id_order]' => '[' . $id_order . ']'
                        );
                        $xml_thread = $webService_getOrder->get($customerThreadToGet);
                        $thread_resources = $xml_thread->customer_threads->children();
                        $thread = (int)$thread_resources->customer_thread->id;
                        
                        $messageToGet = array(
                            'resource'          =>'customer_messages',
                            'display'           => '[message]',
							'sort'     => '[id_DESC]',
                            'filter[id_customer_thread]' => '[' . $thread . ']'
                        );
                        $xml_thread = $webService_getOrder->get($messageToGet);
                        $message_resources = $xml_thread->customer_messages->children();
                        $message = (string)$message_resources->customer_message->message;

(Dites-moi si je me trompe dans mon interprétation) Dans la première partie du code, on voit qu'on demande à aller chercher le message dans la table ps_customer_message en fonction de l'id_customer_thread. La table ps_customer_thread fait la jonction/le lien entre le N° de la commande (id_order) et l'id_customer_thread.

Dans la seconde partie du code, dans la table ps_customer_thread on filtre par N° de commande (id_order) puis dans la table ps_customer_message, on filtre par id_customer_thread et on tri par ordre décroissant de façon à récupérer le dernier message.

(Par rapport au code ci-dessus et étant relativement débutant en programmation) Pouvez-vous m'aider SVP à comprendre pourquoi ce module bugue et pourquoi certains messages ne sont pas récupérés ?

Un grand merci par avance pour votre aide.

Bonne journée ;)

Edited by spip93
Problème résolu (see edit history)
Link to comment
Share on other sites

Comment je peux savoir si les droits sont bloqués sur le webservice ? Comment je peux les débloquer si c'est le cas ?

Ça expliquerait pourquoi certains messages remontent et pas d'autres ?

 

Edit : Dans la procédure d'installation, mon prédécesseur a laissé des instructions, notamment de placer un fichier WebserviceRequest dans /override/classes/webservice . Je suis allé voir les droits d'accès pour ce fichier et c'est en 644.

Il faudrait que je les mette en quoi pour débloquer la situation ? 744 ? 755 ? Voire 777 ?

Edited by spip93 (see edit history)
Link to comment
Share on other sites

Je viens de faire un test sur une commande dont le message posté en interne ne remontait pas : j'ai reposté le message (toujours en interne, avec un "2" après pour différencier les messages) et, comme le système prend en compte le dernier message posté, celui-ci est (enfin) remonté.
Je ne comprends pas, pourquoi est-ce que le système n'a pas fait remonter le message initial alors que c'était (à mes yeux) le dernier posté, pour cette commande, à ce moment là ?

D'après ce que je vois (et comprends) dans le code, on demande de faire un tri décroissant par id_customer_thread. Est-ce qu'il ne faudrait pas mieux faire un tri par date de mise à jour (date_upd) ou d'ajout (date_add) ? Si oui, comment faire 1) pour qu'il fasse un tri décroissant par date d'ajout/mise à jour (du plus récent au plus vieux) et 2) qu'il prenne en compte le dernier message en date ?

Link to comment
Share on other sites

Les droits d'un répertoire doivent être en 755 et un fichier en 644

Le problème me semble venir du fait que la requête sélectionne le customer_thread d'un coté et le max(id_customer_message) de l'autre

Pour débugguer le plus simple est de copier la requête dans ton phpmyadmin et de la triturer pour lui faire retourner le bon résultat

Link to comment
Share on other sites

Bonjour,

Mon problème est résolu hier avec la (grande) aide d'une personne sur un autre forum. Encore merci à elle, si elle me lit.
Après quelques tentatives, cette personne a trouvé le code à mettre en remplacement de la première partie. Le voici pour ceux que ça intéresse :

$message = DB::getInstance()->getValue("SELECT message
                    FROM " . pSQL(_DB_PREFIX_) . "customer_message cm
                    LEFT JOIN " . pSQL(_DB_PREFIX_) . "customer_thread ct ON (cm.id_customer_thread=ct.id_customer_thread)
                    WHERE ct.id_order = " . (int)$line['id_order'] . "
                    ORDER BY cm.id_customer_message DESC"
                                                  );

Bonne journée ;)

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