Jump to content

Edit History

cryoth

cryoth

Bonjour à tous,

Je reviens avec un cas un peu spécifique qui me donne du fil à retordre, j'utilise un module d'abonnement qui lors d'une commande de type "abonnement" va passer un premier achat et recevoir des signaux de paiement à interval régulier pour les paiement suivant.

A chaque signal reçu une commande est créée à partir de la commande originel. Cependant, le prix du 1er versement diffère des suivants, le changement de prix est généré par une 'CartRule' de type "Discount".

Je voudrais pouvoir supprimer cette réduction de prix sur les commandes automatisés, et j'ai effectué la suppression des CartRule sur le panier :

foreach ($new_cart->getCartRules() as $rule) {
  if ($this->removeRule($subscription, $cart, $new_cart, $rule)) {
  	$new_cart->removeCartRule($rule['id_cart_rule']);
  }
}

Cependant lorsque j'envoi mon panier vers la classe PaymentModule afin de valider la commande ( validateOrder() ) il se trouve que les réductions sont ré-appliqués à nouveau sur mon panier.

Du coup je me demande si ma façon de faire est la bonne, comment faire en sorte de faire sauter ma réduction de façon propre, dois-je plutot me tourner vers la classe CartRule et lui appliquer un filtre spécifique ?

Ou même existe-t-il une option dans prestashop qui permette de gérer mon cas avec un premier prix spécifique sans avoir à utiliser les réductions ?

Actuellement je tente d'override la classe PaymentModule depuis mon module pour empêcher l'application d'un discount si un paramètre $noDiscount est passé :

public function validateOrder(
        $id_cart,
        $id_order_state,
        $amount_paid,
        $payment_method = 'Unknown',
        $message = null,
        $extra_vars = array(),
        $currency_special = null,
        $dont_touch_amount = false,
        $secure_key = false,
        $noDiscount = false,
        Shop $shop = null
)

// Début de la fonction ...

// Make sure CartRule caches are empty
CartRule::cleanCache();
// Modification anti-discount
if($noDiscount){
	$cart_rules = $this->context->cart->getCartRules(CartRule::FILTER_ACTION_ALL, true);
}else{
	$cart_rules = $this->context->cart->getCartRules();
}
foreach ($cart_rules as $cart_rule) {
  if (($rule = new CartRule((int) $cart_rule['obj']->id)) && Validate::isLoadedObject($rule)) {
    if ($error = $rule->checkValidity($this->context, true, true)) {
      $this->context->cart->removeCartRule((int) $rule->id);
      if (isset($this->context->cookie, $this->context->cookie->id_customer) && $this->context->cookie->id_customer && !empty($rule->code)) {
          Tools::redirect('index.php?controller=order&submitAddDiscount=1&discount_name=' . urlencode($rule->code));
      } else {
        $rule_name = isset($rule->name[(int) $this->context->cart->id_lang]) ? $rule->name[(int) $this->context->cart->id_lang] : $rule->code;
        $error = $this->trans('The cart rule named "%1s" (ID %2s) used in this cart is not valid and has been withdrawn from cart', array($rule_name, (int) 		$rule->id), 'Admin.Payment.Notification');
        PrestaShopLogger::addLog($error, 3, '0000002', 'Cart', (int) $this->context->cart->id);
      }
    }
  }
}

// Autre modification au moment de l'appel de createOrderCartRules()
if($noDiscount){
	$cart_rules_list = array();
}else{
  $cart_rules_list = $this->createOrderCartRules(
    $order,
    $this->context->cart,
    $order_list,
    $total_reduction_value_ti,
    $total_reduction_value_tex,
    $id_order_state
  );
}

J'espère que vous pourrez m'aider :) 

cryoth

cryoth

Bonjour à tous,

Je reviens avec un cas un peu spécifique qui me donne du fil à retordre, j'utilise un module d'abonnement qui lors d'une commande de type "abonnement" va passer un premier achat et recevoir des signaux de paiement à interval régulier pour les paiement suivant.

A chaque signal reçu une commande est créée à partir de la commande originel. Cependant, le prix du 1er versement diffère des suivants, le changement de prix est généré par une 'CartRule' de type "Discount".

Je voudrais pouvoir supprimer cette réduction de prix sur les commandes automatisés, et j'ai effectué la suppression des CartRule sur le panier :

foreach ($new_cart->getCartRules() as $rule) {
  if ($this->removeRule($subscription, $cart, $new_cart, $rule)) {
  	$new_cart->removeCartRule($rule['id_cart_rule']);
  }
}

Cependant lorsque j'envoi mon panier vers la classe PaymentModule afin de valider la commande ( validateOrder() ) il se trouve que les réductions sont ré-appliqués à nouveau sur mon panier.

Du coup je me demande si ma façon de faire est la bonne, comment faire en sorte de faire sauter ma réduction de façon propre, dois-je plutot me tourner vers la classe CartRule et lui appliquer un filtre spécifique ?

Ou même existe-t-il une option dans prestashop qui permette de gérer mon cas avec un premier prix spécifique sans avoir à utiliser les réductions ?

Actuellement je tente d'override la classe PaymentModule depuis mon module pour empêcher l'application d'un discount si un paramètre $noDiscount est passé :

public function validateOrder(
        $id_cart,
        $id_order_state,
        $amount_paid,
        $payment_method = 'Unknown',
        $message = null,
        $extra_vars = array(),
        $currency_special = null,
        $dont_touch_amount = false,
        $secure_key = false,
        $noDiscount = false,
        Shop $shop = null
)

// Début de la fonction ...

// Make sure CartRule caches are empty
CartRule::cleanCache();
// Modification anti-discount
if($noDiscount){
	$cart_rules = $this->context->cart->getCartRules(CartRule::FILTER_ACTION_ALL, true);
}else{
	$cart_rules = $this->context->cart->getCartRules();
}
foreach ($cart_rules as $cart_rule) {
  if (($rule = new CartRule((int) $cart_rule['obj']->id)) && Validate::isLoadedObject($rule)) {
    if ($error = $rule->checkValidity($this->context, true, true)) {
      $this->context->cart->removeCartRule((int) $rule->id);
      if (isset($this->context->cookie, $this->context->cookie->id_customer) && $this->context->cookie->id_customer && !empty($rule->code)) {
          Tools::redirect('index.php?controller=order&submitAddDiscount=1&discount_name=' . urlencode($rule->code));
      } else {
        $rule_name = isset($rule->name[(int) $this->context->cart->id_lang]) ? $rule->name[(int) $this->context->cart->id_lang] : $rule->code;
        $error = $this->trans('The cart rule named "%1s" (ID %2s) used in this cart is not valid and has been withdrawn from cart', array($rule_name, (int) 		$rule->id), 'Admin.Payment.Notification');
        PrestaShopLogger::addLog($error, 3, '0000002', 'Cart', (int) $this->context->cart->id);
      }
    }
  }
}

// Autre modification au moment de l'appel de createOrderCartRules()
if($noDiscount){
	$cart_rules_list = array();
}else{
  $cart_rules_list = $this->createOrderCartRules(
    $order,
    $this->context->cart,
    $order_list,
    $total_reduction_value_ti,
    $total_reduction_value_tex,
    $id_order_state
  );
}

J'espère que vous pourrez m'aider :) 

×
×
  • Create New...