jeudi 4 mai 2017

Requêtes SQL Prestashop dans excel

Wow, ça faisait bien longtemps que je n'avais pas publié ici !

Alors.
En outil de BI, hé bien, je suis reste un aficionado de Excel.

Et comme les tableaux de bords de presta sont aussi ignobles qu'inutiles, c'est là que se pose la question : et si je faisais mes tableaux de bords prestashop dans excel ?

Pour des raisons de compatibilité de connecteur avec mon ERP, je suis encore sur prestashop 1.5.6.2.
mais bon, pour ce 1er exemple, pas grand chose à modifier pour que ça fonctionne sous PS 1.6

pré-requis : installer la possibilité d'accéder au serveur mysql via excel.
Donc, un petit tour chez oracle à la recherche du fichier mysql-connector-net

On paramètre gentiment sa connexion (excel : onglet données, autres sources, microsoft query)

Et voici votre 1ere requête sql prestashop dans excel :
liste des clients prestashop avec adresses et nombre de commandes passées (ce qui permet d'identifier rapidement ceux qui n'ont jamais commandé sur votre boutique, les coquins)

SELECT ps_customer_0.id_customer, ps_customer_0.active, ps_customer_0.id_gender, ps_customer_0.email, ps_customer_0.lastname, ps_customer_0.firstname, ps_customer_0.newsletter, ps_customer_0.optin, ps_customer_0.date_add, ps_address_0.id_address,
ps_address_0.alias,
ps_address_0.active,
ps_address_0.company,
ps_address_0.lastname,
ps_address_0.firstname,
ps_address_0.address1,
ps_address_0.address2,
ps_address_0.postcode,
ps_address_0.city,
ps_country_lang.`name` AS Country,
ps_state.`name` AS State,
ps_address_0.other,
ps_address_0.phone,
ps_address_0.phone_mobile,
ps_address_0.vat_number,
(
    SELECT COUNT(id_order)
    FROM  admin_objetsdirect.ps_orders orders_0
    WHERE orders_0.id_customer = ps_customer_0.id_customer
    ) as commandes
FROM admin_objetsdirect.ps_customer ps_customer_0
LEFT JOIN admin_objetsdirect.ps_address ps_address_0 ON ps_customer_0.id_customer = ps_address_0.id_customer
LEFT JOIN admin_objetsdirect.ps_country_lang ON admin_objetsdirect.ps_country_lang.id_country = ps_address_0.id_country
LEFT JOIN admin_objetsdirect.ps_state ON admin_objetsdirect.ps_state.id_state = ps_address_0.id_state
GROUP by ps_customer_0.id_customer

Et hop ! tout le temps à jour !

vendredi 20 mai 2016

Prestashop 1.5.6.2, Paypal et les arrondis

Ahh, voici ici 2 logiques de calcul des prix qui s'affrontent.

Bref, Prestashop, au niveau du panier, annonce un prix total TTC, qui n'est pas le même que celui récupéré sur Paypal.
Gênant, hein.

Le truc, c'est que Paypal calcule lui-même le prix TTC des produits individuels, puis les multiplie par la quantité. D'où de jolis problèmes d'arrondis.

Plutôt que plonger dans le code dumodule paypal, j'ai préféré adapter prestashop à la logique Paypal :
Modif de la classe/cart.php

$total_price = Tools::ps_round($total_price + $total_ecotax, 2);

DEVIENT

$total_price = Tools::ps_round($product['price_wt'] * (int)$product['cart_quantity'], 2);

Et voilà. Les montants sont désormais identiques.

mardi 7 avril 2015

Ré-écriture htaccess : supprimer les espaces dans les url

Petite astuce pour remplacer les espaces dans les url par des tirets :

RewriteCond %{THE_REQUEST} (\s|%20)
RewriteRule ^([^\s%20]+)(?:\s|%20)+([^\s%20]+)((?:\s|%20)+.*)$ $1-$2$3 [N,DPI]
RewriteRule ^([^\s%20]+)(?:\s|%20)+(.*)$ /$1-$2 [L,R=301,DPI]


