Jump to content

Règle panier ne s'applique pas lorsque je limite ma règle à un groupe


Recommended Posts

Bonjour à tous,

 

Je me retrouve confronter à un problème que je pensais simple au départ.

 

J'ai créé une règle panier offrant x% à partir de y€ dhat sur ma boutique. Jusque là pas de problème.

 

Cette remise (règle panier), ne doit par contre s'appliquer qu'aux groupes suivants :

  • Visiteur
  • Invité
  • Client

Tous mes autres groupes ne doivent pas profiter de cette remise.

 

Hors si j'applique une restriction sur les groupes, mes "visiteurs" ne bénéficient pas de la remise. Il faut que je sois connecté avec un compte client pour bénéficier de la remise.

 

Si je désactive la restriction sur les groupes, cela fonctionne bien et mes "visiteurs" bénéficient de la remise.

 

J'ai essayé de parcourir les classes et controllers succeptiblent de gérer cela pour résoudre le problème mais sans succès, je ne trouve pas l'endroit où les remises sont vérifiées et appliquées sur le panier.

 

Je n'ai trouvé que le controller qui affiche les "remises" succeptibles d'être disponible pour le client (Option mise en surbrillance de la règle panier).

 

Si quelqu'un à déjà rencontrer le problème, ou aurais une piste, qu'il n'hésite pas à ce manifester ;)

 

Merci à tous pour vos contributions.

Link to comment
Share on other sites

Bonsoir,

 

J'ai progressé dans la résolution de mon problème. En effet, j'ai identifié où cela coince.

 

Il s'agit de la requête SQL de la fonction autoAddToCart() de la classe CartRule.php que je vous mets ci-dessous

		$sql = '
		SELECT cr.*
		FROM '._DB_PREFIX_.'cart_rule cr
		LEFT JOIN '._DB_PREFIX_.'cart_rule_shop crs ON cr.id_cart_rule = crs.id_cart_rule
		LEFT JOIN '._DB_PREFIX_.'cart_rule_carrier crca ON cr.id_cart_rule = crca.id_cart_rule
		'.($context->cart->id_carrier ? 'LEFT JOIN '._DB_PREFIX_.'carrier c ON (c.id_reference = crca.id_carrier AND c.deleted = 0)' : '').'		
		LEFT JOIN '._DB_PREFIX_.'cart_rule_country crco ON cr.id_cart_rule = crco.id_cart_rule
		WHERE cr.active = 1
		AND cr.code = ""
		AND cr.quantity > 0
		AND cr.date_from < "'.date('Y-m-d H:i:s').'"
		AND cr.date_to > "'.date('Y-m-d H:i:s').'"
		AND (
			cr.id_customer = 0
			'.($context->customer->id ? 'OR cr.id_customer = '.(int)$context->cart->id_customer : '').'
		)
		AND (
			cr.`carrier_restriction` = 0
			'.($context->cart->id_carrier ? 'OR c.id_carrier = '.(int)$context->cart->id_carrier : '').'
		)
		AND (
			cr.`shop_restriction` = 0
			'.((Shop::isFeatureActive() && $context->shop->id) ? 'OR crs.id_shop = '.(int)$context->shop->id : '').'
		)
		AND (
			cr.`group_restriction` = 0                      
			'.($context->customer->id ? 'OR 0 < (
				SELECT cg.`id_group`
				FROM `'._DB_PREFIX_.'customer_group` cg
				INNER JOIN `'._DB_PREFIX_.'cart_rule_group` crg ON cg.id_group = crg.id_group
				WHERE cr.`id_cart_rule` = crg.`id_cart_rule`
				AND cg.`id_customer` = '.(int)$context->customer->id.'
				LIMIT 1
			)' : '').'
		)
		AND (
			cr.`reduction_product` <= 0
			OR cr.`reduction_product` IN (
				SELECT `id_product`
				FROM `'._DB_PREFIX_.'cart_product`
				WHERE `id_cart` = '.(int)$context->cart->id.'
			)
		)
		AND cr.id_cart_rule NOT IN (SELECT id_cart_rule FROM '._DB_PREFIX_.'cart_cart_rule WHERE id_cart = '.(int)$context->cart->id.')
		ORDER BY priority';

La clause suivante :

		AND (
			cr.`group_restriction` = 0                      
			'.($context->customer->id ? 'OR 0 < (
				SELECT cg.`id_group`
				FROM `'._DB_PREFIX_.'customer_group` cg
				INNER JOIN `'._DB_PREFIX_.'cart_rule_group` crg ON cg.id_group = crg.id_group
				WHERE cr.`id_cart_rule` = crg.`id_cart_rule`
				AND cg.`id_customer` = '.(int)$context->customer->id.'
				LIMIT 1
			)' : '').'
		)

indique que la requête doit sortir toutes les règles dont :

  • le champ "group_restriction = 0"
  • ou alors que le client est dans un des groupes autorisés

Lorsque l'internaute se trouve être un visiteur, il a comme id_customer = 0. Il ne répond donc à aucune de ces deux conditions.

 

Comment puis je modifier la requête pour que les conditions répondent à :

  • le champ "group_restriction = 0"
  • Ou alors que le client est dans un groupes autorisés
  • OU si id_customer = 0 (visiteur) que le groupe "visiteur" soit autorisé dans la table _cart_rule_group

Merci pour vos contributions, cela m'enlèvera une belle épine du pied et aidera peut être d'autres personnes confrontées à un problème similaire.

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

  • 1 year later...

Bonsoir,

je rencontre le même problème (sur 1.5.6.0), et je ne trouve pas de solution...

J'aimerai que mes visiteurs (donc quand ils ne sont pas connectés) voient la remise s'afficher dans le panier.

Quand ils se connectent, soient ils sont dans le groupe autorisé, la réduction est toujours là, soit dans le groupe non autorisé, et dans ce cas elle disparaît (au profit d'une autre plus intéressante, ne vous inquiétez pas ;)

J'ai du mal à comprendre pourquoi le groupe visiteur existe s'il n'est pas pris en compte...

Depuis le temps, quelqu'un a t-il réussi à résoudre ce problème?

Ce bug a t-il été fixé dans une version plus récente?

 

Merci d'avance

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