• Non ci sono risultati.

Il workflow relativo all’inserimento delle Delibere rappresenta la prima parte della macroarea Documentale: in essa gli utenti potranno caricare nuove Delibere, modificare quelle già esistenti allegandoci dei file o associandole a delle Convenzioni, e potranno visualizzare la reportistica sia in termini generici che puntuali sui singoli documenti. Tutte queste opzioni saranno racchiuse all’interno del menù folder Documentale secondo il seguente schema:

46

Figura 4.5, sottomenù della macroarea Documentale

I rami relativi al flusso di Determine e Convenzione, come detto in precedenza, non sono stati sviluppati per questo lavoro di tesi.

Vediamo adesso le diverse funzionalità nel dettaglio.

4.2.1 Inserimento

47

Figura 4.6, oggetti astratti della sezione Inserimento

Non appena l’utente clicca sul tasto Inserimento verrà caricato l’input form T_DELIBERA, utile a caricare

una nuova Delibera.

In questa fase l’input form assegnerà automaticamente i seguenti attributi al documento caricato: • Lo stato iniziale, che sarà Bozza;

• Il codice univoco dell’utente che ha effettuato l’operazione; • Il gruppo di lavoro a cui appartiene l’utente caricante;

• La data in cui è avvenuto il caricamento, ovvero la data Proposta; • La tipologia sarà impostata uguale a “DELIBERA”;

• Il campo relativo all’utente che ha apportato una modifica al documento verrà settato con il codice - 99, il quale indica che il documento non ha subito modifiche;

• Il codice del CIG associato al documento verrà settato automaticamente con il codice -99, il quale indica che nessun CIG è associato al documento;

• I campi relativi all’upload del documento verranno compilati automaticamente grazie alla customizzazione impiegata;

• Il codice Proposta, il quale sarà un codice progressivo.

Effettuato il salvataggio, l’utente verrà rimandato automaticamente alla pagina riepilogativa del documento appena caricato; all’interno di essa l’utente potrà:

• Visionare i dati inseriti e scaricare il documento appena caricato;

• Visionare gli allegati presenti per il documento, i quali saranno inizialmente non presenti; • Visionare le Convenzioni associate al documento, anch’esse inizialmente non presenti;

48

• Navigare tramite l’oggetto button nelle diverse funzionalità disponibili, ovvero: o Caricare allegati;

o Caricare e associare una Convenzione;

o Associare una Convenzione già presente nel sistema. Ecco come appare il report di riepilogo dei dati inseriti:

Figura 4.7, report riepilogativo di una Delibera inserita

La visualizzazione dei dati del documento avviene attraverso la seguente QUERY: SELECT AA_T_DOCUMENTO_NOME, AA_T_DOCUMENTO_DESC, AA_T_DOCUMENTO_DATA, AA_T_DOCUMENTO_CODICE_DEF, TO_CHAR(AA_T_DOCUMENTO_PROVV_DATA,'DD-MM-YYYY') AS AA_T_DOCUMENTO_PROVV_DATA, ut.T_UTENTE_COGNOME, AA_T_DOCUMENTO_TIPO, AA_T_DOCUMENTO_CODICE_PROP, AA_T_DOCUMENTO_ALBO_SN_NOTE, AA_T_DOCUMENTO_VIS_CODICE, '<a href="../config/dowloadFile.bmf?name='||AA_T_DOCUMENTO_UPFILE_NOME||'&n ameOriginal='||AA_T_DOCUMENTO_UPFILE_NOME||''||AA_T_DOCUMENTO_UPFILE_EX T||'&subdir=DEL&contentDisposition=attachment">'

||AA_T_DOCUMENTO_UPFILE|| '</a>' AS AA_T_DOCUMENTO_UPFILE, st.AA_T_STATO_DESCRIZIONE,

grp.AA_T_GRUPPO_DESCR

FROM AA_T_DOCUMENTO doc, AA_T_STATO st, T_UTENTE ut, AA_T_GRUPPO grp WHERE AA_T_DOCUMENTO_CODICE=<cod>

