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 ;)