Telefono: +39 392 33 73 731

Aggiungere campi SDI e PEC per la fatturazione italiana in Prestashop 1.6+

In questo tutorial trovi le istruzioni per adeguare il tuo Prestashop alle norme di fatturazione a partire da gennaio 2019. Tra i campi che dobbiamo chiedere a un cliente business ci sono anche il codice SDI e la PEC. Le mie istruzioni valgono per la versione 1.6, non ho ancora verificato PS 1.7. L'operazione è facile ma serve un minimo di conoscenza tecnica, si andrà a toccare il database e i file php di Prestashop. Se non sei in grado di lavorarci da solo, contattami e ti sistemo il sito con un piccolo compenso.

Ho trovato insoddisfacenti tutte le soluzioni nel forum di Prestashop. Il mio risultato è un po' invasivo però elegante: i campi SDI e PEC verranno posizionati subito dopo al campo Partita IVA, e appariranno appena viene compilato il campo Azienda. In modo simile a quanto fa già Prestashop per la partita iva.

Piano dell'intervento

  1. Aggiungere in database due nuovi campi nella tabella ps_address.
  2. Aggiungere gli override di classe e controller per prevedere i due campi in Prestashop.
  3. Aggiungere i due campi nella configurazione della nazione.
  4. Aggiungere i due campi nel template di immissione/modifica indirizzo.

MySql, aggiungi i campi in database

Prima di procedere fai un backup completo del sito, database+file. Non mi assumo alcuna responsabilità se fai danni e non sai come ripristinare.
Apri lo strumento di gestione database, tipicamente PHPMyAdmin, oppure Adminer. Cerca la tabella ps_address. Il prefisso ps_ è quello originale di Prestashop, ma potresti avere qualcosa di diverso, tu devi modificare la query in accordo con il nome che hai nel tuo database.
Esegui la seguente query.

ALTER TABLE `ps_address`
ADD COLUMN sdi VARCHAR(16) AFTER `dni`,
ADD COLUMN pec VARCHAR(128) AFTER `sdi`;

Dovresti ora verificare che i due campi sono stati inseriti in database, come nel seguente screenshot.

Override

Per quanto riguarda gli override, ora darò istruzioni sul metodo e fornirò degli esempi, ma tu devi prendere come riferimento il codice contenuto nei file originali delle cartelle classes e controllers, è importante prelevare il codice direttamente dalla tua versione di Prestashop, perchè potrebbero esserci leggere differenze.

Crea il file override/classes/Address.php e inserisci il seguente codice (oppure se il file è già esistente, aprilo, troverai la classe già dentro).

<?php
class Address extends AddressCore
{

}

All'interno della classe va copiato per intero l'array della definizione dei campi che trovi in classes/Address.php, non ricopio la lista, metti la tua, alla fine aggiungi i nuovi campi. Il codice diventa simile a questo.

<?php
class Address extends AddressCore
{
	public $sdi;
	public $pec;
	
	public static $definition = array(
	//// ... qui va copiata la lista originale di tutti i campi ... ////
	'sdi' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'size' => 16),
	'pec' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'size' => 128),
	);
}

Crea il file override/controllers/admin/AdminAddressesController.php e inserisci il seguente codice (oppure se il file è già esistente, aprilo, troverai la classe già dentro).

<?php
class AdminAddressesController extends AdminAddressesControllerCore
{

}

In modo simile a prima, andremo a riportare il pezzo originale, in questo caso va copiata per intero la funzione renderForm() che si trova nel file controllers/adminAdminAddressesController.php. Cerca nel codice l'array dni che è simile a questo:

array(
	'type' => 'text',
	'label' => $this->l('Identification Number'),
	'name' => 'dni',
	'size' => 30,
	'required' => false,
	'desc' => $this->l('DNI / NIF / NIE')
),

