Man Tecnico:Analisi funzionalita core

From CDG Wiki
Jump to navigation Jump to search

Il core dell’applicativo è visto come l’elemento base del software che consente di definire le caratteristiche principali della realtà descritta dall’applicativo, le quali possono essere estese mediante l’aggiunta di moduli.

Analisi dei requisiti

All’interno del processo di budget si individuano più attori, ciascuno con il proprio ruolo: le funzionalità messe a disposizione dell’applicativo varieranno in base al ruolo dell’utente all’interno dell’organizzazione aziendale durante gli anni, sarà necessario quindi che il core presenti un’interfaccia specifica per l’utente collegato in base alla dimensione aziendale considerata e all’anno di budget selezionato, nonché dell’eventuale CdR selezionato in caso di responsabilità. Per garantire questo funzionamento il core effettua operazioni preliminari durante il caricamento di ogni pagina, per la predisposizione di tutti gli strumenti che verranno forniti ai vari moduli.

Come prima operazione verranno caricate tutte le classi del core, successivamente verranno recuperati e "bonificati" i parametri selezionati ed in base all’utente loggato verranno visualizzati e preselezionati i parametri selezionabili dall’utente quali:

  • Dipendente
  • Anno
  • Piano CdR
  • CdR

Verrà successivamente effettuato un controllo su tutti i moduli (tutte le directory che contengono un file common e xml validi nella directory moduli) . Fra i moduli trovati verranno selezionati quelli attivi ed in base alle regole definite nei file common vengono verificati i privilegi dell’utente e le eventuali voci di menu da visualizzare. Viene quindi costruito un menu personalizzato sulla base del ruolo e della categoria dell'utente in modo da evitare l'accesso ad alcune aree da parte di utenti che non hanno i privilegi necessari.

Descrizione delle funzionalità

Il core dovrà, quindi, implementare degli strumenti, trasparenti all’utente finale, con cui effettuare le operazioni di

  • creazione dei campi di selezione globale (risorsa umana per l’amministratore, tipologia di piano e CdR per i responsabili, anno di budget);
  • bonifica dei parametri globali (verifica di sicurezza sui parametri selezionati e sull’esistenza delle relative entità)
  • caricamento dei moduli e verifica dei privilegi, in base ai ruoli aziendali, sui singoli moduli.
  • generazione del menù, in base ai ruoli aziendali e ai moduli attivi;

Le operazioni preliminari che vengono effettuate lato framework sono

  • .htaccess: implementazione del patern front controller tramite regole di Rewrite che dirigono tutte le richieste al file file cm/main.php trasformando in maniera corretta la richiesta in modo che possano essere gestite da main.php ed elaborate per le successive operazioni del framework.
  • cm/main.php: caricamento classes del framework (cm/autoload.php); caricamento addons (cm_cascadeloader.php) caricamento main common (cm/common.php) ed infine caricamento conf/common.php;

Vengono in seguito effettuate le operazioni preliminari del core:

  • Caricamento delle classi del Core tramite include di tutti i files presenti nella directory /classes
  • conf/common.php: all'evento on_before_routing, viene eseguita la funzione routingRulesGen che, in primis, recupera la matricola della risorsa umana loggata. Successivamente viene definito l'anno di budget e, sfruttando questa informazione, vengono definite le regole di routing dei possibili moduli caricabili da disco dell'applicativo;
  • conf/contents/common.php: definizione dei parametri globali di selezione (Centro di Responsabilità, anno di budget, risorsa umana) in base ai privilegi stessi della risorsa umana all'interno dell'azienda. A questo punto, viene generato il menù di navigazione (conf/contents/menu_gen.php)
  • conf/contents/load_modules.php: caricamento (da disco) dei moduli attivi, in base all'anno di budget definito all'interno di conf/common.php
  • conf/contents/menu_gen.php: caricamento del menù del core, ovvero quello relativo alla Gestione dell'Azienda. Il menù è visibile solo alle risorse umane che dispongono dei privilegi adatti per consultarlo. Infine vengono caricati i moduli aggiuntivi (conf/contents/load_modules.php)

Scelte implementative

Trasparenza dei moduli al core

Per garantire un'ampia flessibilità e modularità della soluzione è stato definito che tutti i moduli applicativi ed i dati collegati ad essi siano trasparenti al Core, in modo che le eventuali modifiche non debbano essere vincolate al funzionamento dei moduli. Anche la gestione dei dati a db segue questa logica, l'eliminazione o la modifica di un dato nel core quindi (ad esempio il codice dei CdR) non sarà vincolata dalle relazioni dei dati dei moduli. Parallelamente, lo sviluppo dei moduli è stato affrontato in modo che i dati dei moduli che fanno riferimento ai dati del Core non generino errori bloccanti nel caso di relazioni su chiavi esterne senza corrispondenza nelle entità del Core. A titolo esemplificativo, nel caso in cui si definisca un obiettivo collegato con un CdR tramite codice che in un secondo momento venga variato, le funzionalità del modulo "obiettivi" non genereranno errore, semplicemente il dato collegato verrà considerato inesistente dal modulo. La logica della gestione dei riferimenti mancanti è demandata completamente ai moduli. Lato Core tutta la logica e la gestione dei dati avverrà come se l'applicativo fosse costituito solamente dal core stesso.

