3 luglio 2008

Zen Cart: applicare uno sconto % a seconda del tipo di pagamento scelto

Benissimo, si riprende a scrivere qualcosa...

Nello specifico, di nuovo per Zen Cart e vediamo oggi come realizzare un sistema di sconto a percentuale sul totale ordine che si attivi quando l'utente seleziona un particolare sistema di pagamento.

Nel caso di esempio utilizzerò il mio modulo bonifico come sistema di pagamento su cui applicare lo sconto.

Sconti, maggiorazioni (sia a percentuale sia calcolati in altro modo) che vadano a modificare il totale dell'ordine si realizzano creando un nuovo modulo della 'serie' order_total

Nel caso specifico, visto che aggiungeremo anche una piccola nota da far vedere nella fase 2 del checkout (ovvero la scelta del sistema di pagamento) in corrispondenza del sistema di pagamento influenzato da questo sconto, andremo a fare anche una piccola modifica al modulo di pagamento e al corrispondente file di lingua. Questa nota è opzionale, utile per far capire all'acquirente che se sceglie quel sistema di pagamento otterrà un certo sconto (la percentuale viene presa dinamicamente dalla configurazione del modulo order total che creeremo e la nota sparisce se disabilitiamo lo sconto).

Partiamo dalla creazione del modulo order_total:

posizione: includes/modules/order_total/
nome: ot_sconto_bonifico.php

contenuto del file:

/**
* sconto_bonifico order-total module
*
* @package orderTotal
* @copyright Copyright 2008 Paolo De Dionigi aka spike00 http://www.atfriends.net
* @copyright Portions Copyright 2003-2006 Zen Cart Development Team
* @copyright Portions Copyright 2003 osCommerce
* @copyright Portions Copyright (c) 2002 Thomas Plänkers http://www.oscommerce.at
* @license http://www.zen-cart.com/license/2_0.txt GNU Public License V2.0
* @version $Id: ot_sconto_bonifico.php 2008-07-03 spike00 $
*/
/**
* sconto_bonifico Order Totals Module
*
*/

