Telefono: +39 392 33 73 731

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. Purtroppo mi sono accorto che 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.

Giovedì 23 Novembre 2017
(3 commenti)
PHP

Commento di Luca

Martedì 02 Gennaio 2018

ciao Zod
grande tip. Ti volevo ringraziare per avermi permesso di risparmiare tempo nel crearmelo da me

Risposta di Marco

Prego

Commento di Roberto

Martedì 14 Maggio 2019

Ciao Zod, mi sono imbattuto per caso nel tuo articolo perché al momento del lancio del nuovo e-commerce basato su Prestashop 1.7.5 avevo la necessità di proporre un Voucher sconto che non si applicasse però agli articoli già in sconto e con mia grande sorpresa ho verificato proprio la situazione che descrivi! Purtroppo non essendo un programmatore avrei bisogno di indicazioni un po' più dettagliate, alcuni passaggi non mi sono chiarissimi... Mi auguro tu possa contattarmi via mail, grazie!

Risposta di Marco

Ciao Roberto, apprendo che Prestashop 1.7 ha ancora questo fastidioso errore logico con gli sconti. Fortunatamente il codice è rimasto invariato rispetto a Prestashop 1.6. Quindi la mia modifica è ancora valida.

Il file che devi aprire è sempre CartRule.php in cartella "classes". Il codice della funzione che devi copiare (getContextualValue) inizia da riga 1058 e finisce a riga 1351.
Copi tutta questa funzione nel file di override che ho indicato. Poi la modifichi.
Il punto esatto, dove mettere il pezzetto che dico io, lo vedi nel file originale a riga 1133: vedi che è appena finito un cliclo "foreach"? E c'è una riga vuota? Incolla il mio "foreach" proprio in quel punto.

Per la cache, i file da cancellare in PS 1.7 sono stati messi qui: /app/cache/dev/class_index.php e /app/cache/prod/class_index.php
Se il percorso non corrisponde allora è /var/cache/dev e /var/cache/prod
Il percorso delle cartelle cache si recupera dalla riga 70 del file config/defines.inc.php
Sta scritto tipo: $prestashopCacheDir =  _PS_ROOT_DIR_.'/var/cache/'.(_PS_MODE_DEV_ ? 'dev': 'prod'). DIRECTORY_SEPARATOR;

Se hai ancora dubbi scrivimi una email.

Commento di Rob

Sabato 20 Luglio 2019

Ciao Marco,
sto usando Prestashop 1.7.5.2 e ho applicato alla lettera il tuo metodo (nella replica a Roberto l'hai spiegato talmente bene che escludo di aver fatto errori)... ho cancellato i file di cache come da te indicato, resettato la cache del browser e l'ho riavviato... ho riavviato il backoffice, ho creato un nuovo codice sconto percentuale senza indicare la limitazione che esclude i prodotti già in saldo... ho riavviato il sito ma nel carrello lo sconto percentuale è ancora applicato al totale dei due prodotti presenti in carrello (uno già scontato, uno a prezzo pieno). Cosa potrebbe non aver funzionato? Grazie in anticipo

Risposta di Marco

Anche Roberto ha avuto problemi. In linea teorica l'override dovrebbe funzionare anche in PS 1.7, la guida ufficiale di Prestashop lo prevede: https://devdocs.prestashop.com/1.7/modules/concepts/overrides/

Però ho nostato in blog varie lamentele di override non funzionanti, quindi non so che dire.

Aggiungi un commento

Nome
E-mail (non verrà pubblicata)
Sito Web
Commento