Jump to content

Demande création module : limiter la quantité d'achat d'un produit donné par client


Had

Recommended Posts

Bonjour,

Actuellement en train de developper un site prestashop (version 1.3.7), une des contraintes de mon cahier des charges est de limiter la quantité d'achat pour un client donné, non pas dans le panier mais par produit.

Ex: 1 produit à un stock = 100, je veux que le client ne puisse commander que 10 exemplaires maximum.

A moins que personne ne puisse m'indiquer la marche suivre généreusement, je fais donc appel à la communauté de développeurs pour la création d'un module; Dans ce cas quel serait le délais de réalisation ainsi que le prix ?

En passant, il me semble que prestashop permet à n'importe qui de s'inscrire sous différentes adresses mail; Existe t il un moyen de "tracker" un client de façon ce que celui ci ne puisse s'inscrire qu'une seule et unique fois ?

Encore merci d'avance :)

ps: J'ai par ailleurs parcouru tout le forum, sans réelle réponse précise, c'est pourquoi je me décide à poster.

Link to comment
Share on other sites

Bon alors apres reflexions et recherches :

Existe t il une fonction permettant de repérer la quantité de produit achetés par un client (pour un produit donné), et de spécifier en utilisant la condition {if} que si le client à commander x quantité de produit, que les boutons "ajouter au panier" et "commander" disparaissent ?

est ce possible ? une indication please ? je suis prêt à mettre les mains dans le camboui :)

Link to comment
Share on other sites

  • 2 weeks later...

Pour des raisons top secrètes et obscures ! Cela peut paraitre bizarre mais oui, un par personne, pas plus! Ce que l'on demande c'est si quelqu'un a une idée pour limiter le panier à un produit (ou 10 pour Had). Donc rien à voir avec un refus de vente, c'est un produit par commande, je peux pas vous en dire plus sur les raisons !

Link to comment
Share on other sites

Pour des raisons top secrètes et obscures ! Cela peut paraitre bizarre mais oui, un par personne, pas plus! Ce que l'on demande c'est si quelqu'un a une idée pour limiter le panier à un produit (ou 10 pour Had). Donc rien à voir avec un refus de vente, c'est un produit par commande, je peux pas vous en dire plus sur les raisons !

je veux bien comprendre que pour des produits spéciaux on limite les quantités d'achats mais pour des cadeaux je ne comprend pas pourquoi on ne peut pas t'acheter plusieurs même cadeaux !! le comité d'entreprise de ma femme a fait un loto et il y avait par exemple 3 même lot de cafetières!! si on aurait commandé chez toi on n'aurait pas pu , tu aurais perdu des clients !!
comprend bien que je n'ai rien contre toi ni ne cherche à t'agresser , je cherche juste à comprendre ;)

maintenant libre à toi de ne vendre qu'un seul et même produit et te souhaite de réussir très longtemps ;)
il me semble avoir vu un sujet en anglais qui expliquer cela je vais essayer de le retrouver !!, bien que j'ai déjà regardé mais plus moyen de savoir ou !
si je le trouve je te donnerai le lien ;)
Link to comment
Share on other sites

C'est super cool merci, ce n'est pas pour de la vente de cadeaux que je souhaite limiter le panier mais pour autre chose. J'ai bien compris ta démarche, je faisais de l'ironie ! Je ne l'ai pas pris pour une agression ! Par contre si le CE de ta femme souhaite offrir des super cadeaux rendez vous dans quelques mois, elle ne sera pas déçue ! Mais rien à voir avec le sujet... Si tu retrouves l'astuce n'hésites pas, merci beaucoup.

Link to comment
Share on other sites

  • 3 weeks later...

Bonjour,

Je suis aussi à la recherche de fonctions pouvant permettre le refus de commande si le max autorisé est atteint.
Il faut ajouter une fonction dans le module "block-cart", dans le fichier ajax-cart.js

ici l.8 (correspond aux "ajouter au panier" de tout le site...):

        $('.ajax_add_to_cart_button').unbind('click').click(function(){
           var idProduct =  $(this).attr('rel').replace('ajax_id_product_', '');
           ajaxCart.add(idProduct, null, false, this);
           return false;
       });




