Salta al contenuto ID

Prestashop: escludere i prodotti già scontati dai coupon di sconto

Un mio cliente ha voluto fare una promozione per il Black Friday, uno sconto del 10% su tutto il negozio, a chiunque faccia una spesa di almeno 100 euro. Però mi ha chiesto di escludere dal calcolo i prodotti già scontati, sparsi nelle varie categorie.

ATTENZIONE, aggiornamento 03/05/2020: la mia modifica è valida per Prestashop 1.6, ma nelle nuove versioni, almeno dalla 1.7.4 in poi, esiste già una opzione per escludere i prodotti dalla regola carrello. Si trova in pannello Azioni, “Escludi i prodotti scontati” (si/no). Se non dovesse funzionare allora si tratta di un bug di Prestashop. Il bug sembra essere apparso nelle versioni 1.7.6, in questo caso leggi il mio nuovo articolo.

Purtroppo in PS 1.6 quella opzione manca e le regole di Prestashop non funzionano bene, anche usando correttamente le restrizioni (sia per categoria, sia per produttore).
Se un acquirente aggiunge in carrello 80 euro di prodotti scontati, esclusi dalla regola tramite le restrizioni, e poi aggiunge un solo prodotto da 25 euro di una categoria valida, lo sconto si attiva sull’importo di 105 euro, cioè su tutti i prodotti inseriti. Ovviamente questo comportamento non è ciò che il mio cliente vuole. Bisogna che lo sconto di carrello escluda dal calcolo i prodotti già scontati. La soluzione è possibile solo attraverso la modifica del codice della classe “CartRule“.

Quindi bisogna creare il file “override/classes/CartRule.php” e inserire il codice seguente.

<?php
 
class CartRule extends CartRuleCore{
 
// --- Qui andremo a inserire il codice ---
 
}

Poi bisogna copiare all’interno della classe la funzione “getContextualValue” che troviamo nel file originale di Prestashop, in cartella “classes“.
All’interno della funzione cerchiamo una riga come questa:

 if ($this->reduction_percent && $this->reduction_product == 0) {

Poco più sotto vediamo un ciclo “for”, dopo di esso aggiungiamo un altro ciclo “for” come il codice seguente, in pratica si rimuovono dal totale ordine tutti i prodotti già scontati.

// no discount for products on sale! - modified by ZOD
foreach ($package_products as $product){
    if(Product::isDiscounted((int)$product['id_product'])){
        $order_total -= $use_tax ? $product['total_wt'] : $product['total'];
    }
}
// end modified by ZOD

Fatto questo bisogna eliminare il file “cache/class_index.php”, e rilanciare il sito, così le classi e gli override vengono ricaricati.

Ultima cosa: le regole di carrello vanno riportate senza restrizioni, non sono più necessarie in quanto la logica è ormai stata cambiata nel codice.

Comments (0)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Torna su