Autre astuce :
si vous devez rediriger une URL avec espace vers une autre (toujours en htaccess)

RewriteRule ^nom\ de\ la-page.html$ http://nouvelleurl [R=301,L]

Voilà

jeudi 11 décembre 2014

Du e-commerce et du jquery == de la personnalisation en ligne

Une fois n'est pas coutume, une petite présentation d'un travail.

La boutique en question : enseignes en ligne http://mon-enseigne.fr

Le moteur : une base e-commerce. (oscss, pour changer de prestashop, tiens)

Le plug-in jquery utilisé : Fancy Product Designer, chez envato
http://codecanyon.net/item/fancy-product-designer-jquery-plugin/3581183?WT.mc_id=item_update_email&utm_content=sysemail&utm_keyword=sysemail&utm_medium=sysemail&utm_source=sysemail&utm_term=sysemail

Le but ; personnalisation du plugin + intégration au processus de commande.


jeudi 9 octobre 2014

Prestashop 1.5 : afficher les messages des commandes dans le BO

Yop yop yop

Alors comme ça, les messages que l'on envoie aux clients ne sont plus affichés dans le détail des commandes du BO ?

classes/Message.php

ligne 91

On remplace la fonction getMessagesByOrderId par celle ci :

public static function getMessagesByOrderId($id_order, $private = false, Context $context = null)
{
   if (!Validate::isBool($private))
    die(Tools::displayError());
  if (!$context)
   $context = Context::getContext();
  $m = Db::getInstance()->executeS('
   SELECT m.*, c.`firstname` AS cfirstname, c.`lastname` AS clastname, e.`firstname` AS efirstname, e.`lastname` AS elastname,
   (COUNT(mr.id_message) = 0 AND m.id_customer != 0) AS is_new_for_me
   FROM `'._DB_PREFIX_.'message` m
   LEFT JOIN `'._DB_PREFIX_.'customer` c ON m.`id_customer` = c.`id_customer`
   LEFT JOIN `'._DB_PREFIX_.'message_readed` mr
    ON mr.`id_message` = m.`id_message`
    AND mr.`id_employee` = '.(isset($context->employee) ? (int)$context->employee->id : '\'\'').'
   LEFT OUTER JOIN `'._DB_PREFIX_.'employee` e ON e.`id_employee` = m.`id_employee`
   WHERE m.`id_order` = '.(int)$id_order.'
   '.(!$private ? ' AND m.`private` = 0' : '').'
   GROUP BY m.id_message
   ORDER BY m.date_add DESC
  ');

  $o = Db::getInstance()->executeS('
   SELECT ct.*, m.*, e.`firstname` AS efirstname, e.`lastname` AS elastname
   FROM `'._DB_PREFIX_.'customer_thread` ct
   LEFT JOIN `'._DB_PREFIX_.'customer_message` m ON m.`id_customer_thread` = ct.`id_customer_thread`
   LEFT OUTER JOIN `'._DB_PREFIX_.'employee` e ON e.`id_employee` = m.`id_employee`
   WHERE ct.`id_order` = '.(int)$id_order.'
   ORDER BY ct.`date_add` DESC'
  );

  return array_merge($o,$m);

}

mardi 17 septembre 2013

Prestashop 1.5 --> redirection htaccess www

problématique du jour :

La boutique en question est accessible sans les www.
http://domaine.extension

Classique, presta génère son htaccess en prévoyant le cas de figure, c'est bon.
Hé ben non.

Ca génère du 404 à la volée pour tous les appels www

Hé bien..puisque nous n'avons pas accès (en un temps acceptable, merci les agences de com') à la gestion DNS, on va régler le problème via htaccess

RewriteCond %{REQUEST_URI} !^/fr/
RewriteRule ^(en|es|it|de)/(.*)$ http://domaine.extension/fr/$2 [QSA,R=301,L]
RewriteCond %{HTTP_HOST} !^domaine\.extension$ [NC]
RewriteCond %{REQUEST_URI} ^/fr/
RewriteRule ^(.*)$ http://domaine.extension/$1 [QSA,R=301,L]
RewriteCond %{HTTP_HOST} !^domaine\.extension$ [NC]
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ http://domaine.extension/$1 [QSA,R=301,L]

