Jump to content

{RESOLU} - Avis Aux Experts - Quantité Commande Multiple de 6


Chris2008

Recommended Posts

Salut à tous,

Est Il possible de vérifier lors de la validation de commande que les quantité soit un multiple de 6 ???
(car expédition uniquement par carton de 6)

Comme par exemple un minimum d'achat possible,
Prestashop renvoie une erreur à l'acheteur de type "01. Erreur vous devez acheter pour 60€ minimum"
lorsque c'est paramétré dans les préférences de l'admin.

Pensez vous que ceci est faisable ??,
Merci d'avance pour vos réponses

Chris2008

Link to comment
Share on other sites

Sur le même sujet
www.prestashop.com/forums/viewthread/7596/

Mais je n’ai jamais eu de retour aux remarques que j’avais faites (panier rempli par groupe de 6 bouteilles et mis à jour par 1 bouteille)

Donc idem que Julien, pourquoi ne pas vendre des cartons plutôt que des unités ?

Link to comment
Share on other sites

C'est peut être parce que ce ne sont pas des produits identiques donc avec un prix différent :) mais qu'il souhaite n'expédie que par 6 produits, donc impossibilité de faire 1 groupe de produits.
J'imagine que cela concerne peut être du vin et qu'il souhaite que ses clients fassent une composition mais uniquement en multiple de 6.

Link to comment
Share on other sites

C'est peut être parce que ce ne sont pas des produits identiques donc avec un prix différent :) mais qu'il souhaite n'expédie que par 6 produits, donc impossibilité de faire 1 groupe de produits.
J'imagine que cela concerne peut être du vin et qu'il souhaite que ses clients fassent une composition mais uniquement en multiple de 6.


Bonjour à tous,

Voilà exactement c'est bien du vin, et il y a la possibilité de panacher le contenu du carton
si je vendais directement les cartons ça m'arrangerait mais je n'aurai pas la possibilité de panacher

A moins de proposer des cartons deja panachés (en imposant le contenu et non pas en le composant)
si ce cas s'avère possible comment faire pour vendre par carton sachant ??

voici l'url : http://boutique.sol-payre.com/

Merci pour vos réponses
en espérant avancer car je vois que pas mal de personne ont ce souci
Link to comment
Share on other sites

Chris,

N'expédier que des cartons complets, en permettant de panacher les bouteilles est meilleur pour les papilles.
Sur ton site, en plus du nombre de boutilles minimum, tu devrais aussi préciser que tu n'expédies que des cartons complets.

1ere solution :
Tres spécifique à ton site et à ton besoin, en modifiant le fichier order.php (besoin de remodifier ce fichier si tu changes de version prestashop)
Il faut remplacer le code

if (!$cookie->isLogged() AND in_array($step, array(1, 2, 3)))
   Tools::redirect('authentication.php?back=order.php?step='.$step);

