Merci pour votre réponse
Effectivement le problème était dans la fonction ValidateOrder dans la classe PaymentModule, quand le client utilise un bon d'achat qui a exactement le même montant que son achat avec l'option de free shipping, dans la fonction il rentre dans la condition qui créer un nouveaux coupon si la totalité du premier n'est pas consommé
// IF // This is not multi-shipping // The value of the voucher is greater than the total of the order // Partial use is allowed // This is an "amount" reduction, not a reduction in % or a gift // THEN // The voucher is cloned with a new value corresponding to the remainder if (count($order_list) == 1 && ($values['tax_incl']-$order->total_shipping_tax_incl) > ($order->total_products_wt - $total_reduction_value_ti) && $cart_rule['obj']->partial_use == 1 && $cart_rule['obj']->reduction_amount > 0) {
et dans la ligne 559 dans la condition
if ($voucher->reduction_amount <= 0) {
continue;
}
comme le $voucher->reduction_amount = 0 il sort de la boucle sans faire l'insertion dans la table order_cart_rule et sans faire le update dans la table cart_rule
$order->addCartRule($cart_rule['obj']->id, $cart_rule['obj']->name, $values, 0, $cart_rule['obj']->free_shipping); if ($id_order_state != Configuration::get('PS_OS_ERROR') && $id_order_state != Configuration::get('PS_OS_CANCELED') && !in_array($cart_rule['obj']->id, $cart_rule_used)) { $cart_rule_used[] = $cart_rule['obj']->id; // Create a new instance of Cart Rule without id_lang, in order to update its quantity $cart_rule_to_update = new CartRule((int)$cart_rule['obj']->id); $cart_rule_to_update->quantity = max(0, $cart_rule_to_update->quantity - 1); $cart_rule_to_update->update(); }