class ot_sconto_bonifico {
var $title, $output;

function ot_sconto_bonifico() {
$this->code = 'ot_sconto_bonifico';
$this->title = MODULE_ORDER_TOTAL_SCONTO_BONIFICO_TITLE;
$this->description = MODULE_ORDER_TOTAL_SCONTO_BONIFICO_DESCRIPTION;
$this->enabled = ((MODULE_ORDER_TOTAL_SCONTO_BONIFICO_STATUS == 'true') ? true : false);
$this->sort_order = MODULE_ORDER_TOTAL_SCONTO_BONIFICO_SORT_ORDER;

$this->output = array();
}

function process() {
global $order, $currencies, $sconto_valore, $sconto_bonifico_country, $shipping, $db;

if (MODULE_ORDER_TOTAL_SCONTO_BONIFICO_STATUS == 'true') {
if ($_SESSION['payment'] == 'bonifico') {

$sconto_valore = MODULE_ORDER_TOTAL_SCONTO_BONIFICO_VALORE;
$importo_sconto = ($order->info['total'] * $sconto_valore / 100);
$sconto_bonifico_tax_address = zen_get_tax_locations();
$tax = zen_get_tax_rate(MODULE_ORDER_TOTAL_SCONTO_BONIFICO_TAX_CLASS, $sconto_bonifico_tax_address['country_id'], $sconto_bonifico_tax_address['zone_id']);
$order->info['total'] -= $importo_sconto;
if ($tax > 0) {
$tax_description = zen_get_tax_description(MODULE_ORDER_TOTAL_SCONTO_BONIFICO_TAX_CLASS, $sconto_bonifico_tax_address['country_id'], $sconto_bonifico_tax_address['zone_id']);
$order->info['tax'] -= zen_calculate_tax($importo_sconto, $tax);
$order->info['tax_groups'][$tax_description] -= zen_calculate_tax($importo_sconto, $tax);
$order->info['total'] -= zen_calculate_tax($importo_sconto, $tax);
if (DISPLAY_PRICE_WITH_TAX == 'true') {
$importo_sconto -= zen_calculate_tax($importo_sconto, $tax);
}
}

$this->output[] = array('title' => $this->title . ':',
'text' => '- ' . $currencies->format($importo_sconto, true, $order->info['currency'], $order->info['currency_value']),
'value' => $importo_sconto);
}
}
}

function check() {
global $db;
if (!isset($this->_check)) {
$check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_ORDER_TOTAL_SCONTO_BONIFICO_STATUS'");
$this->_check = $check_query->RecordCount();
}

return $this->_check;
}
//lagt tilk servicepakke her!!!!
function keys() {
return array('MODULE_ORDER_TOTAL_SCONTO_BONIFICO_STATUS', 'MODULE_ORDER_TOTAL_SCONTO_BONIFICO_SORT_ORDER', 'MODULE_ORDER_TOTAL_SCONTO_BONIFICO_VALORE', 'MODULE_ORDER_TOTAL_SCONTO_BONIFICO_TAX_CLASS');
}

function install() {
global $db;
$db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Visualizza Supplemento', 'MODULE_ORDER_TOTAL_SCONTO_BONIFICO_STATUS', 'true', 'Attiva il modulo?', '6', '1','zen_cfg_select_option(array(\'true\', \'false\'), ', now())");
$db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Ordine di Visualizzazione', 'MODULE_ORDER_TOTAL_SCONTO_BONIFICO_SORT_ORDER', '991', 'Ordine di Visualizzazione.', '6', '2', now())");
$db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Valore sconto per bonifico', 'MODULE_ORDER_TOTAL_SCONTO_BONIFICO_VALORE', '2.00', 'Impostare il valore dello sconto da applicare per i pagamenti con bonifico. Se si desidera ad esempio il 3%, scrivere 3.00', '6', '3', now())");
$db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Classe IVA', 'MODULE_ORDER_TOTAL_SCONTO_BONIFICO_TAX_CLASS', '0', 'Usa questa aliquota IVA per sconto bonifico.', '6', '25', 'zen_get_tax_class_title', 'zen_cfg_pull_down_tax_classes(', now())");
}


function remove() {
global $db;
$keys = '';
$keys_array = $this->keys();
$keys_size = sizeof($keys_array);
for ($i=0; $i<$keys_size; $i++) {
$keys .= "'" . $keys_array[$i] . "',";
}
$keys = substr($keys, 0, -1);

$db->Execute("delete from " . TABLE_CONFIGURATION . " where configuration_key in (" . $keys . ")");
}
}
?>


Da notare la riga in cui si dice a questo modulo di 'entrare in funzione' se l'utente ha scelto il bonifico come sistema di pagamento:

if ($_SESSION['payment'] == 'bonifico')

quanto si trova tra le virgolette ' ', ovvero la parola bonifico, deve corrispondere esattamente a quanto contenuto tra le virgolette della riga: $this->code = 'bonifico';
che si trova verso l'inizio del file relativo al modulo di pagamento (in questo caso: includes/modules/payment/bonifico.php), ovvero al 'codice' atribuito al modulo di pagamento.

Altro file da creare è il file di lingua:

posizione: includes/languages/italian/modules/order_total/
nome: ot_sconto_bonifico.php

contenuto del file:

/**
* @package languageDefines
* @copyright Copyright 2008 Paolo De Dionigi aka spike00 http://www.atfriends.net
* @copyright Portions Copyright 2003-2006 Zen Cart Development Team
* @copyright Portions Copyright 2003 osCommerce
* @license http://www.zen-cart.com/license/2_0.txt GNU Public License V2.0
* @version $Id: ot_sconto_bonifico.php 2008-07-03 spike00 $
*/
define('MODULE_ORDER_TOTAL_SCONTO_BONIFICO_TITLE', 'Sconto per pagamento con bonifico');
define('MODULE_ORDER_TOTAL_SCONTO_BONIFICO_DESCRIPTION', 'Sconto per pagamenti tramite bonifico');
?>

Infine apportiamo le modifiche al file del modulo di pagamento per inserire la nota di cui sopra:

Subito dopo la riga

$this->title = MODULE_PAYMENT_BONIFICO_TEXT_TITLE;

inseriamo queste righe:

if (MODULE_ORDER_TOTAL_SCONTO_BONIFICO_STATUS == 'true') {
$this->title = MODULE_PAYMENT_BONIFICO_TEXT_TITLE . '

Nota: previsto sconto pari al ' . MODULE_ORDER_TOTAL_SCONTO_BONIFICO_VALORE .'%
';
}

Qui ho scritto direttamente il testo in italiano, ovviamente se si ha un sito multilingua questa operazione comporterà che anche nelle lingue diverse dall'italiano, il messaggio si veda in italiano, quindi invece di fare così, si deve creare una o più nuove defines di lingua e usarle al posto del testo scritto direttamente nel modulo.



Ok, ora rimano soltanto da attivare il modulo e configurarlo.

Si va nell'amministrazione, in moduli, totale ordine. Qui comparirà il nostro nuovo modulo 'Sconto per pagamento con bonifico', lo installiamo come qualsiasi altro modulo. Di default ho inserito come posizionamento il valore 991, che dovrebbe essere subito dopo il calcolo dell'iva e subito prima del totale, così il tutto risulta coerente in visualizzazione da parte del cliente, comunque ovviamente è possibile modificare l'ordine di visualizzazione.

Altro parametro fondamentale ovviamente è il valore dello sconto. Se si desidera ad esempio impostare uno sconto pari al 3%, bisogna scrivere 3.00 nel campo apposito.

Ultima cosa: il modulo è ovviamente disattivabile e/o disintallabile. Se viene disabilitato o disinstallato ovviamente non verrà più applicato lo sconto e sparirà la nota in corrispondenza del sistema di pagamento nella pagina 2 del checkout.

Fine ;)

Buoni sconti a tutti ;)

17 commenti:

Anto+ ha detto...

ciao paolo grazie tante per questo modulo era proprio quello che mi serviva ,purtroppo, pur avendo seguito le tue istruzioni alla lettera, appena cerco di installare il modulo dal pannello di amministrazione, ricevo il seguente messaggio