AND doc.AA_T_STATO_CODICE = st.AA_T_STATO_CODICE AND doc.AA_T_DOCUMENTO_PERSONA =ut.T_UTENTE_CODICE AND ut.AA_T_GRUPPO_CODICE = grp.AA_T_GRUPPO_CODICE

49

Notiamo, all’interno di essa, la presenza dell’istruzione per poter effettuare il download e le condizioni utili a visualizzare il cognome ed il gruppo di lavoro dell’utente che ha caricato il documento, oltre che la descrizione dello stato in cui si trova, il quale sarà, grazie all’input form, automaticamente in stato Bozza.

Vediamo adesso nel dettaglio le tre funzionalità accessibili da questa pagina, ovvero quella per caricare Allegati, quella per caricare ed associare un Contratto od una Convenzione e quella per associare un Contratto od una Convenzione già presenti nel sistema.

Nella pagina relativa agli allegati saranno presenti un report che mostrerà gli allegati già caricati per il documento e un input form utile a caricarne altri. A seguito del salvataggio l’utente verrà rimandato nella stessa pagina dove l’input form sarà denominato con _BIS: questo permette l’inserimento di ulteriori allegati e, a seguito di un ulteriore salvataggio, verrà ricaricata la pagina con l’input form senza la denominazione _BIS.

Ecco come appare questa schermata:

Figura 4.8, pagina di caricamento Allegati

Notiamo che in questa pagina sono presenti, in alto, i bottoni di navigazione tra le diverse funzionalità del sistema.

Nella pagina relativa al caricamento ed associazione di una Convenzione l’utente vedrà un report con quelle già associate ed un input form che permetterà di caricarne di nuove, associandole direttamente al documento appena inserito. A seguito del salvataggio l’utente sarà riportato alla pagina di riepilogo della Delibera inserita. Infine, sarà presente l’opzione di associare una Convenzione già presente nel sistema nel DB al documento appena caricato: la logica di funzionamento sarà esplicitata più avanti, in quanto sarà identica a quella relativa al tasto Associa contratto o convenzione presente nel sottomenù di Delibera.

50

Nelle pagine dell’applicativo sopra elencate è stata sempre prevista una customizzazione dei report utile a mostrare il nome della Delibera su cui l’utente sta lavorando, in modo da rendere sempre chiare le operazioni svolte, così come visibile dalle immagini presentate.

4.2.2 Ricerca e modifica

In caso di necessità di modificare o di aggiornare un documento un utente potrà accedere a questa sezione, la quale conterrà i seguenti oggetti:

Figura 4.9, oggetti astratti della sezione Ricerca e modifica

La prima cosa mostrata all’utente sarà quindi un filtro che permetterà di effettuare una ricerca personalizzata dei documenti presenti nel DB; nel report dei risultati vi sarà, per ognuno di essi, un link ipertestuale che permette di caricarne i dati nell’input form presente nella stessa pagina. L’input form sarà inizialmente invisibile: verrà mostrato solo a seguito del click, da parte dell’utente, sul link ipertestuale di un documento, ed il report verrà nascosto. L’input form, una volta visibile, mostrerà nella sua intestazione il nome del documento selezionato, e permetterà di:

• Caricare una nuova versione del documento;

• Attraverso una finestra di selezione, di modificare lo stato del documento nei soli stati in cui potrà evolvere.

51

• Evocare una pagina riepilogativa a seguito dell’avvenuto salvataggio. Vediamo come appare l’input form una volta che viene mostrato all’utente:

Figura 4.10, esempio di input form di aggiornamento Delibera

Questo input form sarà quindi customizzato per poter svolgere tutte queste funzionalità. Vediamo come sono state riscritte le sue funzioni.

La funzione “onShow”, richiamata appena viene invocato la pagina che contiene l’oggetto astratto, prevede di nasconderlo all’utente: verranno quindi nascosti tutti i suoi campi, il suo titolo, i suoi tasti di salvataggio, reset e delete, e la parte relativa all’upload del file.