ou ici (correspond aux "ajouter au panier" du fichier product.tpl...):


        $('body#product p#add_to_cart input').unbind('click').click(function(){
           ajaxCart.add( $('#product_page_product_id').val(), $('#idCombination').val(), true, null, $('#quantity_wanted').val(), null);
           return false;
       });




Il suffirait de rajouter une fonction de type "Si Quantité de product == x alors j'ajoute ou non..."
Mon souçi est que je ne sais pas comment rechercher tous les produits existants dans le panier pour l'instant... Si quelqu'un saurait faire, ca avancerait tout le monde sur ce post =)
Merci d'avance !

Link to comment
Share on other sites

Bonjour Hafede
J'aimerais savoir
Si vous voulez un seul produit par commande ,donc un seul produit par utilisateur ou pas ?
Il y a t'il aussi a prendre en compte "une date de validité"

Exemple:
Si Mr Y acheté 1 Produit Z = blocage commande sur X mois pour ensuite 1 nouvel achat possible
(Question peu être idiote , mais m en fiche je la pose :P )


Sinon au final va falloir faire une demande dans la partie Appels d’offres et prestations

Link to comment
Share on other sites

  • 4 weeks later...
  • 3 months later...

Up Up Up !

 

Hello,

 

Je suis dans le même cas. En gros si stock = 100 pour un produit, il faudrait que le client ne puisse pas acheter 2 fois le même produit. (il y aurait donc 100 client différent sur ce produit jusqu'à rupture de stock)

 

Il faudrait alors qu'il y est un lien entre le compte (nom, adresse mail...) pour vérifier s'il a déjà acheter le produit, auquel cas = message du genre "Vous avez déjà acheté ce produit".

 

 

Je souhaite mettre ce système en place pour la vente de ticket tombola. Et il faudrait que les clients ne dispose pas plus d'un ticket pour l'égalité des chances de gains !

 

 

Un génie parmi nous ?

 

Merci d'avance

Link to comment
Share on other sites

  • 4 weeks later...
  • 2 months later...
  • 1 month later...
  • 2 months later...
  • 2 weeks later...

Bonjour,

 

Je suis intéressée par cette option. Je vends des coupons de tissus par multiple de 25cm et le maximum d'un seul tenant est 1 mètre (soit quantité 4) Souvent les clients se trompent et marque 5 ou 6 quantités. Je suis donc obligée de leur dire qu'il vont recevoir 2 coupons ( un de 1metre et un autre de 25cm pour quantité 5) souvent c'est une erreur du client qui souhaite qu'un seul coupon.

 

Merci si quelqu'un a une idée.

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

Bonjour,

 

Si tout se passe comme prévu, je sortirai bientôt un module semblable, plus simpliste, permettant de limiter les lignes de produits au panier ainsi que la quantité individuelle des produits.

 

Il sera payant mais beaucoup moins cher que celui-ci (prix minimum sur Addons).

 

A suivre ;)

 

EDIT : je viens de finir le module, il ne reste donc plus qu'à écrire la doc + proposer sur Addons.

Comptez quelques jours avant la validation et la disponibilité.

Compatible 1.4.

Link to comment
Share on other sites

  • 3 weeks later...

Bonjour,