Warning: Cannot modify header information - headers already sent by (output started at /usr/local/psa/home/vhosts/pizzimenti.it/httpdocs/negozio/includes/modules/order_total/ot_sconto_bonifico.php:2) in /usr/local/psa/home/vhosts/pizzimenti.it/httpdocs/negozio/e34/includes/functions/general.php on line 21

potresti aiutarmi a risolvere? thank

Paolo De Dionigi ha detto...

Ciao, anto+

Controlla il file ot_sconto_bonifico.php in order_total

Al 99% non inizia con < ? php (l'ho scritto con gli spazi, altrimenti non viene accettato da blogger) , ma prima di questo c'è qualcos'altro. basta anche solo uno spazio o una riga e ti compare quell'errore.

Anto+ ha detto...

hai ragione, avevo fatto copia incolla senza leggere, e ora funziona..approfitto della tua gentilezza per chiederti se sarebbe possibile fare applicare questo sconto solo sul totale della merce, senza che influisca sulle spese di spedizione che dovranno essere calcolate per intero.
Scusa se ti annoio e grazie in anticpo

Paolo De Dionigi ha detto...

yes, prova così:

sostituisci la riga

$importo_sconto = ($order->info['total'] * $sconto_valore / 100);

con quest'altra:

$importo_sconto = (($order->info['total'] - $order->info['shipping_cost']) * $sconto_valore / 100);

Anto+ ha detto...

Ovviamente funziona..
per ringraziarti sto mettendo un tuo busto in giardino :D
a buon rendere e grazie ancora. saluti

Anto+ ha detto...

ciao, ho avuto occasione di usare il tuo modulo con le modifiche suggerite da anto+ in modo che calcoli la percentuale solo sulla merce lasciando da parte la spedizione... ho però un problema: alla fine del processo d'ordine non mi ritrovo la pagina "grazie per aver Fatto acquisti online con noi". Ho notato che quando il tuo modulo non è presente sul server, alla fine del processo vengo indirizzato su una pagina checkout_success.php e quindi funziona tutto, mentre, basta uppare sul server (anche senza installarlo dall'interfaccia admin di zencart perchè alla fine del processo venga invece indirizzato su una pagina checkout_process.php (bianca). Come posso fare? Grazie

Paolo De Dionigi ha detto...

Ciao, devi aver fatto qualche errore nel copia incolla del codice, perchè il modulo funziona correttamente.

Per far saltar fuori gli errori php, copia queste righe

error_reporting(E_ALL); // report all errors
ini_set("display_errors", 1);
ini_set('error_reporting', E_ALL);
ini_set("display_startup_errors", 1);

e incollale nel file index.php della root di zen cart, all'inizio, subito dopo (riga sotto) alla apertura del php (< ? php)

In questo modo dovrebbero comparire un po' di notice / warning e quando vai alla pagina che ora risulta bianca, dopo i vari notice / warning dovrebbe comparire un fatal error. Ecco quello è l'errore che ti blocca il funzionamento.

Anto+ ha detto...

cavoli, ho controllato e ho anche io lo stesso problema sai?, ma credo sia un problema di indirizzamento finale, vedo nella barra degli indirizzi ( della pagina bianca si intende) che vengo mandato su checkout_process non checkout_success...per questo è bianca..

Paolo De Dionigi ha detto...

Questo è curioso.
Comunque, visto che era passato del tempo da quando ho scritto il post, ieri ho rifatto tutta la procedura al volo su un sito test, creando i vari files, facendo copia incolla direttamente dal codice presente nel post.

E ovviamente non mi si presenta il problema :)

Hmmm, versione di Zen Cart è 1.3.8 italiana (non mi pare che i moduli order total richiedano modifiche nel passaggio dalla 1.3.7 alla 1.3.8 però non si sa mai.

Ripeto, provate a metter su quelle righe di codice che ho postato prima e vediamo qual'è l'errore.

Anto+ ha detto...

si stessa versione :D

Anto+ ha detto...

non appare nessun errore :D

Paolo De Dionigi ha detto...

Qui: http://sviluppo.atfriends.net/zencart/sconto_bonifico.zip

Trovate il modulo già completo (con le cartelle di zen).

Qui: http://sviluppo.atfriends.net/zencart/

potete, se volete, verificare il funzionamento. E' un sito demo, quindi niente è 'vero'. Usate dati fittizi per la registrazione così non ci sono gabole con la privacy.

Anto+ ha detto...

provo subito

Anto+ ha detto...

ora tutto ok..era il mio modulo bonifico.grazie ancora

Treviso Import ha detto...

Ciao! Mi chiamo Stefano! E' possibile prevedere l'eliminazione delle sepse di spedizione (non farle pagare al cliente) a seconda del tipo di pagamento?
Grazie

salvatore ha detto...

ciao

ho provato a usare il modulo per uno sconto con paypal

ho sostituito :
bonifico con PayPal e
BONIFICO con PAYPAL

se manca il file di lingua il sistema mi indica appunto che manca , ma se inserisco il file di lingua il modulo in order total non si vede!


zencart 139f


grazieee

saluti

salvatore ha detto...

ok risolto