onShow: function() { this.loadDati(); $('#AA_T_DOCUMENTO_DESC,label[for ="AA_T_DOCUMENTO_DESC"]').hide(); $('#AA_T_STATO_CODICE,label[for ="AA_T_STATO_CODICE"]').hide(); $('#file_doc').hide(); $('#btn_reset').hide(); $('#btn_save').hide(); $('#btn_delete').hide(); $('#form-loadFile').hide(); …}

L’”afterSave”, richiamato a fine salvataggio, prevede un “dispatcher” che rimanderà al riepilogo dei dati salvando in sessione il codice del documento modificato.

afterSave: function (isSaveAs){ this.loadDati(); location.href = "#dispatcher/idObject=V_AGG_DELIBERA&idObject=BTN_AGG_DELIBERA&idObject =V_DEL_ALL_RIEP&idObject=V_DEL_CONV_RIEP&numRecPage=10&page=1&session1= S&name1=cod&value1="+$('#AA_T_DOCUMENTO_CODICE').val()+"&session2=S&nam e2=codagg&value2="+$('#AA_T_DOCUMENTO_CODICE').val(); }

52

L’”afterLoadRecord”, ovvero la funzione caricata a seguito del click sul link che carica i dati nell’input form, compie diverse operazioni:

• Inizialmente mostra i campi dell’input form editabili dall’utente e salva il codice del documento caricato in una variabile che verrà utilizzata in seguito;

• Effettua una prima chiamata Ajax che richiama la Select S_ST_DOC: essa effettua una QUERY che trova la descrizione dello stato del documento selezionato;

• Effettua una seconda chiamata Ajax utile a trovare tutti gli stati in cui può evolvere il documento; per farlo utilizza la Select S_STATI_OUT che esegue la seguente QUERY:

SELECT

AA_T_STATO_CODICE as val,

AA_T_STATO_DESCRIZIONE as descr FROM AA_T_STATO

WHERE AA_T_STATO_CODICE IN( SELECT AA_T_STATO_CODICE_OUT FROM AA_REL_STATO_DOC WHERE AA_T_STATO_CODICE_IN IN ( SELECT S.AA_T_STATO_CODICE

FROM AA_T_STATO S, AA_T_DOCUMENTO D

WHERE S.AA_T_STATO_CODICE = D.AA_T_STATO_CODICE AND <condizioni>))

Questa QUERY ne utilizza altre due annidate: quella più interna trova lo stato del codice selezionato dalla tabella T_DOCUMENTO dall’utente, l’intermedia seleziona gli stati in cui questo può evolvere dalla relazione molti a molti tra l’entità Stato e sé stessa, mentre la più esterna ne trova le descrizioni da mostrare all’utente ed i codici all’interno dell’entità T_STATO. Dopo aver trovato una lista di stati, essi verranno posti all’interno della finestra di selezione uno ad uno tramite un ciclo che scorrerà tutti i risultati della QUERY.

• Infine, verrà effettuata un’ultima chiamata Ajax che servirà a risalire al nome del documento selezionato utilizzando la Select S_DOC; quest’ultima chiamata imposterà il titolo dell’input form in maniera tale da mostrare sia il nome del documento sia il suo stato.