Je serais intéressé par ce module, cela me permettrait d'offrir des échantillons à un client lorsqu'il passe une commande mais sans que le client ne puisse abuser du système (en augmentant le nombre d'échantillons gratuits, qui seraient limités à 1)

 

Où en est la doc ? Est-ce qu'il est dans les addons ?

Merci d'avance

Link to comment
Share on other sites

  • 5 months later...

bonjour,

module acheté mais ne fonctionne pas !

BO :quelque soit la valeur entrée dans les champs de config du module

FO -> plus aucun produit ne peut être placé dans le panier

 

pour version 1.5.2.0 -> modifier les chemins dans pscartlimitation.php -> boutique\override\controllers\front

 

une idée de correction ?

mes produits se vendent quantité max par 1 !!!!!

merci

Link to comment
Share on other sites

bonjour,

à défaut d'un module fonctionnel, bricolage :

 

pour faire disparaitre le choix de la quantité au moment de l'affichage du produit et donc forcer la quantité à "1",

dans le répertoire themes\default [ou nom du theme]\ éditer le fichier product.tpl

 

y rechercher le commentaire <!-- quantity wanted -->

juste en dessous du commentaire passer <label>...</label> en commentaire

et en dessous modifier le <input type de "text" a "hidden"

 

basique en attendant patch du module acheté

Link to comment
Share on other sites

  • 4 months later...

Bonjour,

 

Je cherchais également une option de ce genre.

J'ai repris la solution de mcve et l'ai un tout petit peu développé pouvoir cibler un produit en particulier, tout en conservant la champs text, avec une quantité de 1 non-modifiable.

Ainsi, toujours le fichier product.tpl, ligne 355, j'ai entouré l'input text comme suit :

 

{if ($product->id) == votre_id_produit } <!--ajout 1-->

<input type="text" name="qty" id="quantity_wanted" class="text" value="1" size="2" maxlength="1" readonly="true"/> <!--ajout 2-->

{else} <!--ajout 3-->

<input type="text" name="qty" id="quantity_wanted" class="text" value="{if isset($quantityBackup)}{$quantityBackup|intval}{else}{if $product->minimal_quantity > 1}{$product->minimal_quantity}{else}1{/if}{/if}" size="2" maxlength="3" {if $product->minimal_quantity > 1}onkeyup="checkMinimalQuantity({$product->minimal_quantity});"{/if} />

{/if} <!--ajout 4-->

Link to comment
Share on other sites

  • 1 month later...

Pour bloquer l'achat d'un seul produit par panier/commande il est préconisé d'utiliser la technique dite de "L'override".

 

Avant toutes manipulations, sauvegardé votre fichier original : /override/controllers/front/CartController.php

 

Si les manipulations si dessous ne fonctionnent pas ou si vous voulez revenir à un état normal, remplacé votre fichier modifier par l'original CartController.php dans /override/controllers/front/

 

 

- Pour Prestashop 1.4 essayer ça :

 

mettre tout ça dans /override/controllers/front/CartController.php

 

<?php
class CartController extends CartControllerCore
{
public function preProcess()
{
 $orderTotal = self::$cart->getOrderTotal(true, Cart::ONLY_PRODUCTS);
 $this->cartDiscounts = self::$cart->getDiscounts();
 foreach ($this->cartDiscounts AS $k => $this->cartDiscount)
  if ($error = self::$cart->checkDiscountValidity(new Discount((int)($this->cartDiscount['id_discount'])), $this->cartDiscounts, $orderTotal, self::$cart->getProducts()))
self::$cart->deleteDiscount((int)($this->cartDiscount['id_discount']));
 $add = Tools::getIsset('add') ? 1 : 0;
 $delete = Tools::getIsset('delete') ? 1 : 0;
 if (Configuration::get('PS_TOKEN_ENABLE') == 1
 && strcasecmp(Tools::getToken(false), strval(Tools::getValue('token')))
 && self::$cookie->isLogged() === true)
  $this->errors[] = Tools::displayError('Invalid token');
 // Update the cart ONLY if $this->cookies are available, in order to avoid ghost carts created by bots
 if (($add OR Tools::getIsset('update') OR $delete) AND isset($_COOKIE[self::$cookie->getName()]))
 {
  //get the values
  $idProduct = (int)(Tools::getValue('id_product', NULL));
  $idProductAttribute = (int)(Tools::getValue('id_product_attribute', Tools::getValue('ipa')));
  $customizationId = (int)(Tools::getValue('id_customization', 0));
  $qty = (int)(abs(Tools::getValue('qty', 1)));
  if ($qty == 0)
$this->errors[] = Tools::displayError('Null quantity');
  elseif (!$idProduct)
$this->errors[] = Tools::displayError('Product not found');
  else
  {
$producToAdd = new Product((int)($idProduct), true, (int)(self::$cookie->id_lang));
if ((!$producToAdd->id OR !$producToAdd->active) AND !$delete)
 if (Tools::getValue('ajax') == 'true')
  die('{"hasError" : true, "errors" : ["'.Tools::displayError('Product is no longer available.', false).'"]}');
 else
  $this->errors[] = Tools::displayError('Product is no longer available.', false);
else
{
 /* Check the quantity availability */
 if ($idProductAttribute AND is_numeric($idProductAttribute))
 {
  if (!$delete AND !$producToAdd->isAvailableWhenOutOfStock($producToAdd->out_of_stock) AND !Attribute::checkAttributeQty((int)$idProductAttribute, (int)$qty))
   if (Tools::getValue('ajax') == 'true')
	die('{"hasError" : true, "errors" : ["'.Tools::displayError('There is not enough product in stock.', false).'"]}');
   else
	$this->errors[] = Tools::displayError('There is not enough product in stock.');
 }
 elseif ($producToAdd->hasAttributes() AND !$delete)
 {
  $idProductAttribute = Product::getDefaultAttribute((int)$producToAdd->id, (int)$producToAdd->out_of_stock == 2 ? !(int)Configuration::get('PS_ORDER_OUT_OF_STOCK') : !(int)$producToAdd->out_of_stock);
  if (!$idProductAttribute)
   Tools::redirectAdmin($link->getProductLink($producToAdd));
  elseif (!$delete AND !$producToAdd->isAvailableWhenOutOfStock($producToAdd->out_of_stock) AND !Attribute::checkAttributeQty((int)$idProductAttribute, (int)$qty))
   if (Tools::getValue('ajax') == 'true')
	die('{"hasError" : true, "errors" : ["'.Tools::displayError('There is not enough product in stock.', false).'"]}');
   else
	$this->errors[] = Tools::displayError('There is not enough product in stock.');
 }
 elseif (!$delete AND !$producToAdd->checkQty((int)$qty))
  if (Tools::getValue('ajax') == 'true')
	die('{"hasError" : true, "errors" : ["'.Tools::displayError('There is not enough product in stock.').'"]}');
   else
	$this->errors[] = Tools::displayError('There is not enough product in stock.');
 /* Check vouchers compatibility */
 if ($add AND (($producToAdd->specificPrice AND (float)($producToAdd->specificPrice['reduction'])) OR $producToAdd->on_sale))
 {
  $discounts = self::$cart->getDiscounts();
  $hasUndiscountedProduct = null;
  foreach($discounts as $discount)
  {
   if (is_null($hasUndiscountedProduct))
   {
	$hasUndiscountedProduct = false;
	foreach(self::$cart->getProducts() as $product)
	 if ($product['reduction_applies'] === false)
	 {
	  $hasUndiscountedProduct = true;
	  break;
	 }
   }
   if (!$discount['cumulable_reduction'] && ($discount['id_discount_type'] != 1 || !$hasUndiscountedProduct))
	if (Tools::getValue('ajax') == 'true')
	 die('{"hasError" : true, "errors" : ["'.Tools::displayError('Cannot add this product because current voucher does not allow additional discounts.').'"]}');
	else
	 $this->errors[] = Tools::displayError('Cannot add this product because current voucher does not allow additional discounts.');

  }
 }
 if ($add && $qty >= 0 && Tools::getValue('op', 'up') == 'up')
																if ((self::$cart->nbProducts() + $qty) > 1)
																	if (Tools::getValue('ajax') == 'true')
																		die('{"hasError" : true, "errors" : ["'.Tools::displayError('Votre panier ne doit contenir qu\'un seul produit.', false).'"]}');
																	else
																		$this->errors[] = Tools::displayError('Votre panier ne doit contenir qu\'un seul produit.');


 if (!sizeof($this->errors))
 {
  if ($add AND $qty >= 0)
  {
   /* Product addition to the cart */
   if (!isset(self::$cart->id) OR !self::$cart->id)
   {
	self::$cart->add();
	if (self::$cart->id)
	 self::$cookie->id_cart = (int)(self::$cart->id);
   }
   if ($add AND !$producToAdd->hasAllRequiredCustomizableFields() AND !$customizationId)
	$this->errors[] = Tools::displayError('Please fill in all required fields, then save the customization.');
   if (!sizeof($this->errors))
   {
	$updateQuantity = self::$cart->updateQty((int)($qty), (int)($idProduct), (int)($idProductAttribute), $customizationId, Tools::getValue('op', 'up'));
	if ($updateQuantity < 0)
	{
	 /* if product has attribute, minimal quantity is set with minimal quantity of attribute*/
	 if ((int)$idProductAttribute)
	  $minimal_quantity = Attribute::getAttributeMinimalQty((int)$idProductAttribute);
	 else
	  $minimal_quantity = $producToAdd->minimal_quantity;
	 if (Tools::getValue('ajax') == 'true')
	  die('{"hasError" : true, "errors" : ["'.Tools::displayError('You must add', false).' '.$minimal_quantity.' '.Tools::displayError('Minimum quantity', false).'"]}');
	 else
	  $this->errors[] = Tools::displayError('You must add').' '.$minimal_quantity.' '.Tools::displayError('Minimum quantity')
	  .((isset($_SERVER['HTTP_REFERER']) AND basename($_SERVER['HTTP_REFERER']) == 'order.php' OR (!Tools::isSubmit('ajax') AND substr(basename($_SERVER['REQUEST_URI']),0, strlen('cart.php')) == 'cart.php')) ? ('<script language="javascript">setTimeout("history.back()",5000);</script><br />- '.
	  Tools::displayError('You will be redirected to your cart in a few seconds.')) : '');
	}
	elseif (!$updateQuantity)
	{
	 if (Tools::getValue('ajax') == 'true')
	  die('{"hasError" : true, "errors" : ["'.Tools::displayError('You already have the maximum quantity available for this product.', false).'"]}');
	 else
	  $this->errors[] = Tools::displayError('You already have the maximum quantity available for this product.')
	  .((isset($_SERVER['HTTP_REFERER']) AND basename($_SERVER['HTTP_REFERER']) == 'order.php' OR (!Tools::isSubmit('ajax') AND substr(basename($_SERVER['REQUEST_URI']),0, strlen('cart.php')) == 'cart.php')) ? ('<script language="javascript">setTimeout("history.back()",5000);</script><br />- '.
	  Tools::displayError('You will be redirected to your cart in a few seconds.')) : '');
	}
   }
  }
  elseif ($delete)
  {
   if (self::$cart->deleteProduct((int)($idProduct), (int)($idProductAttribute), (int)($customizationId)))
	if (!Cart::getNbProducts((int)(self::$cart->id)))
	{
	 self::$cart->id_carrier = 0;
	 self::$cart->gift = 0;
	 self::$cart->gift_message = '';
	 self::$cart->update();
	}
  }
 }
 $discounts = self::$cart->getDiscounts();
 foreach($discounts AS $discount)
 {
  $discountObj = new Discount((int)($discount['id_discount']), (int)(self::$cookie->id_lang));
  if ($error = self::$cart->checkDiscountValidity($discountObj, $discounts, self::$cart->getOrderTotal(true, Cart::ONLY_PRODUCTS), self::$cart->getProducts()))
  {
   self::$cart->deleteDiscount((int)($discount['id_discount']));
   self::$cart->update();
   $errors[] = $error;
  }
 }
 if (!sizeof($this->errors))
 {
  $queryString = Tools::safeOutput(Tools::getValue('query', NULL));
  if ($queryString AND !Configuration::get('PS_CART_REDIRECT'))
   Tools::redirect('search.php?search='.$queryString);
  if (isset($_SERVER['HTTP_REFERER']))
  {
   // Redirect to previous page
   preg_match('!http(s?)://(.*)/(.*)!', $_SERVER['HTTP_REFERER'], $regs);
   if (isset($regs[3]) AND !Configuration::get('PS_CART_REDIRECT') AND Tools::getValue('ajax') != 'true')
	Tools::redirect($_SERVER['HTTP_REFERER']);
  }
 }
}
if (Tools::getValue('ajax') != 'true' AND !sizeof($this->errors))
 Tools::redirect('order.php?'.(isset($idProduct) ? 'ipa='.(int)($idProduct) : ''));
  }
 }
}
}

 

- Pour Prestashop 1.5 essayer ça :

Mettre tout ça dans /override/controllers/front/CartController.php

 

<?php
class CartController extends CartControllerCore
{

public $php_self = 'cart';
protected $id_product;
protected $id_product_attribute;
protected $id_address_delivery;
protected $customization_id;
protected $qty;
protected $ajax_refresh = false;

public function postProcess(){			

			$actual_cart = $this->context->cart->getProducts(true);
 // Update the cart ONLY if $this->cookies are available, in order to avoid ghost carts created by bots
 if ($this->context->cookie->exists() && !$this->errors && !($this->context->customer->isLogged() && !$this->isTokenValid()))
 {
  if (Tools::getIsset('add') && $actual_cart[0]['cart_quantity'] < '1' || Tools::getIsset('update') && $actual_cart[0]['cart_quantity'] < '1' || Tools::getIsset('add') && Tools::getIsset('op') == 1)
$this->processChangeProductInCart();
  else if (Tools::getIsset('delete'))
$this->processDeleteProductInCart();
  else if (Tools::getIsset('changeAddressDelivery'))
$this->processChangeProductAddressDelivery();
  else if (Tools::getIsset('allowSeperatedPackage'))
$this->processAllowSeperatedPackage();
  else if (Tools::getIsset('duplicate'))
$this->processDuplicateProduct();

								if (Tools::getIsset('add') && $actual_cart[0]['cart_quantity'] > '0' || Tools::getIsset('update') && $actual_cart[0]['cart_quantity'] > '0')
								$this->errors[] = Tools::displayError('Il y a deja un produit dans votre panier.');

  // Make redirection
  if (!$this->errors && !$this->ajax)
  {
$queryString = Tools::safeOutput(Tools::getValue('query', null));
if ($queryString && !Configuration::get('PS_CART_REDIRECT'))
 Tools::redirect('index.php?controller=search&search='.$queryString);
// Redirect to previous page
if (isset($_SERVER['HTTP_REFERER']))
{
 preg_match('!http(s?)://(.*)/(.*)!', $_SERVER['HTTP_REFERER'], $regs);
 if (isset($regs[3]) && !Configuration::get('PS_CART_REDIRECT'))
  Tools::redirect($_SERVER['HTTP_REFERER']);
}
Tools::redirect('index.php?controller=order&'.(isset($this->id_product) ? 'ipa='.$this->id_product : ''));
  }
 }
 elseif (!$this->isTokenValid())
  Tools::redirect('index.php');
}

}

 

Cordialement l'équipe Aduler.com

Edited by Aduler.com (see edit history)
Link to comment
Share on other sites

  • 9 months later...

Bonjour à tous,

 

Je relance ce post...

 

J'ai un besoin similaire -> proposer aux visiteurs un échantillon remboursable, échantillon que l'on ne peut commander qu'à un exemplaire.

L'idée c'est que le visiteur s'enregistre et paye l'échantillon (2€) (les frais de port sont gratuit), l'échantillon sera accompagné d'un code réduction de 2€.

Je pense qu'il sera "motivé" pour passer sa commande et "récupérer" ses 2€.

 

J'ai tenté la modif de "hseb", elle fonctionne très bien... merci ! Mais elle limite seulement la quantité pour un produit dans la fiche produit, rien n'empêche l'utilisateur de modifier la quantité dans le panier ensuite...

 

Si vous connaissez un module qui propose ce type de fonctionnalité ou une méthode pour mettre en place ce type de besoin simplement, je suis preneur ;-)

 

Merci.

Link to comment
Share on other sites

Bonjour à tous,

 

Je relance ce post...

 

J'ai un besoin similaire -> proposer aux visiteurs un échantillon remboursable, échantillon que l'on ne peut commander qu'à un exemplaire.

L'idée c'est que le visiteur s'enregistre et paye l'échantillon (2€) (les frais de port sont gratuit), l'échantillon sera accompagné d'un code réduction de 2€.

Je pense qu'il sera "motivé" pour passer sa commande et "récupérer" ses 2€.

 

J'ai tenté la modif de "hseb", elle fonctionne très bien... merci ! Mais elle limite seulement la quantité pour un produit dans la fiche produit, rien n'empêche l'utilisateur de modifier la quantité dans le panier ensuite...

 

Si vous connaissez un module qui propose ce type de fonctionnalité ou une méthode pour mettre en place ce type de besoin simplement, je suis preneur ;-)

 

Merci.

 

Une solution pas très académique, mais qui fonctionne ;-) consiste tout simplement à masquer le bouton de changement des quantités du panier par un "display: none" dans la CSS.

 

Si ca peut aider...

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...