if ($cart->nbProducts())
{
   /* Manage discounts */
   if ((Tools::isSubmit('submitDiscount') OR isset($_GET['submitDiscount'])) AND Tools::getValue('discount_name'))
            BlaBlaBla

par :

if (!$cookie->isLogged() AND in_array($step, array(1, 2, 3)))
   Tools::redirect('authentication.php?back=order.php?step='.$step);

/* code ajoute */
$nbProds = $cart->nbProducts();
if ( ($nbProds > 0) AND ($nbProds%6 <>0) )
{
   $step = 0;
   $errors[] = Tools::displayError('The number of bottles you order must be multiple of 6');
}
/* Fin code ajoute */

if ($cart->nbProducts())
{
   /* Manage discounts */
   if ((Tools::isSubmit('submitDiscount') OR isset($_GET['submitDiscount'])) AND Tools::getValue('discount_name'))
           BlaBlaBla



Ensuite, un p'tit tour dans le back office : Outils/Traductions/traduction des erreurs pour passer le message en français
Le tour est joué.

2ie solution : plus complexe
La solution précedente ne fonctionne que si tu vends uniquement des bouteilles.
Les tire-bouchons, thermomètres et autre sont vendus à l'unité, les verres, ca se discute.
Dans ce cas, tu mets ces autres produits dans des catégories différentes de tes bouteilles.
Il faut alors rajouter une méthode à la class cart (classes/cart.php) qui parcourt tous les produits du panier et retourne la somme de ceux qui sont dans une catégorie de bouteilles.
Dans order.php, remplacer le $nbProds = $cart->nbProducts(); par $nbProds = $cart->laNouvelleMethode();

Link to comment
Share on other sites

Bon, je poste derriere plutot que modifier mon post précédent.

Je viens de me ballader sur ton site et mes propositions ne fonctionneront pas :
par des déclinaisons, tu vends soit des bouteilles, soit des cartons.

Donc ma 1ere solution ne fonctionnera pas (1 carton c'est un article dans le panier, pas 6)
La 2ie serait à creuser, en testant les déclinaisons plutôt que les catégories

Link to comment
Share on other sites

2ie solution : plus complexe
La solution précedente ne fonctionne que si tu vends uniquement des bouteilles.
Les tire-bouchons, thermomètres et autre sont vendus à l'unité, les verres, ca se discute.
Dans ce cas, tu mets ces autres produits dans des catégories différentes de tes bouteilles.
Il faut alors rajouter une méthode à la class cart (classes/cart.php) qui parcourt tous les produits du panier et retourne la somme de ceux qui sont dans une catégorie de bouteilles.
Dans order.php, remplacer le $nbProds = $cart->nbProducts(); par $nbProds = $cart->laNouvelleMethode();

Salut,

Ca ne sera que des bouteilles pour le moment

On ne peut donc pas vérifier si la quantité est multiple de 6 dans le panier ????

Link to comment
Share on other sites

Voilà la solution :

Dans le fichier classes/cart.php, ajouter la fonction suivante à la classe :

    public    function nbBouteilles()
   {
       if (!$this->id)
           return 0;
       $sql = "SELECT sum( cp.quantity ) as nb
               FROM ps_cart_product AS cp
               LEFT JOIN ps_product_attribute AS pa ON cp.id_product_attribute = pa.id_product_attribute
               LEFT JOIN ps_product_attribute_combination AS pac ON cp.id_product_attribute = pac.id_product_attribute
               WHERE (cp.id_cart = ".$this->id.")
               AND pac.id_attribute 
               IN (
                   SELECT att.id_attribute
                   FROM ps_attribute AS att
                   LEFT JOIN ps_attribute_lang AS al ON att.id_attribute = al.id_attribute
                   LEFT JOIN ps_attribute_group_lang AS agl ON att.id_attribute_group = agl.id_attribute_group
                   WHERE al.name = '1 bouteille'
                   AND agl.name = 'parCombien'
               )";
       $row = Db::getInstance()->getRow($sql);
       return intval($row['nb']);
   }



Dans le fichier order.php, mettre les modifs suivantes au lieu de la solution 1 décrite plus haut :

if (!$cookie->isLogged() AND in_array($step, array(1, 2, 3)))
   Tools::redirect('authentication.php?back=order.php?step='.$step);

$nbBouteilles = $cart->nbBouteilles();
if ( ($nbBouteilles > 0) AND ($nbBouteilles %6 <>0) )
{
   $step = 0;
   $errors[] = Tools::displayError('The number of bottles you order must be multiple of 6. Number in cart : '.$nbBouteilles);
}

if ($cart->nbProducts())
{
   /* Manage discounts */
   if ((Tools::isSubmit('submitDiscount') OR isset($_GET['submitDiscount'])) AND Tools::getValue('discount_name'))
   {
           BlaBlaBla


Penser à la traduction

Cette fonction somme les quantités de tous les produits qui ont l'attribut 'parCombien' à la valeur '1 bouteille'.
Pour ton site, il faudrait changer dans le code ci-dessus le 'parCombien' par 'quantite' et le '1 bouteille' par 'x1 (1bouteille)'

Link to comment
Share on other sites

Salut

Merci pour ta réponse mais j't'avouerai que ce n'est pas très clair pour moi
j'ai modifié le code des fichiers indiqués mais erreur affiché
http://img29.imageshack.us/img29/2271/63636461.jpg

De plus je n'ai pas su trouvé où changer les attributs Par Combien, etc...

Voilà le code source actuel (avec modifs de mes 2 fichiers)

ORDER.PHP

/* Check minimal account */
$orderTotal = $cart->getOrderTotal();

$orderTotalDefaultCurrency = Tools::convertPrice($cart->getOrderTotal(true, 1), Currency::getCurrency(intval(Configuration::get('PS_CURRENCY_DEFAULT'))));
$minimalPurchase = floatval(Configuration::get('PS_PURCHASE_MINIMUM'));
if ($orderTotalDefaultCurrency < $minimalPurchase)
{
   $step = 0;
   $errors[] = Tools::displayError('A minimum purchase total of').' '.Tools::displayPrice($minimalPurchase, Currency::getCurrency(intval($cart->id_currency))).
   ' '.Tools::displayError('is required in order to validate your order');
}

if (!$cookie->isLogged() AND in_array($step, array(1, 2, 3)))
   Tools::redirect('authentication.php?back=order.php?step='.$step);

$nbBouteilles = $cart->nbBouteilles();
if ( ($nbBouteilles > 0) AND ($nbBouteilles %6 <>0) )
{
   $step = 0;
   $errors[] = Tools::displayError('The number of bottles you order must be multiple of 6. Number in cart : '.$nbBouteilles);
}

if ($cart->nbProducts())
{
   /* Manage discounts */
   if ((Tools::isSubmit('submitDiscount') OR isset($_GET['submitDiscount'])) AND Tools::getValue('discount_name'))
   {
               $discountName = Tools::getValue('discount_name');
       if (!Validate::isDiscountName($discountName))
           $errors[] = Tools::displayError('voucher name not valid');
       else
       {
           $discount = new Discount(intval(Discount::getIdByName($discountName)));
           if (is_object($discount) AND $discount->id)
           {
               if ($tmpError = $cart->checkDiscountValidity($discount, $cart->getDiscounts(), $cart->getOrderTotal(), $cart->getProducts(), true))
                   $errors[] = $tmpError;
           }
           else
               $errors[] = Tools::displayError('voucher name not valid');
           if (!sizeof($errors))
           {
               $cart->addDiscount(intval($discount->id));
               Tools::redirect('order.php');
           }
           else
           {
               $smarty->assign(array(
                   'errors' => $errors,
                   'discount_name' => Tools::safeOutput($discountName)));
           }
       }
   }
   elseif (isset($_GET['deleteDiscount']) AND Validate::isUnsignedId($_GET['deleteDiscount']))
   {
       $cart->deleteDiscount(intval($_GET['deleteDiscount']));
       Tools::redirect('order.php');
   }



CART.PHP

//if cart.php is called by ajax
if (Tools::getValue('ajax') == 'true')
   require_once(_PS_MODULE_DIR_.'/blockcart/blockcart-ajax.php');
else
{
   if (sizeof($errors))
   {
       require_once(dirname(__FILE__).'/header.php');
       $smarty->assign('errors', $errors);
       $smarty->display(_PS_THEME_DIR_.'errors.tpl');
       require_once(dirname(__FILE__).'/footer.php');
   }
   else
       Tools::redirect('order.php?'.(isset($idProduct) ? 'ipa='.intval($idProduct) : ''));
}

public    function nbBouteilles()
   {
       if (!$this->id)
           return 0;
       $sql = "SELECT sum( cp.quantity ) as nb
               FROM ps_cart_product AS cp
               LEFT JOIN ps_product_attribute AS pa ON cp.id_product_attribute = pa.id_product_attribute
               LEFT JOIN ps_product_attribute_combination AS pac ON cp.id_product_attribute = pac.id_product_attribute
               WHERE (cp.id_cart = ".$this->id.")
               AND pac.id_attribute 
               IN (
                   SELECT att.id_attribute
                   FROM ps_attribute AS att
                   LEFT JOIN ps_attribute_lang AS al ON att.id_attribute = al.id_attribute
                   LEFT JOIN ps_attribute_group_lang AS agl ON att.id_attribute_group = agl.id_attribute_group
                   WHERE al.name = '1 bouteille'
                   AND agl.name = 'parCombien'
               )";
       $row = Db::getInstance()->getRow($sql);
       return intval($row['nb']);
   }
?>



j'ai joint les 2 fichiers au cas ou je ne soit pas clair dans mon code

merci

order.php

cart.php

Link to comment
Share on other sites

Tu as quelle version de prestashop ?

Pour order.php, ca me parait bon.

Pour Cart.php, il faut modifier le fichier Cart.php dans le répertoire classes (pas celui dans le même répertoire que order.php)

Ci-joint le fichier modifé : prend le comme exemple pour insérer le nouvelle méthode, mais ne le copie pas sur ton install (il vient d'une version SVN pas stable)

Pour les noms des attributs, c'est la partie de code suivante de la function nbBouteilles qu'il faut modifier avec les noms exacts que tu utilises :

WHERE al.name = '1 bouteille'
AND agl.name = 'parCombien'


Sur ton site, je pense que tu utilises 'quantite' (au lieu de parCombien') et 'x1 (1 bouteille)' (au lieu de '1 bouteille')

Précision : ca ne compte que le nombre de bouteilles commandées à l'unité, pas celle directement commandées dans un carton (comme les cartons sont pleins, pas la peine de les compter)

Cart.php

Link to comment
Share on other sites

Voici pour les infos de mon prestashop et voilà ce que donne mon code CART.PHP dans le repertoir Classes
j'ai modifié les attributs par ceux créés dans l'administration de photoshop
http://img199.imageshack.us/img199/5918/90740110.jpg

Là beh c'est page blanche directement ! http://boutique.sol-payre.com/ j'ai du coup remis le fichier original

Version 1.1.0.5

/**
    * Return cart products quantity
    *
    * @result integer Products quantity
    */
   public    function nbBouteilles()
   {
       if (!$this->id)
           return 0;
       $sql = "SELECT sum( cp.quantity ) as nb
               FROM ps_cart_product AS cp
               LEFT JOIN ps_product_attribute AS pa ON cp.id_product_attribute = pa.id_product_attribute
               LEFT JOIN ps_product_attribute_combination AS pac ON cp.id_product_attribute = pac.id_product_attribute
               WHERE (cp.id_cart = ".$this->id.")
               AND pac.id_attribute 
               IN (
                   SELECT att.id_attribute
                   FROM ps_attribute AS att
                   LEFT JOIN ps_attribute_lang AS al ON att.id_attribute = al.id_attribute
                   LEFT JOIN ps_attribute_group_lang AS agl ON att.id_attribute_group = agl.id_attribute_group
                   WHERE al.name = 'x1 (1 bouteille)'
                   AND agl.name = 'Quantite'
               )";
       $row = Db::getInstance()->getRow($sql);
       return intval($row['nb']);
   }

   /**
    * Add a discount to the cart (NO controls except doubles)

Link to comment
Share on other sites

  • 7 months later...

Bonjour,

Je me permets de réouvrir ce billet car la solution mise en place m'intéresse beaucoup mais je n'arrive pas à mes fins.

Lorsque j'utilise le code proposé j'ai une erreur en retour.

J'ai changé les attributs

WHERE al.name = '1'


AND agl.name = 'Quantite'



Mais rien n'y fait et malheureusement j'ai des produits (bouteilles également) que je souhaite vendre par 3 minimum et des goodies que je souhaite vendre à l'unité.

Dois-je modifier quelque chose de particulier pour donné l'attribut "bouteille" à mes produits dans le B.O.? Je n'ai pas bien compris cette étape.

D'avance merci

Julien

Link to comment
Share on other sites

  • 4 months later...

bjr un probleme dans le style pour mon site
merci de votre aide!

je souhaiterai que tous les produits à 6 € vendu par deux donnent (10€ le lot)
je ne peux pas faire de lot car il existe beaucoup de choix à 6 € sur mon site.(le client fait son lot parmis tous les articles du site)
donc il me faudrait une formule qui me permette de dire
chaque paire d articles à 6€ donnent reduction de 2 euros

est ce possible? merci
je suis en version 1.2.5

Link to comment
Share on other sites

Bonjour à tous,
première fois que je poste sur ce forum qui m'a l'air aussi utile que réactif, donc merci d'avance à ceux qui m'aideront. (je pense plus être aidé qu'aider dans un premier temps.
J'ai mis en place la première solution de ningu qui marche parfaitement, et j'ai maintenant besoin de sa deuxième solution (possibilité de vendre des bouteilles obligatoirement par 6 mais aussi des autres produits à l'unité)

malheureusement, je n'arrive pas à y faire fonctionner :
ou trouve t'on le moyen de mettre à tel ou tel article l'attribut x1 (1bouteille)?
faut-il mettre les produits dans des catégories différentes?
J'ai changer le code de order.php et de classes/Cart.php mais cela n'a pas l'air de changer comme je le voudrais.

Cordialement,

Kriss

Link to comment
Share on other sites

Bonjour,

Pour ajouter les attributs, ça se passe dans "Catalogue", onglet "Attributs et groupe"


Ensuite tu édite ton produit, tu vas dans la partie "3 - Déclinaison", tu sélectionne ton groupe et l'attribut souhaité, tu l'ajoute, puis tu descend un peu et tu clique sur le bouton "Ajouter cette déclinaison" (sinon c'est pas enregistré :) )

-

Par contre, j'en profite pour poser une question par rapport à la traduction du message d'erreur :

Ensuite, un p’tit tour dans le back office : Outils/Traductions/traduction des erreurs pour passer le message en français


L'erreur ajoutée dans le fichier order.php n'y apparait pas, j'ai fait une erreur quelque part ?

Merci d'avance !
Link to comment
Share on other sites

Merci pour ta réponse NinjaTune, cela marche parfaitement chez moi, maintenant.
hormis que j'ai aussi le soucis de la traduction de l'erreur :

  $errors[] = Tools::displayError('The number of bottles you order must be multiple of 6. Number in cart : '.$nbBouteilles);



Elle n'apparait pas dans Outils/Traductions/traduction? Est-ce du au faite qu'il y ai une variable? ($nbBouteilles)

Link to comment
Share on other sites

j ai un probleme identique merci de vos lumieres!

j aimerai proposer une remise de 2 euros automatique pour l achat de 2 produits a 6 euros.sur l ensemble de mon site
etc pour 4, 6, 8....le client fait son propre lot de 2 articles et chaque paire de 6euros acheté, on remise 2 euros
estce possible merci..
jerome

Link to comment
Share on other sites

  • 6 months later...
  • 4 years later...

Bonjour à tous , 
 
Je ne comprends pas où trouver order.php . 

 

J'en ai 2 , un avec une majuscule Order.php dans classes et un autre sans majuscule mais qui est presque vide à la racine .

 

Pourriez vous m'aider svp ? 

 

Merci par avance 

 

David

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