Ecco quindi il codice che svolge tutte queste funzionalità: afterLoadRecord: function (){

var cod = $("#AA_T_DOCUMENTO_CODICE").val();

$('#AA_T_DOCUMENTO_DESC,label[for ="AA_T_DOCUMENTO_DESC"]').show(); $('#AA_T_STATO_CODICE,label[for ="AA_T_STATO_CODICE"]').show(); $('#file_doc').show(); $('#btn_save').show(); $('#form-loadFile').show(); var item=0; var optionsValues = ''; var stato = ''; $.ajax({ type: "POST", data: {name1:'D.AA_T_DOCUMENTO_CODICE',value1:cod}, dataType: Global.dataType,

53 url: Global.serverDomain+Global.cxt+"/ws/config/result.bmf?idObject=S_ ST_DOC", success: function(response) { $.each(response, function(item) { optionsValues += '<option value="'+response[item]["VAL"]+'">'+response[item]["DESCR"]+'</op tion>'; });

var stringa = optionsValues;

var options = $('#AA_T_STATO_CODICE'); options.html(stringa); stato = response[0]["DESCR"]; } }); $.ajax({ type: "POST", data: {name1:'D.AA_T_DOCUMENTO_CODICE',value1:cod}, dataType: Global.dataType,

contentType: "application/x-www-form-urlencoded; charset=utf-8", url: Global.serverDomain+Global.cxt+"/ws/config/result.bmf?idObject=S_ STATI_OUT", success: function(response) { $.each(response, function(item) { optionsValues += '<option value="'+response[item]["VAL"]+'">'+response[item]["DESCR"]+'</op tion>'; });

var stringa = optionsValues;

var options = $('#AA_T_STATO_CODICE'); options.html(stringa); } }); $.ajax({ type: "POST", data: {name1:'AA_T_DOCUMENTO_CODICE',value1:cod}, dataType: Global.dataType,

contentType: "application/x-www-form-urlencoded; charset=utf-8", url:

Global.serverDomain+Global.cxt+"/ws/config/result.bmf?idObject=S_ DOC",

success: function(response) {

$('#inputform_id').children('h4').text('Hai selezionato il

documento '+response[0]["DESCR"]+', attualmente in stato '+stato+ '. Puoi aggiornarne lo stato, caricarne una nuova versione e lasciare un commento.');

} }); return true;}

Infine, l’input form compilerà automaticamente i dati relativi al codice dell’utente che ha apportato la modifica e la data di modifica; essi saranno sovrascritti ad ogni ulteriore modifica.

Una volta effettuato il salvataggio l’utente verrà riportato quindi nella pagina del riepilogo dei dati aggiornati, di cui si mostra un esempio:

54

Figura 4.11, report riepilogativo di Delibera aggiornata

Notiamo che questo report, rispetto al riepilogo a seguito di inserimento, mostra l’utente che ha effettuato la modifica e la data in cui questa è avvenuta.

Nella pagina di riepilogo saranno inoltre presenti il button che permette di navigare tra le diverse funzionalità e i report degli Allegati della Delibera e delle Convenzioni e dei Contratti associati.

La QUERY utilizzata per questo report è la seguente: SELECT

AA_T_DOCUMENTO_CODICE, AA_T_DOCUMENTO_NOME, AA_T_DOCUMENTO_DESC, AA_T_DOCUMENTO_DATA,

55 AA_T_DOCUMENTO_CODICE_DEF, TO_CHAR(AA_T_DOCUMENTO_PROVV_DATA,'DD-MM-YYYY') AS AA_T_DOCUMENTO_PROVV_DATA, ut.T_UTENTE_COGNOME, ut2.T_UTENTE_COGNOME AS MOD, AA_T_DOCUMENTO_DTMOD, AA_T_DOCUMENTO_TIPO, AA_T_DOCUMENTO_CODICE_PROP, cig.AA_T_CIG_CIG, AA_T_DOCUMENTO_ALBO_SN_NOTE, AA_T_DOCUMENTO_VIS_CODICE, '<a href="../config/dowloadFile.bmf?name='||AA_T_DOCUMENTO_UPFILE_NOME||'&n ameOriginal='||AA_T_DOCUMENTO_UPFILE_NOME||''||AA_T_DOCUMENTO_UPFILE_EX T||'&subdir=DEL&contentDisposition=attachment">'

||AA_T_DOCUMENTO_UPFILE|| '</a>' AS AA_T_DOCUMENTO_UPFILE, st.AA_T_STATO_DESCRIZIONE,

grp.AA_T_GRUPPO_DESCR

FROM AA_T_DOCUMENTO doc, AA_T_STATO st, T_UTENTE ut, T_UTENTE ut2, AA_T_GRUPPO grp, AA_T_CIG cig

WHERE AA_T_DOCUMENTO_CODICE=<codagg>

AND doc.AA_T_STATO_CODICE=st.AA_T_STATO_CODICE AND doc.AA_T_DOCUMENTO_PERSONA =ut.T_UTENTE_CODICE AND doc.AA_T_DOCUMENTO_UTMOD =ut2.T_UTENTE_CODICE AND ut.AA_T_GRUPPO_CODICE = grp.AA_T_GRUPPO_CODICE AND cig.AA_T_CIG_CODICE = DOC.AA_T_CIG_CODICE

Notiamo anche questa volta l’istruzione per il download del file, inoltre saranno presenti diverse condizioni, utili a mostrare non i codici numerici dei diversi elementi associati, ma le loro descrizioni: per l’utente non ha

infatti senso leggere un codice numerico.

Da qui si nota l’importanza dell’impostare alcuni campi come non nulli come vincolo progettuale: essendo delle FK dovranno essere compilate per poter effettuare il salvataggio dei dati. Per questo motivo tutte le FK verranno compilate con dei codici fittizi, spesso pari a -99, che rimandano a delle descrizioni del tipo “Nessun CIG associato” o “Documento non modificato”.

4.2.3 Allega file

56

Figura 4.12, oggetti astratti della sezione Allega file

La prima pagina su cui verrà reindirizzato l’utente servirà a selezionare un documento a cui poter allegare i file: infatti, tramite il filtro, potranno essere impostati dei criteri di ricerca, ed il risultato di essa sarà mostrato nel report collegato; se tramite la ricerca non viene trovato il documento voluto se ne potrà effettuare una

nuova cliccando sull’apposito tasto.

Nel report sarà presente, per ogni documento, un link ipertestuale: se l’utente ci clicca sopra verrà rimandato in una nuova pagina contenente un report con gli allegati, caricati in precedenza e scaricabili, della Delibera selezionata, ed un input form che permetterà di caricarne di nuovi. A seguito del salvataggio l’utente verrà rimandato in un’altra pagina contenente gli stessi oggetti più un button utile per effettuare una nuova ricerca, tuttavia l’input form è rinominato come _BIS: in questo modo sarà possibile inserire ulteriori allegati. Un ulteriore salvataggio rimanderà alla stessa pagina ma con l’input form base, e così via. Questa pagina sarà quindi, nell’aspetto, identica a quella vista nella figura 4.8 se non per i tasti di navigazione che sono sostituiti dal tasto che permette di effettuare una nuova ricerca.

4.2.4 Associa contratto o convenzione

57

Figura 4.13, oggetti astratti della sezione Associa Contratto o Convenzione

La prima pagina permetterà di effettuare una ricerca delle diverse Delibere e di visualizzare il risultato nel report associato; in questo report sarà presente, per ogni Delibera, un link che riporterà alla pagina di associazione.

La pagina di associazione, inizialmente, mostrerà due report: il primo conterrà le Convenzioni e i Contratti già associati alla Delibera selezionata, mentre il secondo conterrà tutte le Convenzioni e i Contratti che non sono

stati associati ad un documento.

In questo secondo report sarà presente un link che svolgerà la funzione di “loadRecord” per l’input form presente nella pagina scatenando due eventi:

• Il secondo report nella pagina, V_CNV_ASSOCIA, verrà nascosto;

• L’input form diverrà visibile in forma ridotta: presenterà infatti un’intestazione che specificherà i documenti che si stanno associando, chiedendo all’utente di confermare o di annullare l’operazione. In caso di annullamento si verrà rimandati su questa stessa pagina, quindi tornerà visibile il secondo report ed invisibile l’input form, mentre in caso di salvataggio si verrà rimandati alla pagina riepilogativa della Delibera a cui è appena stata associata una Convenzione o un Contratto.

Queste operazioni vengono svolte dalla customizzazione dell’input form, di cui si riportano i passaggi relativi alle funzioni elencate:

afterSave: function(){ alert("Associazione avvenuta!"); location.href = "#dispatcher/idObject=BTN_DELIBERA&idObject=V_DELIBERA&idObject=V _DEL_ALL_RIEP&idObject=V_DEL_CONV_RIEP&tit_clear=S&numRecPage=10& page=1"; return true; }, myResetForm: function(){ location.href = "#dispatcher/idObject=V_DEL_CONV&idObject=V_CNV_ASSOCIA&idObject= T_ASSOCIA_CNV_DOC&idObject=BTN_DELCTRCNV&tit_clear=S&numRecPage=1 0&page=1"; $('#collapsible_data').parent().parent().show();

58 $('#V_CNV_ASSOCIA_id').parent().parent().show(); return true; }, onShow: function() { $('#inputform_id').children('h4').hide() $('#btn_delete').hide(); $('#btn_reset').val('Annulla'); $('#btn_reset').hide(); $('#btn_save').hide(); }, afterLoadRecord: function() { var CNV; var DOC;

var codCNV; var cod; $.ajax({ type: "POST", data: {name1:'AA_T_CNV_CODICE',value1:codCNV}, dataType: Global.dataType, contentType: "application/x-www-form-urlencoded; charset=utf-8", url: Global.serverDomain+Global.cxt+"/ws/config/result.bmf?idObject=S_ CNV_TIT", success: function(responseT1) { CNV = responseT1[0]["DESCR"]; } }); $.ajax({ type: "POST", data: {name1:'AA_T_DOCUMENTO_CODICE',value1:cod}, dataType: Global.dataType,

contentType: "application/x-www-form-urlencoded; charset=utf-8", url: Global.serverDomain+Global.cxt+"/ws/config/result.bmf?idObject=S_ DOC_TIT_CNV", success: function(responseT2) { DOC = responseT2[0]["DESCR"]; $('#V_CNV_ASSOCIA_id').parent().parent().hide(); $('#inputform_id').children('h4').text('Stai associando il documento con controparte '+CNV+' al documento '+DOC+'. Puoi confermare cliccando su Salva oppure tornare indietro

cliccando su Annulla.');

$('#inputform_id').children('h4').show(); $('#btn_reset').show();

$('#btn_save').show(); } }); },

In questa customizzazione possiamo notare la riscrittura di diverse funzioni base del BMF:

• L’”afterSave”, ovvero l’evento che si attiva a seguito di un salvataggio, attiverà un avviso che confermerà il successo dell’operazione e rimanderà ad un’altra pagina grazie al “dispatcher”;

• Il “myResetForm”, ovvero l’evento che si attiva a seguito del click dell’utente sul tasto Annulla, rimanderà alla stessa pagina tramite un “dispatcher” e renderà nuovamente visibile il report;

59

• L’”onShow”, ovvero la funzione avviata appena viene caricata la pagina, nasconderà l’input form e modificherà il testo del tasto Cancella in Annulla;

• L’”afterLoadRecord”, invece, utilizzerà due chiamate Ajax: la prima andrà a richiamare la Select S_CNV_TIT, la quale troverà la controparte della Convenzione selezionata, e la seconda andrà a richiamare la Select S_DOC_TIT_CNV, la quale troverà il nome della Delibera precedentemente selezionata. A questo punto verrà nascosto il report e verrà mostrato l’input form impostandone

correttamente il titolo.

La selezione di una Convenzione porterà quindi alla seguente visualizzazione:

Figura 4.14, titolo personalizzato di report e input form per associazione Convenzioni

4.2.5 Reportistica

60

Figura 4.15, oggetti astratti della sezione Reportistica

L’utente potrà quindi effettuare una ricerca personalizzata e, nel report con i risultati ottenuti, potrà scaricare una Delibera oppure selezionarla ed andare alla pagina riepilogativa dei suoi dati, dove potrà scaricare gli allegati e le Convenzioni associate; inoltre, grazie al button BTN_AGG_DELIBERA, utilizzato anche nel ramo relativo all’aggiornamento, esso potrà navigare tra le funzionalità relative a, esattamente come prima, permette

Documenti correlati