Jump to content

Tarifs particuliers


Recommended Posts

Bonjour,

 

Ayant des tarifs assez particuliers à mettre en place, qui devront s'afficher en fonction du client, j'ai suivi ce tutoriel mais qui est pour la version 1.3 de Prestashop (je suis sur la 1.4.6).

 

J'ai créé un nouveau champ prix_b dans la table product identique au champ prix, inséré un champ modifiable dans l'admin, les modifications fonctionnent, les prix sont bien intégrés dans la base de données, ensuite ça se complique pour affecter le prix en fonction de tel ou tel groupe.

 

Dans le fichier classes/product.php,

 

J'ai déclaré le nouveau prix, ajouté le nom du champ dans la requête SQL :

 

// fetch price & attribute price
 $cacheId2 = $id_product.'-'.$id_product_attribute;
 if (!isset(self::$_pricesLevel2[$cacheId2]))
  self::$_pricesLevel2[$cacheId2] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
  SELECT p.`price`, p.`pricet_b`,
[...]

 

Puis j'essaie d'affecter le type de prix en fonction du groupe :

$GroupCli = $cookie->$id_group;

		if ($GroupCli==2) {
		$price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['pricet_b'] : $specific_price['price'];
		}
		else {
		$price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['price'] : $specific_price['price'];
		}

 

Et ça ne fonctionne pas.

En faisant un echo de $GroupCli, le numéro du groupe apparaît bien en fonction du client mais le prix ne change pas, il y en a seulement un des deux qui s'affiche en fonction des diverses modifications du code ou je ne sait quoi ?

 

Est-ce que j'aurais oublié quelque chose ? Y-a-t-il autre chose à modifier ?

Link to comment
Share on other sites

Non je n'ai toujours pas trouvé la solution :( j'ai refait des tests en faisant un if autour de la requête (si groupe client = 2 utiliser la requête avec pricet_b, sinon utiliser la requête avec p.price mais ça ne fonctionne pas non plus ... Quelqu'un pourrait nous aider ? Je voudrais vraiment trouver la solution :(

Link to comment
Share on other sites

Je m'en veut de ne pas avoir trouvé la solution plus tôt -_- il suffit de ne pas rajouter la partie suivante car la variable $id_group est déjà déclarée plus haut :

 

$GroupCli = $cookie->$id_group;

 

 

Ce qui donne :

 // fetch price & attribute price
 $cacheId2 = $id_product.'-'.$id_product_attribute;
 if (!isset(self::$_pricesLevel2[$cacheId2]))
  self::$_pricesLevel2[$cacheId2] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
  SELECT p.`price`, p.`pricet_b`,
  '.($id_product_attribute ? 'pa.`price`' : 'IFNULL((SELECT pa.price FROM `'._DB_PREFIX_.'product_attribute` pa WHERE id_product = '.(int)($id_product).' AND default_on = 1), 0)').' AS attribute_price,
  p.`ecotax`
  '.($id_product_attribute ? ', pa.`ecotax` AS attribute_ecotax' : '').'
  FROM `'._DB_PREFIX_.'product` p
  '.($id_product_attribute ? 'LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON pa.`id_product_attribute` = '.(int)($id_product_attribute) : '').'
  WHERE p.`id_product` = '.(int)($id_product));  
 $result = self::$_pricesLevel2[$cacheId2];

  if ($id_group==2) {
  $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['pricet_b'] : $specific_price['price'];
  }
  else if ($id_group==1)  {
  $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['price'] : $specific_price['price'];
  }

 

Pour l'instant je n'ai pas rencontré de problème ça semble bien fonctionner =)

Link to comment
Share on other sites

Salut sum41147

 

Cool que tu y soit arrivé!! je vais essayé, mais par contre j’hésite encore car mes produits ont des déclinaisons qui font varier le prix et je ne sais pas comment cela se gère avec cette modification, peux tu me dire ce qu'il se passe si il y a des déclinaisons?

 

merci d'avance

Link to comment
Share on other sites

Bon définitivement je n'y arrive pas, pourrais tu me passer les fichiers que tu as modifié car la je rame trop comme ça je pourrai regarder les modifs que tu as faites...

 

tu arrives a avoir les prix différents dans product.tpl selon le groupe de client? et il s'affichent dans la fiche produits dans le front office?

 

merci d'avance

Link to comment
Share on other sites

Je t'avoue que je n'ai pas encore testé les déclinaisons mais en théorie le prix que tu donne doit écraser le prix de base ? Désolée j'ai voulu faire le test mais mon PC a fait une surchauffe donc je vais le laisser se reposer un peu.

 