A y'est, tout le traffic www rebascule bien sur le domaine sans générer de 404.

vendredi 28 juin 2013

Prestashop 1.4.10 : conserver filtre manufacturer sur tout le site

Problème du jour :
- Site avec quelques fournisseurs et 5 catégories ---> conserver le filtre "fournisseur" quand on change de catégorie.
Donc, les catégories deviennent dynamiquement :
- catégorie1 fournisseur1

Le truc, donc, c'est de récupérer l'id_manufacturer et de la déployer dans les requêtes SQL et la génération des liens.

On commence par :
le listing produit.
classes/Category.php

Nous modifions public function getProducts
ligne 535
$id_supplier = (int)(Tools::getValue('id_supplier'));
en dessous :
$id_manufacturer = (int)(Tools::getValue('id_manufacturer'));

Pour le nombre d eproduits correspondant au filtre fournisseur :
Dans la requête if ($getTotal) (ligne 541)
WHERE cp.`id_category` = '.(int)($this->id).($active ? ' AND p.`active` = 1' : '').'
'.($id_supplier ? 'AND p.id_supplier = '.(int)($id_supplier) : ''));

on rajoute le test d'existence du manufacturer

WHERE cp.`id_category` = '.(int)($this->id).($active ? ' AND p.`active` = 1' : '').'
'.($id_manufacturer ? 'AND p.id_manufacturer = '.(int)$id_manufacturer : '').'
'.($id_supplier ? 'AND p.id_supplier = '.(int)($id_supplier) : ''));

idem dans la requete du dessous
A la ligne 567 :
WHERE cp.`id_category` = '.(int)($this->id).($active ? ' AND p.`active` = 1' : '').'
'.($id_manufacturer ? 'AND p.id_manufacturer = '.(int)$id_manufacturer : '').'
'.($id_supplier ? 'AND p.id_supplier = '.(int)$id_supplier : '');

On va désormais dans controllers/CategoryController.php
Et on va assigner au template smarty le nom du manufacturer (histoire de bien préciser, dans l'entete du listing produit, qu'on affiche les résultats correspondants à un fabriquant bien spécifique)

ligne 173, on rajoute :
$id_manufacturer = (int)(Tools::getValue('id_manufacturer'));
$name2 = Manufacturer::getNameById($id_manufacturer);
self::$smarty->assign('namemanu', $name2);
namemanu devient donc la variable smarty qui affichera le nom du fabriquant

Le tpl category-count.tpl
ligne 30, à la fin (après le {/if}, on rajoute : de la marque {$namemanu}
Ca donnera un truc du genre :
categorie1 il y a 16 produits de la marque xxxxx

Bon.
Désormais, il va falloir :
ajouter l'id_manufacturer aux liens produits (pour que le filtre soit conservé tout le temps)
ajouter le nom du fabriquant aux item de menu principal (histoire de bien expliquer qu'on est dans une boutique filtrée par fabriquant)

classes/Link.php
on modifie public function getProductLink
sous global $cookie;

on rajoute

$id_manufacturer = (int)(Tools::getValue('id_manufacturer'));


toutes les occurences

$link .= (_PS_BASE_URL_.__PS_BASE_URI__.'product.php?id_product='.(int)$id_product->id
deviennent :

$link .= (_PS_BASE_URL_.__PS_BASE_URI__.'product.php?id_product='.(int)$id_product->id.''.($id_manufacturer ? '&id_manufacturer='.(Tools::getValue('id_manufacturer')) : ''));


pour le menu :
Bon, là, ca dépend du mofule utilisé, mais généralement, on retrouve toujours une fonction getCategory
avec généralement le 
$name = $categorie->name;
En dessous, on rajoute :
  $id_manufacturer = (Tools::getValue('id_manufacturer'));
   $name2 = Manufacturer::getNameById($id_manufacturer);
    $this->_menu .= ''.$name.'
'.$name2.'
';

Voili voilou