conf/common.php

All’avvio dell’applicativo viene interrogata la pagina cm/main.php: al suo interno

  • Vengono caricate le classi, utilizzando il file cm/autoload.php;
  • Vengono caricati i gli addons, utilizzando il file cm/cm_cascadeloader.php;
  • Vengono caricati i file di common
    • cm/common.php
    • conf/common.php: inclusione delle classi comuni di astrazione del DB (cartella classes); definizione dei parametri da non passare in GET (GET_GLOBALS_EXCLUDE_LIST); definizione dei path; recupero dei moduli attivi e creazione dei parametri globali

conf/contents/common.php

La relazione tra l’utente ed i relativi permessi viene implementata tramite il concetto di “gruppo”, ad un gruppo possono essere associati più utenti e permessi.

Strutturando l’applicativo in questo modo, i permessi non vengono associati al singolo utente bensì al gruppo a cui esso appartiene: ciò garantisce una maggiore flessibilità ed un alto grado di manutenibilità del software.

All’evento “mod_security_on_check_session”, vengono effettuate delle analisi sui permessi e suo ruolo dell’utente che sta accedendo tramite delle Access Control List (ACL) personalizzate: questa analisi consente di individuare globalmente cosa può e cosa non può fare un utente.

La gestione di permessi più specifici, invece, viene demandata ai moduli stessi i quali possono definire, a loro volta, dei “gruppi” di utenti più restrittivi rispetto a quelli globali: ciò consente di filtrare ulteriormente gli utenti che avranno accesso al modulo, sia esso in modalità lettura e/o modalità modifica.

A questo punto viene visualizzato il menù di navigazione (conf/contents/menu_gen.php), costrutito dinamicamente e ad hoc sui privilegi dell’utente.

Al menù vengono aggiunte le varie voci di navigazione, tramite il file conf/contents/load_modules.php: analizza ogni singolo modulo attivo, rispetto all’anno di interesse, ed in base ai privilegi lo mostra o meno all’utente.

Come ultima attività, recupera i parametri globali, sempre disponibili in tutto l’applicativo, li bonifica e li rendere disponibili all’utente sottoforma di anno, piano CdR e CdR in uso.

Modello ER

anno_budget (ID, descrizione, attivo)

delega_accesso (ID, matricola_delegato, matricola_utente)

delega_accesso_modulo (ID, ID_delega_accesso, ID_modulo)

log_record_operation (ID, date_time, username, src_table, operation, data_record_ID)

Modello Classi

class AnnoBudget

Rappresenta un anno di budget.

  • Attributi
  • public $id;
  • public $descrizione;
  • public $attivo;
  • Metodi
  • public static function getAll($where=array(), $order=array())
Viene restituito un array di istanze della classe, corrispondenti a tutti i record della tabella "strategia_anno".
  • public static function ultimoDefinito()
Restituisce l'ultimo anno definito.
  • public static function ultimoAttivoInData($date = null)
Restituisce l'ultimo anno attivo alla data passata come parametro.
  • public function getAttivoPrecedente()
Restituisce l'ultimo anno attivo precedente all'anno di budget istanziato.
  • public function getTipiPianoCdrAttiviUtente()
Restituisce un array dei piani attivi nell'anno di budget istanziato (piani con almeno un CdR di afferenza dell'utente. Attualmente la classe restituisce tutti i piani con almeno un CdR afferente senza verifica sulla responsabilità dell'utente per ottimizzazione calcoli.
  • public function getUltimoPianoIntrodottoAnniPrecedenti(TipoPianoCdr $tipo_piano = null)
Restituisce il più recente piano cdr definito negli anni precedenti, eventualmente filtrato per tipo, passato come parametro.
  • public function getPianiCdr(TipoPianoCdr $tipo_piano = null)
Restituisce un array di piani cdr attivi durante l'anno, dal più recente al meno recente.

class CoreHelper

Oggetto helper del core.

  • Metodi
  • public static function GetGridSqlFromArray($grid_fields, $grid_recordset, $table_name)
Restituisce la stringa di testo della query utilizzabile da un oggetto grid ricevendo un array di record di valori associati ai campi specificati nell'array fields:
  fields array(fieldname1,fieldname2 ...);
  recordset array(
     array(value1,value2 ...) 
     array(value1,value2 ...) 
     array(value1,value2 ...) 
  );

  • public static function includeJqueryUi()
Include jquery-ui nelle pagine che lo utilizzano. Viene centralizzata nel metodo il caricamento delle librerie.
  • public static function percentuale($valore, $totale)
Metodo per il calcolo della percentuale.
  • public static function simpleExcelWriter($filename, $fogli_lavoro, $json = false)
Creazione di un file non formattato in xlsx per il download generato da una matrice di dati. Il parametro $json indica se il metodo deve restituire una risposta json oppure se generare il download del file. Come altri parametri vengono ricevuti il nome del file generato e l'array associativo nome foglio => matrice di dati da visualizzare in excel, costituita da un array di array:
  fogli_lavoro{foglio1{record1{0=>valorecampo1, 1=>valorecampo2, ...},$record2{...},...},$foglio2{...},...}.
  • public static function setError($oRecord, $str_error)