Je transmettrai le code un peu plus tard :)

Link to comment
Share on other sites

Bonjour,

bon, vouas avez l'air callés en codes, alors comme je recherche une solution sur le module gestion de groupe, peut-être allez-vous pouvoir m'aider...

En fait, je crée un groupe Comité d'entreprise, et je leur attribue une réduction, jusque là, tout va bien, c'est prévu.

par contre, je voudrai paramétrer un minimum de commande pour pouvoir passer commande.

savez-vous comment faire?

Merci d'avance;)

Link to comment
Share on other sites

Bonjour,

bon, vouas avez l'air callés en codes, alors comme je recherche une solution sur le module gestion de groupe, peut-être allez-vous pouvoir m'aider...

En fait, je crée un groupe Comité d'entreprise, et je leur attribue une réduction, jusque là, tout va bien, c'est prévu.

par contre, je voudrai paramétrer un minimum de commande pour pouvoir passer commande.

savez-vous comment faire?

Merci d'avance;)

 

Pour ma part, je peut remercier les personnes qui prennent du temps pour nous présenter des tutoriels et nous apporter leur aide :)

 

Concernant ton problème, s'il s'agit d'un même minimum de commande pour tout le monde, tu peut le paramétrer depuis le BO de prestashop dans l'onglet Préférences / Produits puis "Montant total minimum requis pour valider une commande :"

 

Si les groupes doivent avoir un minimum de commande différent ça va être plus compliqué, après je n'ai pas regardé, mais je pourrais toujours essayer de t'aider à l'occasion

Link to comment
Share on other sites

Bonsoir,

 

Désolée d'avoir mis du temps à répondre, voici la méthode qui fonctionne chez moi (avec la version de prestashop 1.4.6.2) :

 

Pour le début, tu peut reprendre le tuto de matgrafiks :

 

1 : Créer un nouveau champ dans la base de données par exemple priceb

 

2 : Aller dans le fichier Admin/tabs/AdminProducts.php et ajouter le code suivant après "Pre-tax retail price:" vers la ligne 2540 :

 

<br />
<input size="11" maxlength="14" name="priceb" type="text" value="'.$this->getFieldValue($obj, 'priceb').'"/>'.($currency->format == 2 ? ' '.$currency->sign : '').'<span style="margin-left:13px">Tarif professionnel</span>

 

3 : Dans le fichier classes/Product.php, modifier les lignes suivantes :

 

- En début de fichier :

/** @var float Price in euros */
public   $priceb = 0;

 

- Ajouter le champ dans la fonction getFields() :

$fields['priceb'] = (float)($this->priceb);

 

- Ajouter le champ dans la requête SQL, juste après le commentaire "// fetch price & attribute price" :

self::$_pricesLevel2[$cacheId2] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
  SELECT p.`price`, p.`priceb`,
  '.($id_product_attribute ? 'pa.`price`' : 'IFNULL((SELECT pa.price FROM `'._DB_PREFIX_.'product_attribute` pa WHERE id_product = '.(int)($id_product).' AND default_on = 1), 0)').' AS attribute_price,
  p.`ecotax`
  '.($id_product_attribute ? ', pa.`ecotax` AS attribute_ecotax' : '').'
  FROM `'._DB_PREFIX_.'product` p
  '.($id_product_attribute ? 'LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON pa.`id_product_attribute` = '.(int)($id_product_attribute) : '').'
  WHERE p.`id_product` = '.(int)($id_product));

 

- Et enfin tu met le prix en fonction du groupe :

if ($id_group==2) {
  $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['priceb'] : $specific_price['price'];
  }
  else if ($id_group==1)  {
  $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['price'] : $specific_price['price'];
  }

 

 

 

Et teste bien avec deux comptes clients : un premier avec un premier groupe par défaut, et un deuxième avec un deuxième groupe par défaut.

 

 

J'ai pas encore fait un test complet mais pourtant ça semble fonctionner.

Link to comment
Share on other sites

Quelqu'un pourrait m'aider ? Comme le système des groupes ne me convenait pas (car il faudrait que j'inscrive à la main chaque foi qu'il y a un client le compte client par défaut ça risque de faire lourd à force), j'ai voulu créer un nouveau champ "Code tarif" dans la table Customer, afin de le récupérer dans le fichier Product.php pour pouvoir faire "si codetarif= .. afficher tel prix sinon afficher tel prix".

 

Jusque là, pas de problème, ensuite je me suis bien amusée à tenter de récupérer la valeur dans mon fichier classes/Product.php, j'ai donc déclaré la nouvelle variable public $codetarif; en début de document,

 

