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

Aggiungi un commento

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