Telefono: +39 392 33 73 731

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

AGGIORNAMENTO per PS 1.7 del 26/05/2020

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 (Sistema Di Interscambio) e la PEC (Posta Elettronica Certificata). Le mie istruzioni valgono sia per la versione 1.6, che per PS 1.7 (apportando piccole differenze di codice). 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 macchinose e insoddisfacenti tutte le soluzioni nel forum di Prestashop. Il mio risultato è più elegante, in quanto i campi SDI e PEC vengono posizionati subito dopo al campo Partita IVA, e appaiono appena viene compilato il campo Azienda. In modo simile a quanto Prestashop fa già per la partita iva. Anche il salvataggio è più conerente, in quanto i due campi sono salvati nella stessa tabella "ps_address".

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(
        'table' => 'address',
        'primary' => 'id_address',
        'fields' => 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.
Inseriamo i due campi dopo il campo del codice fiscale, quindi cerca "Identification number" che sarebbe l'array dni, simile a questo:

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

A questo punto ci sono le prime differenze tra versioni di Prestashop. I parametri cambiano leggermente:

  • nelle versioni vecchie di PS 1.6 i campi vegono dimensionati con il parametro size, c'è ad esempio 'size'=>30
  • nelle versioni più recenti di PS 1.6, e in PS 1.7 invece viene usato il parametro col, ad esempio 'col'=>'4'
  • altra differenza riguarda il sistema di traduzione delle etichette di testo: in PS 1.6 vigono le regole vecchie, mentre in PS 1.7 serve il nuovo sistema di traduzioni con dominio.

Il codice seguente è valido per Prestashop 1.6 recente, e 1.7 (se hai un sito molto vecchio usa "size" invece di "col"):

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

Avrai notato che le stringhe non sono scritte nella forma corretta per PS 1.7. Questo perché ho scoperto due bug: i file di override non vengono presi in considerazione dal nuovo sistema di traduzione, quindi le stringhe non sono traducibili, anche inserendole correttamente. Ho provato ad aggiungerle direttamente in database, in tabella ps_translations, ma è inutile. Il secondo bug riguarda il modulo dell'indirizzo dell'utente, nella versione 1.7 i campi sono generati automaticamente (invece nella versione 1.6 bisogna modificare il template, come spiego più avanti). Da un lato è più comodo ma è anche limitante: non scrivendo il markup HTML non possiamo nemmeno aggiungere classi, id, e javascript. Inoltre le etichette non sono prese correttamente, viene usato il nome del campo (escono: "pec" e "sdi" invece di "PEC" e "SDI"). A questo punto ho lasciato il codice per PS 1.6 anche per 1.7, non è perfetto ma è accettabile.

Ora scorri il file fino alla fine, e trova la stringa seguente.

return parent::renderForm();

Sostituiscila con la seguente

return AdminController::renderForm();

Dopo avere salvato questi due file di override, va eliminato il file class_index.php che si trova in posizioni differenti in base alla versione di Prestashop.

  • In PS 1.6 è cache/class_index.php
  • In PS 1.7 è var/cache/prod/class_index.php

Configurazione

Questa fase è molto importante e non c'è un metodo automatico da script, bisogna entrare in admin di Prestashop, poi:

  • Per PS 1.6 si va in menu Localizzazione, Nazione.
  • Per PS 1.7 si va in menu Internazionale, Località, poi scheda Nazione.

Modifica la voce Italia. Aggiungi nella lista dei campi, dopo vat_number, anche sdi e pec. Salva, se ti da errore perché non riconosce i campi, allora significa che non hai cancellato il file class_index.php, leggi bene la fine del capitolo precedente.

Solo in questo modo potranno apparire SDI e PEC nel blocco dell'indirizzo e nel form dell'utente. Visto che ci sei puoi aggiungere anche il campo dni, perché di default non lo mettono mai. Vedi il risultato nello screenshot.

Modifica del template

Se hai PS 1.7 devi fermarti qui, il sito è già a posto. Il resto di istruzioni serve solo per PS 1.6.

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
(6 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.

Commento di Marco

Lunedì 04 Maggio 2020

Ciao,
grazie per la guida, ottima!
Testata su prestashop 1.6.1.1
In FO tutto funziona alla perfezione, in BO se clicco su indirizzi/modifica ricevo pagina bianca.

Qualche consiglio? Grazie in anticipo

Risposta di Marco

Non so perché ti dia errore, dovresti attivare il debug, per leggere gli errori. Anche il log errori PHP del server va bene. Probabilmente c'è un errore in AdminAddressesController.php ma sto andando per supposizione.
Bisogna seguire alla lettera ciò che ho scritto perché ci sono modifiche da fare al database, alle classi, al template del tema, e bisogna anche configurare correttamente gli indirizzi nella nazione. Si deve fare tutto altrimenti non funziona.

Commento di Fabio

Mercoledì 23 Dicembre 2020

Ciao, grazie della guida!
Ti segnalo che la mancata traduzione non è un bug, ma semplicemente non è fatta nel posto giusto. Per esempio per tradurre i campi aggiuntivi bisogna fare un override della classe \classes\form\CustomerAddressFormatter.php e modificare quindi la funzione getFieldLabel
Nella stessa classe è interessante un hook presente: "additionalCustomerAddressFields", dovrebbe poter fare questo lavoro tramite modulo. Però non ho ancora approfondito.

Risposta di Marco

Grazie Fabio, non conoscevo quella parte, le traduzioni in PS 1.7 sono complicate e mi hanno sempre dato noie. Non ho tempo per approfondire, negli ultimi Prestashop ho risolto il problema dei campi SDI e PEC installando un modulo apposito.

Commento di carlo

Mercoledì 27 Gennaio 2021

Ciao, uso la versione 1.7.7.1 di prestashop e ho notato che dalla 1.7.7.0 il file AdminAddressesController.php non è più presente dentro a controllers/admin. Come si può risolvere?
Grazie

Risposta di Marco

Leggo che hanno migrato parecchie parti a Symfony, tra cui il meccanismo con cui venivano gestiti gli indirizzi. Io ho al massimo siti fatti con 1.7.6.7 e non ho aggiornato ancora nulla, non saprei aiutarti.
Sicuramente dalla 1.7.7 per aggiungere e rimuovere campi, e agire su quella parte, si dovrà fare via moduli. Serve cercare nel forum.

https://build.prestashop.com/news/prestashop-1-7-7-0-beta-release/

Commento di Luca

Venerdì 29 Gennaio 2021

ciao, grazie per le istruzioni. Nella mia installazione PS 1.7.6.8 funziona tutto, ma non riesco a rendere obbligatorio il campo SDI: ho provato ad andare su Clienti-Indirizzi e ad impostare il nuovo campo sdi tra quelli obbligatori, ma nessuno dei 2 campi aggiunti compare nella lista nonostante sia presente nel form indirizzo del cliente, e funzioni correttamente. Hai una soluzione ?
Ringrazio anticipatamente. Luca

Risposta di Marco

Se non vedi i campi può dipendere dalla cache, hai già rigenerato class_index.php? Se apri quel file sono presenti i percorsi dei due file override che hai aggiunto?

Commento di Ezio

Giovedì 04 Febbraio 2021

Ciao e grazie per la guida (la migliore online).
Sembra funzionare tutto, ma in realtà non salva i valori, nè al momento in cui si aggiunge FO un indirizzo, nè da BO editando l'indirizzo. Cosa bisogna fare?? Grazie!

Risposta di Marco

Ciao Ezio, sembra che il controller non funzioni, assicurati di averlo messo nella posizione giusta, e di avere rimosso/rigenerato class_index.php (dentro deve contenere i riferimenti verso i due nuovi "override/"). Se tutto è ok allora è un altro problema, ma non saprei aiutarti, serve analizzare.

PS: attenzione che la guida è per PS 1.6, poi aggiornata per funzionare fino a 1.7.6, ma dalla versione 1.7.7 hanno migrato la parte degli indirizzi in Synfony, è tutto cambiato, non esiste neanche più la stessa classe e controller. Quindi questa guida NON è per versioni 1.7.7 +

Aggiungi un commento

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