Drupal 7: gestione note spese

Io amo Drupal perchè, diversamente da quasi tutti gli altri CMS, consente di costruire applicazioni internet “guidate dai dati” strutturati anziché da semplici contenuti “destrutturati” (come articoli e pagine). E (quasi) sempre senza scrivere una riga di codice.

Come esempio, proviamo a costruire la gestione delle Note Spese. Semplificando un po’, una Nota Spese è una entità formata da una intestazione (descrizione, data di presentazione, richiedente, luogo ecc.) e da un numero arbitrario di righe (che chiamerò “Spesa”), ognuna delle quali formata da diversi campi: descrizione, tipologia (es. “vitto”, “alloggio”), valore della spesa, valore del rimborso richiesto ecc.

Questo modello a due livelli (1 intestazione + molte righe) è comune a molti altri casi reali (es. ordini di acquisto, fatture) e quindi è di particolare interesse. Può essere costruito in Drupal (6 o 7) creando due tipi di contenuto (“Nota Spesa” e “Spesa”) legandoli tra loro con una delle seguenti soluzioni:

  • aggiungere al modello”Nota Spese” un campo (di tipo “Node Reference”) che punta a entità di tipo “Spesa” e dichiarare che questo campo può accogliere un numero arbitrario di Spese. Questa soluzione richiede però di inserire prima le singole Spese e poi di collezionarle nel campo della Nota Spese. Questa artificiosità di inserimento può essere parzialmente superata utilizzando moduli appositi (es. “Add and Reference“) che, mentre si modifica una Nota Spese, consentono di creare al volo le Spese e collegarle alla Nota Spese stessa.
  • aggiungere al modello”Spesa” un campo (di tipo “Node Reference”) che punta a entità di tipo “Nota Spese”. Questa soluzione permette un inserimento più intuitivo (prima si inserisce la Nota Spese e poi le singole Spese) ma, ad ogni inserimento di nuova Spesa, bisogna riselezionare la Nota Spese giusta. Questo fastidio può essere ovviato con moduli (es. “URL Fill“) che “precaricano” il campo legame in modo che punti alla Nota Spese voluta.

Entrambe le soluzioni presentano perciò alcuni problemi di usabilità, risolvibili con parecchio sforzo di configurazione. Drupal 7 offre una soluzione molto simile ma più semplice da realizzare, grazie al modulo “field_collection“. Questo modulo (purtroppo non disponibile per Drupal 6) aggiunge un nuovo tipo di campo, “field collection” che a sua volta è formato da diversi campi. Nel nostro esempio, agiungeremo perciò un campo “field collection” di nome “Spesa” al modello Nota Spese come nella soluzione 1; la novità vera è che la creazione e la modifica di un campo field collection (compresi quindi i suoi campi) avviene dentro la medesima maschera in cui si crea / modifica la Nota Spese (cliccare sulle figure per ingrandirle):

Così pure la visualizzazione della Nota Spese mostra anche le Spese, permettendo anche di modificarle al volo senza rimodificare l’intera Nota Spese:

Anche le Viste (“Vews” di Drupal) lavorano bene coi field_collection, mostrando l’intera struttura delle Spese come fosse un singolo campo della Nota Spese:

Non solo: siccome le singole Spese sono in realtà archiviate in Drupal come entità separate, con un piccolo trucco è possibile richiamarle in una Vista indipendentemente dalla Nota Spese cui si riferiscono; si può così ad esempio costruire una Vista – utile a chi deve autorizzare i rimborsi – che analizza le singole richieste di rimborso per tipologia (es. solo le spese di viaggio):

Naturalmente, per avere una applicazione completa mancano parecchi dettagli, ma la struttura fondamentale c’è tutta ed è realizzabile in un paio d’ore di lavoro, avendo un po’ di dimestichezza con Drupal. Per chi volesse replicare questo esperimento, ho utilizzato Drupal 7 e i moduli aggiuntivi:

La struttura “Nota Spese” è la seguente (si noti il campo “Spesa” definito come “field_collection”, questo è il passaggio fondamentale):

La struttura “Spesa” la si definisce nella nuova sezione  “field_collection”:

La Vista che elenca la Nota Spese è banale: è una Vista che elenca le entità di tipo “Nota Spese” in forma tabellare, dove basta aggiungere alle colonne il campo “Spesa” (indicato dal cursore) per ottenere la visualizzazione completa delle Spese associate alla Nota Spesa:

Meno banale la Vista che elenca le singole Spese: come per la precedente, si parte da una Vista che elenca le Note Spese, cui si aggiunge la “relazione” sul campo Spesa dell’entità Nota Spese (mostrata dal cursore nella figura che segue). Grazie a questa aggiunta, si rendono disponibili per le colonne della Vista tutti i campi delle entità Spesa (che iniziano con “field collection item”):

Per chi vuole giocare con Drupal 7 sul proprio pc consiglio l’applicazione AMPPS che facilita enormemente l’installazione di Drupal (e di altre 200 applicazioni open source a scelta).