Metodo per la generazione di messaggi di errore all'interno della pagina di dettaglio dei record.
  • public static function cutText ($text, $length,$add_dots = true)
Metodo per troncare una stringa ($text) al numero di caratteri desiderato (length). Il parametro $add_dots serve a definire se la stringa accoderà "[...]" al testo troncato.
  • public static function getDataRiferimentoBudget (AnnoBudget $anno)
Restituisce la data di riferimento budget dell'anno passato come parametro.
  • public static function isDate($string)
Verifica che una stringa sia in formato data.
  • public static function getDateValueFromDB($date)
Viene formattata una data da db per essere utilizzata negli oggetti.
  • public static function getBooleanValueFromDB($boolean)
Viene formattato un booleano da db per essere utilizzato negli oggetti.
  • public static function refreshTabOnDialogClose($id_dialog)
Centralizzazione del codice per il refresh di un tab sulla chiusura di un dialog.
  • public static function disableNonEditableOfield($oField, $edit_condition)
Centralizzazione della disabilitazione di un oggetto ffField.
  • public static function isNonEditableFieldUpdated($oRecord, $fields)
Centralizzazione per il ripristino del valore di un ffField da db.
  • public static function formatUiDate($date_str, $input_format = "Y-m-d", $output_format = "d/m/Y")
Converte una data passata come stringa nel formato desiderato.
  • public static function verificaIntervalloAnni($start, $end)
Restituisce true se i valori $start e $end passati come parametro risultano validi per indicare un intervallo di anni.
  • public static function verificaSovrapposizioneIntervalliAnno($int1_start, $int1_end, $int2_start, $int2_end)
Restituisce true se gli intervalli di anni passati come parametro (anno inizio e fine degli intervalli $input e $db) risultano sovrapposti.
  • public static function stripTagsUTF8Encode($testo)
Restituisce una stringa rappresentante il testo passato come parametro senza tag html e decodificato in UTF8.

class DelegaAccesso extends Entity

Rappresenta una delega d'accesso.

  • Attributi
  • protected static $tablename = "delega_accesso";
  • Metodi
  • public function getModuliDelega()
Restituisce un array con gli id di moduli collegati alla delega.
  • public function saveModuliDelega($id_moduli)
Aggiorna le relazioni delega-moduli. Riceve un array di id di moduli collegati alla delega per salvare le relazioni ed eliminare quelle non mantenute.
  • public function delete ()
Eliminazione del record sul db corrispondente all'oggetto istanziato.
  • public function deleteRelations()
Eliminazione dei record delle enità collegate al record sul db corrispondente all'oggetto istanziato.

class Entity

Rappresenta un'entità generica del db.

  • Attributi
  • protected static $tablename;
  • pprivate static $db_types = array(...);
  • Metodi
  • public function __construct($id=null)
Costruttore. Se id diverso da null vengono creati e valorizzati gli attributi con quelli dei campi del record della tabella identificata dall'attributo $tablename con ID = parametro.
  • public static function getAll ($filters=array())
Viene restituito un array di istanze della classe, corrispondenti a tutti i record della tabella identificata dall'attributo $tablename. Il parametro filters riceve le eventuali condizioni applicate alla query di estrazione dati e le modalità di ordinamento:
  where = array("fieldname"=>"value=);
  order = array(array("fieldname"=>nome_campo, "direction"=>ASC/DESC));
  • public static function describe($hide_columns = array(), $table_name=null)
Restituisce un'array con i nomi dei campi della tabella del DB rappresentata dalla classe se $table_name=null o della tabella passata come parametro, ad esclusione dei campi passati nell'array $hide_coumns.
  • public static function getDbTables ($include__framework_tables=false)
Restituisce un array di stringhe rappresentanti i nomi di tutte le tabelle del DB. Se include__framework_tables è settato a false non vengono considerate le tabelle del framework.

class Evaluator

Classe esterna importata per la risoluzione di espressioni matematiche / logiche.

class Singleton

Classe utilizzata per essere estesa al fine di creare oggetti singleton.

  • Metodi
  • public static function Instance()
Restituisce l'oggetto della classe singleton.

Note tecniche

Perché l'applicativo sia utilizzabile è necessario che sia definito almeno un anno di budget e almeno un piano dei CdR con l'elemento radice definito. In ogni pagina dell'applicativo vengono infatti visualizzati i campi di selezione dei parametri globali, (dipendente -in caso di delega o di amministrazione-, anno, id_piano_cdr, cdr). Anno e piano_cdr che vengono valorizzati sempre, per questo in caso di mancata definizione l'applicativo restituisce errore critico.

Il metodo getDateValueFromDB($date) della classe CoreHelper converte tutte le date recuperate da db. I valori 0000-00-00 vengono recuperati dal metodo come campi null nel costruttore delle classi per evitare un numero elevato controlli all’interno dei metodi ogni volta si verifica la presenza di una data.

Torna all'Indice del Manuale Tecnico