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.

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.

Giovedì 23 Novembre 2017
(5 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/

Attenzione che nelle versioni nuove di Prestashop, compresa la 1.7.5.1, esiste già l'opzione per escludere i prodotti scontati dalla regola carrello, è pannello "azioni".

Commento di Vincenzo

Sabato 02 Maggio 2020

Ciao Marco,
ho eseguito il tuo TIP ma una volta caricato il file il sito va in crash e mi ritorna errore 500.
la versione usata è la 1.7.6.5
Grazie mille se potrai aiutarmi

Risposta di Marco

Che ti dia un errore è strano, più probabilmente c'è un errore di sintassi PHP. L'errore 500 è generico, dovresti attivare il debug di Prestashop e leggere che tipo di errore ti da. Anche il log errori del server ti da delle informazioni.

A parte questo nelle nuove versioni Prestashop 1.7 esiste già l'opzione per escludere i prodotti già scontati dalla regola carrello. Quindi non serve il mio override.

Se non riesci a debuggare, e se il flag della regola carrello non ti funziona, allora serve segnalare il bug a Prestashop. Oppure, potresti installare questo modulo, ti aggiunge 2 Regole Carrello, ma lo fa sempre con degli override: https://addons.prestashop.com/it/promozioni-regali/25901-conditional-cart-rules-without-offers-on-sale.html

Commento di Vincenzo

Domenica 03 Maggio 2020

Ciao Marco,
ti ringrazio per la risposta,
è vero sula versione 1.7.6.5 in Catalogo -> Buoni Sconto -> Regola carrello -> Nome regola -> Azioni c'è un tasto che dice: Escludi i prodotti scontati
Ma se metto si comunque lo sconto lo applica anche al prodotto che già di suo ha un suo sconto...

Dici di contattare prestasho?

Grazie ancora.

Risposta di Marco

Questo periodo ho ricevuto almeno 5 richieste di questo tipo, è un po' strando da un articolo così vecchio, credo che in Prestashop 1.7.6.5 hanno un bug in quell'opzione. Ho trovato un articolo nel forum che ne parla, c'è anche il modo per aggiustarlo (sostituendo il file CarRuleCalculator.php) fintanto che non esce la versione 1.7.7.0: https://www.prestashop.com/forums/topic/988073-vocuher-that-should-exclude-products-already-on-sale-doesnt-work-correctly-prestashop-17/

Aggiungi un commento

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