Università degli studi di Ferrara Indice 1. Introduzione...............................................................................................3 2. Progetto dell'applicazione Web "Missioni Amministratori".....................5 1.1.Scopo dell’applicazione........................................................................5 1.2.Contesto.................................................................................................5 1.3.Specifiche..............................................................................................6 1.3.1.Gli stadi di una richiesta di missione............................................6 1.3.2.Gruppi Utente...............................................................................8 1.4.Architettura............................................................................................9 1.5.Gestione dei permessi..........................................................................10 1.6.Architettura del database.....................................................................11 1.7.Struttura delle pagine Web..................................................................12 3. Tecnologie impiegate..............................................................................15 1.8.Server Web Apache.............................................................................15 1.9.MySql..................................................................................................16 1.10.HTML e CSS.....................................................................................17 1.11.Javascript...........................................................................................18 1.12.P.H.P..................................................................................................20 1.12.1.Storia:20 1.12.2.Caratteristiche:..........................................................................21 4. Realizzazione dell’applicazione..............................................................22 1.13.Tabelle del Database.........................................................................22 1.14.Struttura degli script..........................................................................24 1.15.Implementazione del motore a workflow..........................................25 1.16.Le transizioni e la compatibilità con i browser.................................26 1.17.Missione: dalla richiesta all’approvazione........................................27 1 Università degli studi di Ferrara 1.17.1.Richiesta...................................................................................27 1.17.2.Approvazione...........................................................................29 1.17.3.Compilazione dettagli...............................................................29 1.17.4.Verifica spese e saldo...............................................................30 1.17.5.Chiusura....................................................................................32 1.17.6.Archiviazione...........................................................................32 1.18.Report................................................................................................34 1.19.Amministrazione...............................................................................34 1.20.Test di servizio..................................................................................35 5. Conclusioni..............................................................................................35 6. Riferimenti...............................................................................................37 7. Indice delle figure....................................................................................37 2 1. Introduzione Gli enti pubblici, responsabili della gestione di numerosi dati relativi ai cittadini, presentano un’ampia quantità di procedure burocratiche per la raccolta e amministrazione degli stessi. Con il passare degli anni gli enti hanno percepito sempre più la necessità di informatizzare i loro servizi e le loro procedure, al fine di ridurre i tempi morti della burocrazia e di migliorare la qualità del servizio, oltre che di raggiungere in maniera più efficiente i cittadini. Il Comune di Cento, che da tempo è uno dei comuni più orientati verso l’informatizzazione dei propri apparati, presenta già numerosi servizi realizzati tramite applicazioni Web, come ad esempio il catasto o l’archivio contenente i verbali del consiglio comunale, entrambi consultabili via web. L’informatizzazione del comune non si limita però alla fornitura di servizi per il cittadino, ma comprende anche numerosi applicativi atti a migliorare la qualità del lavoro all’interno del comune stesso, come un servizio di telefonia VoIP o applicazioni mirate ad affiancare i vari uffici nella compilazione della modulistica, richiesta dalla burocrazia. Un esempio di questo secondo caso è l’applicazione “Missioni Dipendenti”, che si occupa di gestire le varie pratiche riguardanti le uscite dei dipendenti comunali, specialmente per quel che concerne l’erogazione di rimborsi spese, nell’ottica della compilazione del bilancio annuale. Questa tesi descrive la progettazione e realizzazione di un ampliamento di “Missioni Dipendenti”, tramite una nuova applicazione, “Missioni Amministratori”, che si occupa di gestire le missioni di consiglieri e assessori (collettivamente chiamati amministratori), i quali, essendo sottoposti a normative differenti rispetto al resto dei dipendenti comunali in materia di rimborsi spese, non vengono trattati dall’applicazione precedente. “Missioni Amministratori” ha quindi lo scopo di permettere a consiglieri e assessori di compilare autonomamente le richieste e le note spese relative alle proprie missioni, riducendo al minimo la necessità di spostarsi tra uffici per consegnare i vari moduli. L’applicazione deve inoltre permettere alla segreteria generale, che si occupa di stilare il bilancio del comune, di visualizzare report dettagliati sulle spese sostenute dagli amministratori, in modo da facilitarne la compilazione. Dopo aver definito con precisione quale fosse l’iter burocratico che una missione deve seguire e quali fossero gli attori coinvolti in esso, è stato possibile passare al progetto. Quest’ultimo è partito con l’introduzione di un motore a workflow (o W.E. che sta per Workflow Engine) per la gestione dell’evoluzione di una richiesta di missione, in modo da controllare efficacemente le varie operazioni che caratterizzano il passaggio di quest’ultima da uno stadio all’altro. In seguito l’ambito d’impiego del W.E. si è allargato, comprendendo anche la gestione delle transizioni tra una pagina web e l’altra, al fine di sovraintendere l’applicazione di politiche di sicurezza che consentano agli utenti l’accesso solamente alle pagine per cui hanno i diritti. Una volta stabilite le fondamenta del progetto, ci si è occupati di realizzare un’applicazione quanto più simile, come interfaccia e logica d’utilizzo, a quella già esistente, al fine di renderne l’utilizzo il più immediato possibile. Infine è stata progettata un’architettura di base degli script, per una facile realizzazione e manutenzione dell’applicazione. A questo punto si è passati alla fase di realizzazione, basandosi su tutto ciò che è stato definito in fase di progettazione e seguendo le linee guida che sono state elencate. Sono state create le tabelle necessarie, è stato sviluppato il motore a workflow e basandosi su di esso sono state create le varie pagine, partendo inizialmente da blocchi di base che sono stati man mano composti per realizzare strutture più complesse. Si è inoltre cercato di garantire la massima compatibilità dell’applicativo con i vari browser presenti sul mercato, allo scopo di rendere il servizio fruibile indipendentemente dalla configurazione della macchina utilizzata per accedervi. Questa tesi è il frutto di un tirocinio svolto presso il Servizio Sistemi Informativi (SSI) del Comune di Cento che si occupa della gestione e amministrazione hardware e software della rete civica, l’amministrazione dell’intranet comunale, del portale del Comune, la gestione e realizzazione di servizi on-line e siti Web strettamente collegati al Comune. 2. Progetto dell'applicazione Web "Missioni Amministratori" Il progetto prevede lo sviluppo di un’applicazione che permetta di informatizzare le procedure legate alla richiesta e alla gestione delle missioni degli amministratori, intendendo con missioni le trasferte, o uscite, che un dipendente effettua. 1.1. Scopo dell’applicazione L’applicativo deve permettere di gestire i vari stadi di una missione, partendo dalla richiesta di autorizzazione per una nuova uscita, fino ad arrivare all’archiviazione, passando per l’erogazione di un eventuale anticipo, la compilazione delle note spesa, il calcolo del rimborso chilometrico e il saldo. Bisogna inoltre prevedere una struttura dell’applicazione che permetta a ogni amministratore, nel senso di consigliere o assessore, di inserire autonomamente i dati delle proprie missioni senza però inserire procedure troppo rigide, in modo da permettere a eventuali delegati di effettuare inserimenti in vece degli amministratori. Si deve inoltre prevedere la creazione di report riassuntivi, che comprendano spese effettuate e rimborsi, sia generali sia riferiti a un singolo amministratore, in modo da semplificare la stesura del bilancio annuale. 1.2. Contesto Il comune di Cento, da tempo indirizzato verso l’informatizzazione delle procedure amministrative, disponeva già di un’applicazione Web, ” Missioni Dipendenti”, molto simile a quella che è stata realizzata. La principale differenza tra le due applicazioni, infatti, riguarda i soggetti che vengono gestiti: “Missioni Dipendenti” si occupa di tutti i dipendenti comunali ad eccezione di consiglieri e assessori, che vengono trattati “Missioni Amministratori”. La necessità di utilizzare due applicazioni diverse sorge dalle differenze a livello burocratico e amministrativo nella gestione dei rimborsi spese degli amministratori rispetto agli altri dipendenti comunali. Ad eccezione di questo però, le funzioni svolte dalle due applicazioni sono pressoché identiche. Il contesto iniziale prevedeva quindi un insieme di procedure burocratiche per la compilazione delle richieste di rimborso, che veniva in parte informatizzato tramite un’applicazione preesistente e in parte svolto nella maniera tradizionale, per mezzo di diversi moduli cartacei. 1.3. Specifiche In questa sezione si definisce qual è la realtà che l’applicazione deve rappresentare: nello specifico si individuano i vari gruppi utente e si schematizza il percorso burocratico che porta una missione dalla richiesta all’archiviazione. 1.3.1. Gli stadi di una richiesta di missione La prima cosa da individuare è la trafila di passaggi che vengono effettuati per ottenere il rimborso spese di un’uscita. Come si può vedere in figura 1, per prima cosa viene compilata una richiesta di missione e sottoposta al proprio responsabile. Dopo l’approvazione, nel caso si debba ricevere un anticipo, la richiesta arriva all’economato che si occupa di erogarlo. A questo punto l’amministratore può svolgere la missione. Al termine di essa bisogna compilare la nota spese e l’elenco delle tappe (per il calcolo del rimborso chilometrico) e consegnarla in economato, per un rimborso immediato, o al gabinetto del sindaco, per un rimborso in busta paga. Economato e gabinetto del sindaco si occuperanno poi di fornire i dati alla segreteria amministrativa, che procederà all’archiviazione. FIGURA 1: L’EVOLUZIONE DI UNA MISSIONE, DALLA RICHIESTA ALL’ARCHIVIAZIONE. 1.3.2. Gruppi Utente Come si è potuto vedere, la realtà che il programma va a rappresentare è composta di diversi agenti che interagiscono, ognuno con funzioni e privilegi specifici. Questi agenti corrispondono a diversi tipi di utenti, nello specifico: consigliere o assessore, responsabile, economato, gabinetto del sindaco, segreteria amministrativa e amministratore di sistema. Chi accede all’applicazione può appartenere a uno o più di questi gruppi, come pure a nessuno (il generico dipendente comunale ad esempio). Le azioni che i vari gruppi utente possono compiere sono le seguenti. Consigliere o Assessore: - può sottoporre al suo responsabile una richiesta di missione; - può compilare le note spese e le tappe percorse relative alle missioni da lui eseguite; - può visualizzare i dati relativi alle missioni che ha svolto. Responsabile: - può approvare o rifiutare una richiesta di missione a lui sottoposta; - può visualizzare i dati relativi alle missioni che ha approvato. Economato: - eroga gli anticipi; - effettua il saldo; - può visualizzare i dati relativi alle missioni. Gabinetto del Sindaco: - effettua il saldo; - verifica i dati relativi alle missioni prima di chiuderle; - chiude le missioni; - può visualizzare i dati relativi alle missioni. Segreteria Amministrativa: - archivia le missioni; - può visualizzare report riassuntivi sulle varie missioni. Amministratore di Sistema: - si occupa della corretta assegnazione dei gruppi agli utenti; - esegue operazioni di manutenzione sull’applicazione. Oltre a questo, bisogna dare la possibilità agli agenti che si occupano del saldo e dell’archiviazione (economato, gabinetto del sindaco e segreteria amministrativa), di correggere eventuali errori che dovessero riscontrare, permettendo quindi loro di modificare le note spese e in alcuni casi la lista delle tappe. Un ultimo punto riguarda la necessità di un sistema d’impersonificazione, che permetta ad alcuni utenti specifici di agire in vece di altri, da cui hanno ricevuto in precedenza la delega. In questa maniera, ad esempio, la segretaria del sindaco può compilare una richiesta di missione in nome di un assessore se quest’ultimo decide di demandare a lei la parte burocratica della richiesta. 1.4. Architettura Nel progettare la struttura dell’applicazione si è dovuto tenere presente lo scopo principale per cui essa è nata, ovvero gestire l’evoluzione di una missione attraverso le varie fasi che la contraddistinguono. L’idea di fondo è di un’entità “missione”, con vari attributi che la caratterizzano, che passa da uno stadio all’altro, ad esempio da “richiesta pendente” ad “approvata”. A ogni passaggio di stato possono inoltre essere associate delle condizioni, che devono essere verificate affinché esso possa essere eseguito, oppure operazioni da svolgere (ad esempio, inviare un’email di conferma all’utente). Si è quindi pensato di organizzare il flusso delle azioni tramite un workflow [Workflow], intendendo con questo termine la serie d’interazioni che devono avvenire per completare un’azione. A questo scopo si è realizzato un motore a workflow, ovvero l’applicazione software che si occupa di interpretare gli eventi del sistema e agire su di essi in base alle regole del workflow. Lo scopo del motore non si limita però alle missioni: esso, infatti, si preoccupa di costruire ogni pagina del sito, applicando il concetto di workflow all’intera applicazione. Il passaggio tra due pagine è l’equivalente di un cambio di stato e le condizioni sulle transizioni tra uno stato/pagina e l’altro sono caratterizzate da un controllo dei permessi dell’utente, per consentire l’accesso solamente alle pagine per cui possiede i diritti. 1.5. Gestione dei permessi La gestione dei permessi degli utenti, un punto importante in qualsiasi applicazione di un certo livello, diventa di fondamentale importanza nel caso delle missioni degli amministratori, dove vengono gestiti dei rimborsi spese. Anche senza prendere in considerazione la possibile malafede degli utenti, calcolare un bilancio basandosi su dati che possono essere modificati liberamente da chiunque, creerebbe dubbi sulla validità dello stesso. Per questo motivo l’esecuzione di qualsiasi azione da parte dell’utente è sottoposta a un controllo: l’azione viene eseguita solamente se l’utente detiene il permesso per eseguirla. Un utente può possedere dei diritti specifici legati a sé e altri dovuti ai gruppi a cui appartiene. L’unione di questi forma l’insieme dei suoi permessi. Le azioni controllate, invece, sono fondamentalmente le richieste di pagina fatte al server. Ogni richiesta che il browser invia al server viene considerata come una transizione tra lo stato attuale e quello specificato da essa. Se si tenta di eseguire una transizione senza averne il diritto, il server la ignora e restituisce un errore. Uno schema riassuntivo di questo procedimento si può vedere in figura 2, dove “successo” rappresenta la restituzione della pagina richiesta, mentre “fallimento” rappresenta il messaggio di errore. FIGURA 2: LA GESTIONE DEI PERMESSI 1.6. Architettura del database Il database è strutturato in tre sezioni fondamentali: tabelle relative alle missioni, tabelle relative al motore a workflow e tabelle relative ai permessi. In aggiunta a queste esistono alcune tabelle di servizio per il funzionamento dell’applicazione. Come si può vedere in figura 3, che è una rappresentazione del database ad alto livello, le tre sezioni sono cosi composte: Parte relativa alle missioni (in verde): - Missioni. Tutte le informazioni generali che riguardano un’uscita; - Utenti. Le persone associate a una missione, il soggetto che la intraprende e i responsabili; - Mezzi. I veicoli che possono essere utilizzati per gli spostamenti; - Tappe. Le tappe percorse, associate alla missione in cui sono state effettuate. Parte relativa al motore a workflow (in rosso): - Stato. L’insieme degli stati del motore, con le relative proprietà; - Transizioni. L’insieme delle transizioni. Parte relativa ai permessi (in arancio): - Permessi. L’insieme delle tabelle che associano i permessi agli utenti del sistema, da non confondere con gli utenti legati a una specifica missione. FIGURA 3: LA STRUTTURA DEL DATABASE 1.7. Struttura delle pagine Web Nel progettare la struttura delle pagine, considerazione che è stata fatta è che l’applicazione verrà usata da persone che hanno già utilizzato “Missioni Dipendenti”, per cui realizzare pagine con un aspetto, e un’impostazione logica, simile a quello dell’applicazione già esistente è di fondamentale importanza. Per questo motivo, come si può vedere in figura 4, si è divisa l‘interfaccia in tre parti: Header, Menù e Contenuto. - Header. Contiene il banner del Comune di Cento e il menu legato al sistema d’impersonificazione; - Menù. Mostra l’elenco delle azioni che l’utente può eseguire, raggruppate per gruppo di appartenenza; - Contenuto. Il contenuto specifico. Inoltre, in figura 5 sono riportate entrambe le interfacce, per un rapido confronto. La struttura interna delle pagine, invece, è stata orientata verso il maggior riutilizzo di codice possibile, ai fini di una maggior manutenibilità. Esiste una pagina principale, strutturata come l’interfaccia, il cui contenuto viene creato dinamicamente. Header e menù vengono creati da funzioni apposite a ogni caricamento della pagina, ma non subiscono variazioni sostanziali tra uno stato e l’altro. Il contenuto invece dipende dallo stato in cui ci si trova: ognuno di essi ha una vista corrispondente, se possibile condivisa tra più stati, che determina cosa viene visualizzato. Le viste inoltre possono essere realizzate componendo altre viste, ad esempio per generare report man mano più dettagliati. Va inoltre previsto un controllo lato client dei dati inseriti nelle form, in modo da ridurre il più possibile rallentamenti dovuti a comunicazioni con il server. Infatti, in caso di mancato controllo lato client la spedizione di valori errati comporterebbe l’invio da parte del server di un messaggio di errore e la richiesta di dati corretti. Se i controlli vengono invece eseguiti anche lato client, al server arrivano solo dati corretti. FIGURA 4: L’INTERFACCIA DELL’APPLICAZIONE FIGURA 5: UN CONFRONTO TRA LE DUE APPLICAZIONI: IN ALTO “MISSIONI DIPENDENTI” E IN BASSO “MISSIONI AMMINISTRATORI”. 3. Tecnologie impiegate Il progetto si basa sul popolare quadrinomio Linux, Apache, MySql e P.H.P. (L.A.M.P.). Apache è il server web, nel caso specifico, in esecuzione su una macchina virtuale linux, MySql invece è il Data Base Management System (D.B.M.S.) mentre P.H.P. è il linguaggio tramite il quale si realizzano dinamicamente pagine html. In aggiunta a questi, si è utilizzato il linguaggio di scripting Javascript per la manipolazione della pagina lato client e i fogli di stile CSS per la parte grafica. 1.8. Server Web Apache Apache HTTP Server [Server Web Apache], o più comunemente Apache, è il nome dato alla piattaforma server Web modulare più diffusa (ma anche al gruppo di lavoro open source che ha creato, sviluppato e aggiornato il software server), in grado di operare da sistemi operativi UNIX-Linux e Microsoft. Apache è un software che realizza le funzioni di trasporto delle informazioni, d’internetwork e di collegamento, ha il vantaggio di offrire anche funzioni di controllo per la sicurezza come quelli che compie il proxy. Il progetto Apache nacque nel 1995. A quel tempo, il server Web più diffuso era il daemon HTTP pubblico sviluppato da Rob McCool al NCSA (National Center for Supercomputing Application), Università dell'Illinois. Dal momento però che a partire dal 1994 lo sviluppo di questo server si era fermato (anche perché il suo autore aveva lasciato l'NCSA) un gruppo di webmaster aveva iniziato a sviluppare patch in maniera autonoma. La versione 1.0 fu pubblicata l'1 dicembre 1995. Nel giro di un anno, la sua diffusione aveva già superato quella del server NCSA da cui era derivato. La versione 2.0 di Apache venne rilasciata durante la conferenza ApacheCon, tenutasi nel marzo 2000 a Orlando, in Florida. Il grande successo di diffusione di questo software è l'indicatore più chiaro della qualità e dell'affidabilità di questo prodotto: secondo un'indagine Netcraft del 2005, su 75 milioni di siti web, circa 52 milioni utilizzavano Apache, a ottobre 2006 il numero è salito a 60 milioni (60,32% del totale). Operativamente, è composto da un demone, in ambiente UNIX, o da un servizio, in ambiente Microsoft, che sulla base delle impostazioni contenute nel file di configurazione permette l'accesso a un o più siti, gestendo varie caratteristiche di sicurezza e potendo ospitare diverse estensioni per pagine attive (o dinamiche), come PHP o Jakarta/Tomcat. 1.9. MySql MySQL è un database management system (DBMS) relazionale [DBMS MySQL], composto da un client con interfaccia a caratteri e un server, entrambi disponibili sia per sistemi Unix come GNU/Linux che per Windows, anche se prevale un suo utilizzo in ambito Unix. Dal 1996 supporta la maggior parte della sintassi SQL [Linguaggio SQL] e si prevede in futuro il pieno rispetto dello standard ANSI. Possiede delle interfacce per diversi linguaggi, compreso un driver ODBC, due driver Java e un driver per Mono e .NET. Il codice di MySQL viene sviluppato fin dal 1979 dalla ditta TcX ataconsult, adesso MySQL AB, ma è solo dal 1996 che viene distribuita una versione che supporta SQL, prendendo spunto da un altro prodotto: mSQL. Il codice di MySQL è di proprietà dell’omonima società, viene però distribuito con la licenza GNU GPL oltre che con una licenza commerciale. Fino alla versione 4.0, una buona parte del codice del client era licenziato con la GNU LGPL e poteva dunque essere utilizzato per applicazioni commerciali. Dalla versione 4.1 in poi, anche il codice dei client è distribuito sotto GNU GPL. Esiste peraltro una clausola estensiva che consente l'utilizzo di MySQL con una vasta gamma di licenze libere. MySQL svolge il compito di DBMS nella piattaforma LAMP, una delle più usate e installate su Internet per lo sviluppo di siti e applicazioni web dinamiche. Nel luglio 2007 la società svedese MySQL AB aveva 385 dipendenti in 265 paesi. I suoi principali introiti provengono dal supporto agli utilizzatori di MySQL tramite il pacchetto Enterprise, dalla vendita delle licenze commerciali e dall'utilizzo da parte di terzi del marchio MySQL. Il 16 gennaio 2008 Sun Microsystems ha acquistato la società per un miliardo di dollari, stimando il mercato del database in 15 miliardi di dollari. Nel caso specifico del progetto ci si è inoltre avvalsi di MySql administrator, un programma che permette di eseguire operazioni di amministrazione sul database tramite un’interfaccia grafica. 1.10. HTML e CSS L'HyperText Markup Language (HTML, traduzione letterale: linguaggio di marcatura per ipertesti) [Linguaggio HTML] è un linguaggio usato per descrivere la struttura dei documenti ipertestuali disponibili nel World Wide Web. Tutti i siti web sono scritti in HTML, codice che viene letto ed elaborato dal browser, il quale genera la pagina che viene visualizzata sullo schermo del computer. L'HTML non è un linguaggio di programmazione, ma un linguaggio di markup, ossia descrive il contenuto, testuale e non, di una pagina web. Punto HTML (.html) o punto HTM (.htm) è anche l'estensione comune dei documenti HTML. È stato sviluppato alla fine degli anni '80 da Tim Berners-Lee al CERN di Ginevra. Verso il 1994 ha avuto una forte diffusione, in seguito ai primi utilizzi commerciali del web. L'HTML è un linguaggio di pubblico dominio la cui sintassi è stabilita dal World Wide Web Consortium (W3C) [W3C], e che è basato su un altro linguaggio avente scopi più generici, l'SGML. Durante gli anni l'HTML ha subito molte revisioni e miglioramenti, che sono stati indicati secondo la classica numerazione usata per descrivere le versioni dei software. Attualmente l'ultima versione disponibile è la versione 4.01, resa pubblica il 24 dicembre 1999. Dopo un periodo di sospensione, in cui il W3C si è focalizzato soprattutto sulle definizioni di XHTML (applicazione a HTML di regole e sintassi in stile XML) e dei fogli di stile Cascading Style Sheet, CSS, nel 2007 è ricominciata l'attività di specifica con la definizione, ancora in corso, di HTML 5, attualmente allo stato di bozza. I fogli di stile a cascata (dall'inglese CSS Cascading Style Sheets) [CSS], detti semplicemente fogli di stile, vengono usati per definire la rappresentazione di documenti HTML e XHTML. Le regole per comporre i fogli di stile sono contenute in un insieme di direttive (Recommendations) emanate a partire dal 1996 dal W3C. L'introduzione dei fogli di stile si è resa necessaria per separare i contenuti dalla formattazione e permettere una programmazione più chiara e facile da utilizzare, sia per gli autori delle pagine HTML che per gli utenti. 1.11. Javascript JavaScript [Linguaggio JavaScript] è un linguaggio di scripting orientato agli oggetti comunemente usato nei siti web. Fu originariamente sviluppato da Brendan Eich della Netscape Communications con il nome di Mocha e successivamente di LiveScript, ma in seguito è stato rinominato "JavaScript" ed è stato formalizzato con una sintassi più vicina a quella del linguaggio Java di Sun Microsystems. JavaScript è stato standardizzato per la prima volta tra il 1997 e il 1999 dall’ECMA con il nome ECMAScript. L'ultimo standard, del dicembre 1999, è ECMA-262 Edition 3, e corrisponde a JavaScript 1.5. È anche uno standard ISO. Prima dell'avvento di JavaScript, affinché una pagina web rispondesse a una interazione con l'utente (un clic su di un bottone di un form ad esempio) era necessario comunicare con il server (il computer remoto al quale sarebbero stati inviati i dati per la loro elaborazione). Un classico esempio é quello del controllo dei dati inseriti dall'utente in un form. Se non si impiega JavaScript, ecco cosa accade: l'utente compila il form, probabilmente dimentica di inserire alcuni dati ritenuti obbligatori oppure li inserisce in modo errato (ad esempio, una data, un indirizzo email, il codice fiscale ecc…). Nel momento in cui l'utente inoltra il form cliccando sull'apposito pulsante d’invio, i dati vengono spediti al server e qui sottoposti a un processo di controllo, se questo controllo non va a buon fine, l'utente si vede recapitare una pagina web contenente il form appena compilato, insieme ad una serie di messaggi di errore, relativi a quelle informazioni non fornite o fornite in modo errato. Tutto ciò comporta dei tempi di attesa legati alla comunicazione tra il client, la macchina dell'utente, e il server. Questi tempi possono essere ridotti se anche la pagina web potesse eseguire quei controlli di correttezza sui dati. Questo è un classico esempio d’impiego di JavaScript per migliorare il grado d’interazione dell'utente con una pagina web. JavaScript è un linguaggio di programmazione orientato a oggetti con una sintassi vagamente basata sul C. Come il C, JavaScript ha il concetto di parole chiave riservate, che rendono quasi impossibile espandere il linguaggio (essendo eseguito direttamente dal sorgente). Come nel C, il linguaggio non ha propri costrutti d’input o output; mentre il C si affida alle librerie I/O standard, un interprete JavaScript si basa su un programma ospite in cui è integrato. Ci sono molti programmi ospiti di questo tipo, di cui quelli relativi al Web sono gli esempi più noti. Questi verranno illustrati per primi. JavaScript, se integrato in un browser Web, si collega alle applicazioni tramite interfacce chiamate DOM (Document Object Model), a lato server (web server) e al lato client (browser). Molti siti web usano la tecnologia JavaScript lato client per creare potenti applicazioni web dinamiche. Un uso principale del Javascript basato su web è la scrittura di piccole funzioni integrate nelle pagine HTML, che interagiscono con il DOM del browser per compiere determinate azioni non possibili con il solo HTML statico, come aprire una nuova finestra, controllare i valori nei campi d’ingresso, cambiare le immagini al passaggio del mouse, ecc. Sfortunatamente, i DOM dei vari browser non sono standardizzati, browser diversi espongono diversi oggetti o metodi allo script, ed è quindi spesso necessario scrivere differenti versioni di una funzione JavaScript per ciascuno dei browser. Al di fuori del Web, interpreti JavaScript sono integrati in diverse applicazioni. Adobe Acrobat e Adobe Reader supportano JavaScript nei file PDF. La piattaforma Mozilla, che è alla base di molti diffusi browser Web, usa JavaScript per implementare l'interfaccia utente e la logica di transazione dei suoi vari prodotti. Gli interpreti JavaScript sono integrati anche nelle applicazioni proprietarie prive di interfacce programmabili via script. Il principale tag del linguaggio Javascript è il tag “script”. Questo tag è un'estensione del HTML, in quanto permette la gestione di codice esterno che non è nativo HTML. Un documento può presentare in più parti la definizione del tag SCRIPT. Tramite questo tag si può rappresentare la versione utilizzata e, a seconda del browser, si avrà l'interpretazione appropriata. 1.12. P.H.P. PHP (acronimo ricorsivo di PHP Hypertext Preprocessor) è un linguaggio di scripting interpretato, con licenza open source e parzialmente libera (ma incompatibile con la GPL), originariamente concepito per la realizzazione di pagine web dinamiche. Attualmente è utilizzato principalmente per sviluppare applicazioni web lato server ma può essere usato anche per scrivere script a linea di comando o applicazioni stand-alone con interfaccia grafica. 1.12.1. Storia: Nato nel 1994 ad opera del danese Rasmus Lerdorf, PHP era in origine una raccolta di script CGI che permettevano una facile gestione delle pagine personali. Per questo motivo il significato originario dell'acronimo pare fosse Personal Home Page (sull'origine dell'acronimo ci sono tuttora alcuni dubbi, alimentati dallo stesso Lerdorf che ha contribuito volontariamente a generare attorno al nome questo alone di mistero). Il pacchetto originario venne in seguito esteso e riscritto dallo stesso Lerdorf in C, aggiungendo funzionalità quali il supporto al database mSQL e prese a chiamarsi PHP/FI, dove FI sta per Form Interpreter (interprete di form), prevedendo la possibilità di integrare il codice PHP nel codice HTML in modo da semplificare la realizzazione di pagine dinamiche. In quel periodo, 50.000 domini Internet annunciavano di aver installato PHP. A questo punto il linguaggio cominciò a godere di una certa popolarità tra i progetti open source del web, e venne così notato da due giovani programmatori: Zeev Suraski e Andi Gutmans. I due collaborarono nel 1998 con Lerdorf allo sviluppo della terza versione di PHP (il cui acronimo assunse il significato attuale) riscrivendone il motore che fu battezzato Zend da una contrazione dei loro nomi. Le caratteristiche chiave della versione PHP 3.0 frutto del loro lavoro, erano la straordinaria estensibilità, la connettività ai database e il supporto iniziale per il paradigma a oggetti. Verso la fine del 1998 PHP 3.0 era installato su circa il 10% dei server web presenti su Internet. PHP diventò a questo punto talmente maturo da competere con ASP, linguaggio lato server analogo a PHP sviluppato da Microsoft, e cominciò a essere usato su larga scala. La versione 4 di PHP venne rilasciata nel 2000 e prevedeva notevoli migliorie. Attualmente siamo alla quinta versione, sviluppata da un team di programmatori, che comprende ancora Lerdorf, oltre a Suraski e Gutmans. La popolarità del linguaggio PHP è in costante crescita grazie alla sua flessibilità: nel Giugno 2001, ha superato il milione di siti che lo utilizzano. Nell'ottobre 2002, più del 45% dei server Apache usavano PHP. Nel gennaio 2005 è stato insignito del titolo di "Programming Language of 2004" dal TIOBE Programming Community Index, classifica che valuta la popolarità dei linguaggi di programmazione sulla base d’informazioni raccolte dai motori di ricerca. Nel 2005 la configurazione LAMP (Linux, Apache, MySQL, PHP) supera il 50% del totale dei server sulla rete mondiale. 1.12.2. Caratteristiche: PHP riprende per molti versi la sintassi del C, come peraltro fanno molti linguaggi moderni, e del Perl. È un linguaggio a tipizzazione debole e dalla versione 5 migliora il supporto al paradigma di programmazione ad oggetti. Certi costrutti derivati dal C, come gli operatori fra bit e la gestione di stringhe come array, permettono in alcuni casi di agire a basso livello; tuttavia è fondamentalmente un linguaggio di alto livello, caratteristica questa rafforzata dall'esistenza delle sue moltissime API, oltre 3000 funzioni del nucleo base. PHP è in grado di interfacciarsi a innumerevoli database tra cui MySQL, PostgreSQL, Oracle, Firebird, IBM DB2, Microsoft SQL Server, solo per citarne alcuni, e supporta numerose tecnologie, come XML, SOAP, IMAP, FTP, CORBA. Si integra anche con altri linguaggi/piattaforme quali Java e .NET e si può dire che esista un wrapper per ogni libreria esistente, come CURL, GD, Gettext, GMP, Ming, OpenSSL e altro. Fornisce un'API specifica per interagire con Apache, nonostante funzioni naturalmente con numerosi server web. È anche ottimamente integrato con il database MySQL, per il quale possiede più di un’API. Per questo motivo esiste un'enorme quantità di script e librerie in PHP, disponibili liberamente su Internet. La versione 5, comunque, integra al suo interno un piccolo database embedded, SQLite. Dispone di un archivio chiamato PEAR che mette a disposizione un framework di librerie riusabili per lo sviluppo di applicazioni PHP e di PECL che raccoglie tutte le estensioni conosciute scritte in C. 4. Realizzazione dell’applicazione Nella realizzazione si mette in pratica tutto quello che è stato concepito in fase di progettazione utilizzando le tecnologie prescelte, creando le implementazioni necessarie alla realizzazione degli schemi, delle interfacce e delle funzionalità viste nei capitoli precedenti. Un importante punto da tenere presente è che l’applicazione viene integrata nella rete del comune, che possiede già sistemi propri di autenticazione dell’utente. Si può quindi tranquillamente assumere di disporre di tutte le informazioni necessarie (come identità e gruppi di appartenenza) sugli utenti che interagiscono col sistema. 1.13. Tabelle del Database In precedenza abbiamo visto la struttura generale del database, ora invece mostriamo quali sono le tabelle nello specifico e come sono organizzate. In figura 6 si può vedere lo schema della base di dati, in cui sono evidenziate le tre macroaree presentate nel progetto. Le tabelle esterne ai riquadri sono da considerarsi di servizio mentre quelle in arancio sono esterne al database, poichè appartengono al DB di “Missioni Dipendenti”. Vengono riutilizzate perché i dati che contengono sono necessari anche a quest’applicazione e sarebbe stato ridondante replicarli. FIGURA 6: LO SCHEMA DEL DATABASE Le tabelle stato e transizione sono quelle che governano il motore a workflow. La prima contiene tutti i possibili stati dell’applicazione e specifica per ognuno di essi la relativa vista e modello dati (questo punto verrà approfondito in seguito). Transizione invece contiene tutte le transizioni tra i vari stati, indicando per ognuna di esse lo stato iniziale e quello finale. Ulteriori informazioni necessarie come le condizioni e le post-operazioni sono invece memorizzate su file esterni, poiché avrebbero appesantito eccessivamente il DB. Andando ad analizzare la parte relativa alla gestione dei permessi, troviamo la tabella Gruppo che contiene l’elenco dei gruppi logici interni dell’applicazione (quelli elencati nella sezione 2.3.2). Le tabelle Associa Gruppo e Permessi Utenti servono ad associare rispettivamente interi gruppi utenti di dominio e utenti specifici ai gruppi interni dell’applicazione. Infine Permessi Gruppi lega ognuno dei gruppi interni ai rispettivi permessi sulle transizioni. Come si può notare ogni permesso è legato a un gruppo interno. Se un utente possiede permessi specifici, li ha comunque ottenuti attraverso l’associazione a un gruppo interno. L’insieme di tabelle relative alle missioni è invece particolarmente semplice. Missione contiene tutte le informazioni generali relative alle missioni non ancora archiviate (richiedente, responsabile, luogo, date d’inizio e fine, scopo, eventuale anticipo, totale ore effettuate, mezzo usato e vari timestamp per tracciare l’evoluzione e le modifiche.) Tappe contiene invece le varie tappe compiute durante una missione ed è legata a quest’ultima tramite un’associazione 1:N. Per ognuna di esse viene indicata la città di partenza e di destinazione, il numero di km percorsi e il giorno in cui è stata effettuata, oltre ad un indice che specifica l’ordine in cui le tappe di una stessa giornata sono state percorse. Missioni archiviate e tappa archiviate contengono praticamente le stesse informazioni delle due tabelle precedenti. Il loro scopo è semplicemente separare le missioni già archiviate da quelle ancora aperte, per alleggerire l’esecuzione delle query. Le missioni archiviate, infatti, vengono consultate molto più raramente, quindi sarebbe controproducente appesantire la ricerca nella tabella missioni con dati non significativi. Utenti serve a specificare il tipo di rimborso spese che deve essere associato a un utente del dominio. Mezzi personali associa agli utenti i mezzi di loro proprietà, ai fini del calcolo del rimborso spese chilometrico. Tipi spese e Status missioni sono degli elenchi utilizzati per convertire alcuni nomi interni all’applicazione con nomi leggibili dall’utente. La prima contiene le diverse voci presenti nelle note spese mentre la seconda riporta i vari stati in cui si può trovare una missione. Voci menu e gruppi menu servono a specificare quali transizioni devono comparire nel menù laterale e in quale sezione di esso devono apparire. Deleghe serve ad associare agli utenti le persone in vece di cui possono agire. Le tre tabelle rimanenti, Prezzi carburante, Città e Mezzi comune, contengono rispettivamente l’elenco storico dei prezzi della benzina con relativa data, l’elenco delle città che viene utilizzato nel calcolo dei km delle tappe e infine l’elenco dei mezzi comunali. 1.14. Struttura degli script Al fine di creare un’applicazione web corretta e su cui si possa fare facilmente manutenzione, si rivela di fondamentale importanza creare una libreria di file che si occupi di gestire i vari servizi dell’applicazione. I file principali dell’applicazione sono i seguenti: - config.php. Contiene la configurazione dei vari settaggi dell’applicazione; - database.php. Qui si trova la classe utilizzata per dialogare col database. Contiene varie funzioni il cui scopo va dall’inserimento o modifica di record all’estrazione di dati, sia di singoli campi che d’interi result set; - funzioni.php. Raggruppa tutte le funzioni di utilità (dalla conversione date alla creazione del menù); - sendMailBif.php. Gestisce le funzioni per l’invio di e-mail; - oggetto.php. Contiene una classe che rappresenta l’oggetto generico del workflow; - layout_principale.php. Questo file è alla base della creazione di una pagina. Sono inoltre presenti file che rappresentano ogni singola transizione, modello dati o vista, suddivisi per tipo nelle rispettive cartelle. 1.15. Implementazione del motore a workflow Com’è stato precedentemente esposto, il motore a workflow si basa su stati e transizioni. Ogni stato viene realizzato tramite un’istanza della classe oggetto ed è caratterizzato da un modello dati e da una vista. Le transizioni invece sono caratterizzate da uno stato iniziale e uno finale, oltre che da eventuali condizioni e post-operazioni. Le caratteristiche di questi oggetti, le singole transizioni e i singoli stati, sono specificate all’interno dei rispettivi file, ad eccezione degli stati legati alla transizione, che sono salvati sul DB, come specificato nella sezione 4.1. Il modello dati contiene tutte le informazioni sugli oggetti trattati nella pagina. Se, ad esempio, siamo in una pagina che visualizza il saldo di una missione, il modello dati conterrà tutti i dati riguardanti le spese. La vista invece contiene il codice P.H.P. caratteristico della pagina. Com’è stato specificato precedentemente, più stati possono avere lo stesso modello dati (o vista): un esempio è dato dalla pagina in cui si compila una richiesta di missione e quella immediatamente successiva, dove vengono riepilogate le informazioni appena inserite. Viste differenti ma stesso modello. Gli stati sono quindi associati a pagine, con la vista che decide l’aspetto e il modello che regola i dati che vengono trattati. Risulterà quindi abbastanza immediato il fatto che le transizioni, ovvero i passaggi tra pagine (stati), vengano realizzate tramite i link. Il funzionamento del motore a workflow nell’implementazione realizzata è quindi il seguente: Un utente si trova in una pagina (stato) e ha a disposizione numerosi link (transizioni) tra cui poter scegliere. Quando clicca su uno di essi, la pagina trasmette al server il nome della transizione che deve essere effettuata. Per prima cosa viene effettuato un controllo dei permessi. In caso di esito positivo, se tutte le condizioni della transizione sono verificate, si passa allo stato successivo, determinato dalla transizione, dopo aver eseguito eventuali post-operazioni. In caso le condizioni non siano verificate invece, si rimane nello stato attuale. Una volta deciso quale sarà lo stato di destinazione, il motore crea un nuovo oggetto, determinato dal modello dati, che viene quindi passato alla vista per generare il codice della pagina. In figura 7 è possibile vedere uno schema riassuntivo di questo procedimento. FIGURA 7: IL PASSAGGIO TRA UNO STATO E L’ALTRO. 1.16. Le transizioni e la compatibilità con i browser Un particolare interessante dell’implementazione è il metodo con cui viene comunicato al server quale transizione deve essere eseguita. Il problema, benché possa inizialmente sembrare banale, diventa evidente quando si cerca di implementare questa comunicazione. Com’è stato detto, quando si seleziona un link o un pulsante, si specifica quale transizione s’intende eseguire. Questo avviene spedendo al server il nome della transizione da eseguire, tramite un parametro della request. Nel caso di un link il problema è d’immediata risoluzione, basta specificare il nome nell’indirizzo del link, come parametro GET (es. index.php? transizione=trans_init). Il problema inizia a complicarsi nel caso di pulsanti, poiché non esistono tag html che permettano di trasmettere nella request qualcosa di diverso dalla scritta che appare sul bottone (la caption). Volendo essere precisi, il tag button permetterebbe di fare ciò (la caption infatti è ciò che viene racchiuso dal tag, mentre il valore trasmesso è contenuto nell’attributo value), ma Internet Explorer ignora questa differenza [tag button in IE] e trasmette comunque la caption. Per motivi di compatibilità non si può quindi usare il tag button normalmente. Non volendo visualizzare sul bottone il nome della transizione (che è nel formato trans_nome, es. trans_archivia) la soluzione è usare il tag input e sostituire il nome del bottone con il valore che vogliamo passare. Se ad esempio vogliamo trasmettere il parametro di nome “transizione” con valore “trans_nuova_richiesta”, ciò che scriveremo sarà nome “trans_nuova_richiesta” con un valore qualsiasi. In questo modo verrà trasmesso da entrambi i browser un campo nel formato nome_transizione=X (dove X è il valore qualsiasi nel caso di Firefox e la caption nel caso di IE). Essendo tutti i nomi di transizione nel formato trans_nome, se non si riceve dal client alcun campo chiamato “transizione”, se ne cerca uno che inizi per “trans_”: quello è il valore desiderato. Il problema però si complica ulteriormente nel caso ci si trovi ad avere più tag di tipo button nella stessa form (ad esempio le pagine con le liste). Qui emerge un secondo problema di IE: se sono presenti più bottoni in una form, non viene trasmesso solamente il valore di quello che è stato cliccato, ma di tutti. Diventa perciò impossibile per il server riconoscere qual è stato premuto, se non ricorrendo ad artifici con il javascript. La soluzione consiste nell’impostare l’ID di ogni bottone con un formato standard, del tipo “button_XXX” dove XXX è il valore che vogliamo trasmettere. A questo punto, quando l’utente clicca sul bottone, si esegue una funzione javascript che estrae XXX dall’ID e lo scrive in un campo hidden della form prima di eseguire la submit. 1.17. Missione: dalla richiesta all’approvazione Vediamo ora nel dettaglio le varie fasi che caratterizzano una missione. Premessa: nelle immagini seguenti l’header delle pagine è stato tralasciato in quanto non significativo. 1.17.1. Richiesta In figura 8 possiamo vedere la schermata per la richiesta di una nuova missione. I campi che compaiono in questa pagina, come pure in tutte le altre, dipendono dal modello dati sottostante. Gli unici campi degni di nota sono i primi due: - Utente richiedente è quello che l’applicazione vede come utente corrente e si ottiene dal sistema d’impersonificazione, che lo riceve a sua volta dalla sessione del browser; - Responsabile è un menù a tendina che permette di scegliere il responsabile a cui chiedere l’approvazione. La lista viene riempita con il contenuto della tabella Responsabili del database, ordinato secondo il campo indice. Quando si seleziona avanti, tutti i campi vengono controllati alla ricerca di errori tramite javascript (in ogni caso vengono comunque effettuati controlli anche lato server). Se è tutto corretto, si arriva a una pagina di riepilogo in cui si può confermare la richiesta, o tornare indietro nel caso si vogliano apportare modifiche. In caso di conferma, la richiesta passa al responsabile per l’approvazione. Viene quindi spedita a quest’ultimo un’e-mail di notifica. Nota: nonostante non venga più specificato in seguito, le e-mail di notifica vengono generate anche per tutti degli stadi successivi. FIGURA 8: NUOVA RICHIESTA 1.17.2. Approvazione Il responsabile, quando si collega, può vedere nel menù a sinistra eventuali nuove richieste da approvare. Selezionando la voce apposita si apre la lista delle richieste in attesa di approvazione, riportata in figura 9. La lista è realizzata tramite un modello dati di tipo array che contiene oggetti di tipo voce_lista, che vengono inseriti al momento della creazione del vettore e riportano le informazioni principali. Una volta selezionata una richiesta da approvare si apre una pagina in cui vengono riepilogate le informazioni sulla missione e viene data la possibilità di approvarla o rifiutarla. Nel secondo caso è prevista un’ulteriore pagina per specificare il motivo del rifiuto. Se la missione prevede un anticipo, a questo punto la richiesta arriva all’economato che si occuperà di elargire l’anticipo. FIGURA 9: LISTA DELLE RICHIESTE IN ATTESA DI APPROVAZIONE 1.17.3. Compilazione dettagli Una volta che la missione è stata svolta, si può passare alla pagina di compilazione dettagli, visibile in figura 10. La prima parte riguarda l’inserimento delle tappe percorse. Quando si seleziona il pulsante “Aggiungi tappa” i valori inseriti nei due campi di testo vengono copiati nella lista sovrastante, tramite una modifica dinamica del codice HTML della pagina, realizzata tramite javascript. Sempre grazie ad esso, inoltre, è possibile eliminare un elemento dall’elenco o riordinare le tappe semplicemente trascinandole col mouse. La parte centrale invece consiste nell’inserimento dei totali delle spese, divisi per categorie (specificate nella tabella “Tipi spese”). Il campo “Mezzo utilizzato” serve per specificare il veicolo impiegato durante la missione. La lista mostra l’elenco di tutti i mezzi comunali ed eventualmente pure dei mezzi personali (questo nel caso sia stato selezionato il campo “mezzo proprio” al momento della richiesta). I due campi rimanenti, infine, sono abbastanza immediati. Il primo serve a indicare la durata in ore della missione mentre il secondo permette di specificare la modalità di rimborso. Nell’esempio è presente una sola voce poiché se si è richiesto un anticipo il rimborso deve essere eseguito dall’economato. FIGURA 10: COMPILAZIONE DETTAGLI 1.17.4. Verifica spese e saldo Questa pagina, riportata in figura 11, presenta un riepilogo dei dati della missione e fornisce ai responsabili del saldo la possibilità di modificare le voci spesa, nel caso non siano corrette. In caso di modifiche, vengono salvati anche i valori originali. Una volta selezionato avanti, si passa a una pagina di conferma, visibile in figura 12, in cui viene visualizzato l’ammontare da erogare o ricevere. A questo punto si può quindi stampare un cedolino cui attaccare eventuali scontrini, tornare alla pagina precedente o confermare le note spese. FIGURA 11: IL SALDO FIGURA 12: CONFERMA DEL SALDO 1.17.5. Chiusura In questa schermata, visibile in figura 13, vengono riepilogate tutte le informazioni sulla missione. In caso sia necessario effettuare modifiche alle note spese o alle tappe, selezionando l’apposito pulsante si arriva in una pagina identica a quella vista nella compilazione dei dettagli. Selezionando conferma, invece, la missione viene chiusa. FIGURA 13: IL RIEPILOGO TOTALE DI UNA MISSIONE PRIMA DELLA CHIUSURA. 1.17.6. Archiviazione L’ultimo stadio di una missione è l’archiviazione. Prima di essa vengono visualizzati un’ultima volta i dati della missione stessa, con una pagina identica alla precedente. L’unica differenza è che in caso sia stato utilizzato un mezzo personale, e sia quindi necessario un rimborso delle spese del carburante, appare un riepilogo delle caratteristiche del mezzo e in fondo un campo in cui inserire il prezzo al km della benzina. Il campo è precompilato se l’utente che ha svolto la missione è un consigliere, poiché essi hanno un rimborso fisso al km, mentre va inserito a mano dalla segreteria, utilizzando le tabelle ACI e i dati del mezzo, nel caso l’utente sia un assessore. Un esempio di quest’ultimo caso è visibile in figura 14. FIGURA 14: ARCHIVIAZIONE CON INSERIMENTO DEL COSTO DELLA BENZINA Una volta selezionato il pulsante “Archivia”, l’applicazione procede a spostare il record relativo alla missione sulla tabella missioni archiviate e a cancellarlo da quella originale. Un’operazione analoga viene eseguita per le tappe, salvando inoltre per ognuna di esse il relativo prezzo della benzina come campo aggiuntivo del record. 1.18. Report In figura 15 è riportato un esempio di report finale delle missioni eseguite, in questo caso riferito a una singola persona. I dati visualizzati sono tutti salvati direttamente nel database, all’interno delle tabelle “missioni archiviate” e “tappe archiviate”, ad eccezione delle ultime tre colonne che vengono calcolate al momento della creazione della pagina. FIGURA 15: UN ESEMPIO DI REPORT 1.19. Amministrazione La sezione di amministrazione prevede quattro differenti funzioni: - eliminazione di una missione; - associazione di un gruppo di dominio a un gruppo interno (modifica della tabella “Associa Gruppo”); - associazione di un gruppo interno a un utente (modifica della tabella “Permessi utenti”); - gestione delle deleghe (modifica della tabella “deleghe”). In figura 16 è possibile vedere un esempio della schermata di assegnazione di un gruppo interno a un utente. FIGURA 16: UNA SCHERMATA DI AMMINISTRAZIONE 1.20. Test di servizio Analisi e test sul funzionamento dell’applicazione sono stati svolti regolarmente durante l’intero stage, permettendo di risolvere i problemi man mano che sorgevano invece di portarli sino alla fine. Sono stati inoltre svolti numerosi test per garantire la compatibilità sui vari browser, che talvolta presentano comportamenti diversi, sia nei riguardi della rappresentazione grafica che della gestione di alcuni campi delle form. Al termine del tirocinio è stato comunque svolto un test globale e l’applicazione ha dimostrato di funzionare come previsto. 5. Conclusioni Questa tesi è il frutto di un progetto svolto nell’ambito di un tirocinio effettuato presso il Comune di Cento, in cui è stata creata l’applicazione Web “Missioni Amministratori”. Lo scopo, che era di permettere ai vari soggetti coinvolti nel rimborso spese di assessori e consiglieri di compilare la modulistica necessaria attraverso un’interfaccia web, anziché tramite moduli cartacei, si può considerare raggiunto. Uno dei principali ostacoli è stata l’introduzione del motore a workflow, specialmente per l’iniziale difficoltà a capire cosa andasse rappresentato come stato. Una volta reso operativo però, si è dimostrato di grande aiuto nel rendere l’applicazione molto flessibile, sia in termini di flusso delle azioni che di facilità di modifica, grazie a una struttura componibile a più livelli. La scelta si è in seguito dimostrata vincente, quando i requisiti e le specifiche del progetto hanno subito modifiche a uno stadio già avanzato di realizzazione, cosa che ha sottolineato l’enorme importanza della progettazione di una struttura elastica e facilmente adattabile. In mancanza di essa le ripercussioni sullo sviluppo dell’applicazione sarebbero state gravi e avrebbero comportato un notevole lavoro di correzione e adattamento. Un’ulteriore difficoltà era stata inizialmente data dalla decisione di utilizzare il javascript solamente per il controllo dei campi, poiché operazioni come inserimento e cancellazione delle tappe avrebbero causato un aumento del numero di stati da gestire e una complicazione degli stessi. Questa limitazione è stata però rimossa in seguito, quando si è costatato che senza javascript l’errato comportamento di Internet Explorer con il tag button avrebbe reso, se non impossibile, perlomeno molto arduo proseguire nel progetto seguendo il percorso tracciato sino a quel punto. In futuro, se si riterrà opportuno modificare la sequenza delle operazioni, sia alterando l’ordine che aggiungendo o eliminando alcuni stadi, grazie al motore a workflow basterà agire sulla catena degli stati. La struttura di base dell’applicazione è inoltre altamente riusabile e permetterebbe, se si volesse, di ricreare l’applicazione “Missioni Dipendenti” con la nuova, e più stabile, struttura sottostante. Questo progetto ha permesso di approfondire alcuni argomenti incontrati in ambito universitario, come la programmazione in P.H.P., descritta in parte, e il javascript, già utilizzato nel corso di Ingegneria dei Sistemi Web, ma qui utilizzato più a fondo. In ogni caso, l’istruzione e la conoscenza trasmesse dall’Università hanno permesso di apprendere e approfondire rapidamente tutto ciò che non era stato visto in precedenza. Il tirocinio mi ha fornito un’esperienza molto interessante, che mi ha permesso di mettere alla prova le mie capacità con un progetto reale, sicuramente più vicino al mondo del lavoro rispetto alle esperienze fatte a lezione, oltre ad avermi dato modo di ampliare le mie conoscenze. Mi ha inoltre consentito di comprendere meglio l’importanza di un buon lavoro di progettazione prima di iniziare a scrivere il codice. Infine, ho avuto modo di lavorare insieme a persone competenti che mi hanno offerto pieno supporto e disponibilità, oltre ad un ambiente di lavoro sereno. Ringrazio in particolare Michele Tedeschi per i consigli e le indicazioni che mi ha fornito durante le varie fasi del progetto. 6. Riferimenti [Workflow] http://www.wfmc.org/ [Server Web Apache] http://www.apache.org/ [DBMS MySQL] http://www.mysql.com/ [Linguaggio SQL] http://www.wiscorp.com/ SQLStandards.html [Linguaggio HTML] http://www.w3.org/html/ [W3C] http://www.w3.org/ [CSS] http://www.w3.org/Style/CSS/ [tag button in IE] http://www.sitehatchery.com/blog/ index.php/html-button-tag-and-iecompatibility 7. Indice delle figure Figura 1: l’evoluzione di una missione, dalla richiesta all’archiviazione.....7 Figura 2: la gestione dei permessi...............................................................11 Figura 3: la struttura del database................................................................12 Figura 4: l’interfaccia dell’applicazione......................................................13 Figura 5: un confronto tra le due applicazioni: in alto “Missioni Dipendenti” e in basso “Missioni Amministratori”....................................14 Figura 6: lo schema del database.................................................................22 Figura 7: il passaggio tra uno stato e l’altro................................................26 Figura 8: nuova richiesta.............................................................................29 Figura 9: lista delle richieste in attesa di approvazione...............................29 Figura 10: Compilazione dettagli................................................................30 31 Figura 11: il saldo........................................................................................31 31 Figura 12: conferma del saldo.....................................................................31 Figura 13: il riepilogo totale di una missione prima della chiusura............32 Figura 14: archiviazione con inserimento del costo della benzina..............33 Figura 15: un esempio di report..................................................................34 Figura 16: una schermata di amministrazione.............................................35