Puis ce qui suit :

 

 // fetch price & attribute price
 $cacheId2 = $id_product.'-'.$id_product_attribute;
 if (!isset(self::$_pricesLevel2[$cacheId2]))
  self::$_pricesLevel2[$cacheId2] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
  SELECT p.`price`, p.`pricet14`,
  '.($id_product_attribute ? 'pa.`price`' : 'IFNULL((SELECT pa.price FROM `'._DB_PREFIX_.'product_attribute` pa WHERE id_product = '.(int)($id_product).' AND default_on = 1), 0)').' AS attribute_price,
  p.`ecotax`
  '.($id_product_attribute ? ', pa.`ecotax` AS attribute_ecotax' : '').'
  FROM `'._DB_PREFIX_.'product` p
  '.($id_product_attribute ? 'LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON pa.`id_product_attribute` = '.(int)($id_product_attribute) : '').'
  WHERE p.`id_product` = '.(int)($id_product));  
 $result = self::$_pricesLevel2[$cacheId2];


// ici pour récupérer le code tarif
$id_customer = ((Validate::isCookie($cookie) AND isset($cookie->id_customer) AND $cookie->id_customer) ? (int)($cookie->id_customer) : NULL);
 $codetarif = Db::getInstance()->getRow('
  SELECT `codetarif`, `id_customer`
  FROM `'._DB_PREFIX_.'customer`
  WHERE `id_customer` = '.(int)($cookie->id_customer));
  echo 'Result for id : '.$codetarif['codetarif'];


// Afficher le prix en fonction du code tarif
  if ($codetarif==14) {
  $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['pricet14'] : $specific_price['price'];
  }
  else if ($codetarif==10)  {
  $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['price'] : $specific_price['price'];
  }

 

La valeur code tarif est bien récupérée, par contre j'ai ce message d'erreur :

 

"Notice: Undefined variable: price in C:\wamp\www\alaone\prestashop\classes\Product.php on line 1974"

 

Qui correspond à la dernière ligne du code ci-dessous, situé juste en dessous de ce que j'ai modifié :

 

 // convert only if the specific price is in the default currency (id_currency = 0)
 if (!$specific_price OR !($specific_price['price'] > 0 AND $specific_price['id_currency']))
  $price= Tools::convertPrice($price, $id_currency);

 

Quelqu'un pourrait m'expliquer pourquoi elle n'est plus reconnue ?

Link to comment
Share on other sites

Je crois que c'est bon en fait ça ne récupérait pas le résultat de la requête donc pour info voici mon code :

 

 // fetch price & attribute price
 $cacheId2 = $id_product.'-'.$id_product_attribute;
 if (!isset(self::$_pricesLevel2[$cacheId2]))
  self::$_pricesLevel2[$cacheId2] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
  SELECT p.`price`, p.`pricet14`,
  '.($id_product_attribute ? 'pa.`price`' : 'IFNULL((SELECT pa.price FROM `'._DB_PREFIX_.'product_attribute` pa WHERE id_product = '.(int)($id_product).' AND default_on = 1), 0)').' AS attribute_price,
  p.`ecotax`
  '.($id_product_attribute ? ', pa.`ecotax` AS attribute_ecotax' : '').'
  FROM `'._DB_PREFIX_.'product` p
  '.($id_product_attribute ? 'LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON pa.`id_product_attribute` = '.(int)($id_product_attribute) : '').'
  WHERE p.`id_product` = '.(int)($id_product));  
 $result = self::$_pricesLevel2[$cacheId2];



$id_customer = ((Validate::isCookie($cookie) AND isset($cookie->id_customer) AND $cookie->id_customer) ? (int)($cookie->id_customer) : NULL);
 $codetarif = Db::getInstance()->getRow('
  SELECT `codetarif`, `id_customer`
  FROM `'._DB_PREFIX_.'customer`
  WHERE `id_customer` = '.(int)($cookie->id_customer));



  if ($codetarif['codetarif']==14) {
  $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['pricet14'] : $specific_price['price'];
  }
  else if ($codetarif['codetarif']==10)  {
  $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['price'] : $specific_price['price'];

  }
  else {
  $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['price'] : $specific_price['price'];
  }

 

 

hiiiii :D c'est génial quand ça fonctionne

Link to comment
Share on other sites

Oui ils sont bien identiques, peux tu m'envoyer carrément les fichiers que tu as modifié comme ça je regarde de plus prêt envoi les moi en message privé si tu préfères et bien sur si cela ne te dérange pas...

 

Merci en tout cas de prendre le temps de me répondre c'est cool

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