I parametri potrebbero cambiare leggermente (nelle versioni più recenti di Prestashop non c'è 'size'=>30 ma 'col'=>'4', sarebbe la dimensione del campo in back office, io ho messo col 2 per il campo SDI). Vanno quindi inseriti i due campi nuovi, in modo simile al seguente

array(
	'type' => 'text',
	'label' => $this->l('SDI'),
	'name' => 'sdi',
	'size' => 30,
	'required' => false,
),
array(
	'type' => 'text',
	'label' => $this->l('PEC'),
	'name' => 'pec',
	'size' => 30,
	'required' => false,
),

Scorri il file, e trova la stringa seguente nella parte finale.

return parent::renderForm();

Sostituiscila con la seguente

return AdminController::renderForm();

Dopo avere salvato questi due file di override, va eliminato il file cache/class_index.php

Configurazione

Questa fase è molto importante e non c'è un metodo automatico da script, bisogna entrare in admin di Prestashop, poi menu Localizzazione, Nazione. Modificare la voce Italia. Aggiungi nella lista dei campi, dopo vat_number, anche sdi e pec. Solo in questo modo potranno apparire nel blocco dell'indirizzo e nel form dell'utente. Vedi il risultato nello screenshot.

Modifica del template

Entra nella cartella del tuo tema, in themes, e modifica il file address.tpl
Cerca il campo vat_number che ha un codice simile a questo

{if $field_name eq 'vat_number'}
	//// ... qui c'è il markup del campo ... ////
{/if}

Aggiungi dopo di esso altri due campi, il tuo tema potrebbe usare dei tag html particolari quindi questa parte differisce in modo sensibile da tema a tema, prendi a modello il markup di un campo di testo semplice e non obbligatorio, tipo company. Sostituisci "company" con "sdi" in tutte le occorrenze richieste, e poi ripeti anche per "pec".
Infine, è necessario aggiungere un div contenitore con ID specifico, nel mio esempio ho usato "sdi_number" e "pec_email". Il codice da aggiungere è simile a questo

{if $field_name eq 'sdi'}
	<div id="sdi_number" class="text form-group">
		<label for="sdi" >{l s='SDI'}</label>
		<div class="controls" >
			<input type="text" class="text" name="sdi" value="{if isset($smarty.post.sdi)}{$smarty.post.sdi}{else}{if isset($address->sdi)}{$address->sdi|escape:'html'}{/if}{/if}" />
		 </div>
	</div>
{/if}
{if $field_name eq 'pec'}
	<div id="pec_email" class="text form-group">
		<label for="pec" >{l s='PEC'}</label>
		<div class="controls" >
			<input type="text" class="text" name="pec" value="{if isset($smarty.post.pec)}{$smarty.post.pec}{else}{if isset($address->pec)}{$address->pec|escape:'html'}{/if}{/if}" />
		 </div>
	</div>
{/if}

Ultimo tocco, alla fine del file, quando terminano i tag html, inserisci un pezzetto di javascript per controllare la visibilità dei due campi aggiunti. Se hai fatto tutto secondo le mie istruzioni il codice è questo

<script type="text/javascript">
// <![CDATA[
{literal}
	$(document).ready(function() {
		$('#company').on('input',function(){
			fisco_ita();
		});
		fisco_ita();
		function fisco_ita()
		{
			if ($('#company').val() != '') {
				$('#sdi_number').show();
				$('#pec_email').show();
			} else {
				$('#sdi_number').hide();
				$('#pec_email').hide();
			}
		}
	});
{/literal}
//]]>
</script>

Il tutorial è concluso, fai una verifica, dovresti trovare i campi nel form dell'indirizzo utente.

Giovedì 14 Febbraio 2019
(1 commenti)
PHP

Commento di Stefano R.

Martedì 14 Maggio 2019

Salve,
la sua soluzione è molto interessante.
Ho un solo dubbio, quando ci sara' un aggiornamento/conversione di PS, i campi aggiunti saranno persi?
Grazie

Risposta di Marco

Gli aggiornamenti di Prestashop raramente modificano le colonne già esistenti, e quando lo fanno dovrebbero alterare solamente le colonne già conosciute. Le mie inserite manualmente dovrebbe lasciarle stare.
In ogni caso, prima di fare un upgrade è sempre consigliato un backup completo di file e database, quindi ogni problema viene scongiurato.

Aggiungi un commento

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