Aggiungere campi SDI e PEC per la fatturazione italiana in Prestashop 1.6+
Attenzione! La guida è per versioni fino a 1.7.6, e NON vale per 1.7.7 e superiori
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. A un cliente business dobbiamo chiedere 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
- Aggiungere in database due nuovi campi nella tabella ps_address.
- Aggiungere gli override di classe e controller per prevedere i due campi in Prestashop.
- Aggiungere i due campi nella configurazione della nazione.
- 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.
Questo articolo ha 0 commenti