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).

4 pensieri su “Drupal 7: gestione note spese

  1. Caro Giuseppe, hai ragione.

    La potenza di Drupal è notevole e ne apprezzo soprattutto la possibilità di adeguarsi rapidamente a specifiche in evoluzione.
    Ho fatto sviluppare un prodotto di protocollazione e gestione documentale (std digitpa) anche un plugin web twain per l’integrazione con uno scanner.
    Abbiamo però notato in questo caso qualche problema nella gestione di ACL complesse in particolare per la gestione dei permessi a livello di singolo documento (problema che abbiamo risolto aggiungendo una gestione ad hoc).

    Buon anno!

    Costantino

    Mi piace

    1. Ciao Costantino
      in effetti la gestione documentale in Drupal è affrontata da diversi moduli aggiuntivi, con approcci abbastanza differenti e che pongono tutti qualche problema, soprattutto nell’ACL. Semplificando al massimo, direi che ci sono due approcci: considerare il documento un file (e qui i lmassimo credo sia il modulo Web File Manager) o considerarlo un oggetto con file allegati (o meglio ancora, in campi di tipo file), e qui ci si può sbizzarrire.
      In questo secondo caso, si possono adottare per le ACL tecniche del tipo quella indicata in questo post:

      https://giubot.wordpress.com/2010/03/25/a-scuola-di-drupal-proteggere-i-contenuti-per-categoria/

      che permettono una buona flessibilità. Mi piacerebbe conoscere qualche dettaglio della tua esperienza di gestione documentale con Drupal. Hai affrontato anche la questione della ricerca full text?

      Mi piace

      1. Rieccomi,

        ho chiesto ai programmatori di verificare quali moduli drupal possono interfacciare meglio lucene e solr. Queste funzioni le ho inserite nella seconda release del prodotto.

        Il 26 presento il prodotto internamente ed ho preparato una prima presentazione con le slide.

        Se vuoi te le posso inviare ma per i dettagli devo chiedere agli sviluppatori. Ti interessano i moduli o altro?

        Fammi sapere

        Mi piace

  2. Ciao Giuseppe,
    complimenti per il tuo articolo. Ho seguito le tue istruzioni per creare una gestione di semplici fatture: SOCIETA’ che fattura a dei clienti.

    L’unica cosa che on riesco a fare è come poter esportare la fattura di ogni cliente in pdf.

    Tu conosci qualche metodo in Drupal? Uso Drupal 7.

    Grazie mille per l’aiuto.

    Mi piace

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...