Man Tecnico:Gestione dei piani cdr

From CDG Wiki
Jump to navigation Jump to search

Introduzione

La gestione del piano organizzativo fornisce un’interfaccia che permette di configurare la struttura organizzativa aziendale sulla quale si baserà il core per la gestione dei parametri globali e privilegi utente e per la definizione delle politiche di gestione da fornire agli eventuali moduli applicativi.

Analisi dei requisiti

La struttura delle aziende sanitarie è definita attraverso un Piano Organizzativo Aziendale Strategico (POAS) che ne determina l’assetto organizzativo e la modalità di funzionamento. Un POAS è una struttura gerarchica nella quale ogni nodo è chiamato Centro di Responsabilità (CdR) e costituisce una cellula organizzativa con funzionalità specifiche. Ogni Cdr è assegnato ad un responsabile che lo gestisce e lo governa attraverso il processo di Programmazione e Controllo (P&C) e può essere identificato da una tipologia specifica, denominata differentemente in base all’ente di riferimento. Ad ogni Cdr vengono associato uno o più Centri di Costo (CdC) che costituiscono le unità contabili alle quale vengono associate le risorse aziendali (personale, beni o servizi). Il POAS si può sviluppare su un numero variabile e potenzialmente infinito di livelli e prevede obbligatoriamente un elemento radice unico. Può variare nel corso del tempo, in date indipendenti dall’anno di budget di riferimento, per questo è necessario considerare per ogni funzionalità del processo di P&C la versione storicizzata del POAS alla data di riferimento opportuna. Ogni versione del POAS costituirà quindi la struttura gerarchica dei Cdr a partire da una data di introduzione specifica, sulla quale verrà incrociato lo storico dei responsabili dei CdR che viene definito separatamente in quanto la definizione delle responsabilità dei CdR è indipendente dalla definizione della struttura aziendale. Alcune realtà presentano una o più realtà organizzative rispetto alla sola struttura gerarchica, ad esempio le aziende potrebbero organizzare i CdR rispetto a dimensioni organizzative, quali distretti o sedi geografiche, che verranno considerati per le varie funzionalità in base alle strategie di gestione. Dovrà essere quindi possibile poter gestire da una a infinite dimensioni aziendali, che potranno essere utilizzate dalle altre funzionalità in base alle politiche di gestione specifiche. I CdR sono identificati da un codice, una descrizione e una tipologia, per mantenere la coerenza delle informazioni nelle varie dimensioni dei POAS è utile mantenere un’anagrafica che sia storicizzata per poter gestire eventuali modifiche, che verranno in questo modo propagate in maniera corretta. Nel momento in cui verrà definito un CdR in un POAS quindi potrà essere selezionata la voce corretta nell’anagrafica valida in quella data. La stessa considerazione viene effettuata per i CdC.

Descrizione delle funzionalità

Valutando quanto considerato nell’analisi dei requisiti si definiscono le funzionalità che l’applicativo dovrà fornire all’utente per la gestione del POAS. Verrà prevista la possibilità di gestire lo storico dei POAS, selezionando in primis la tipologia (dimensione) del POAS che si sta definendo e selezionando un piano già esistente oppure scegliendo di creare un nuovo piano. Ogni piano sarà definito tramite una data di introduzione che determina la data dalla quale verrà considerato effettivo e che indicherà il periodo di validità. Si decide che la data di introduzione del piano dovrà risultare successiva alla data di introduzione dell’ultimo piano e che un piano che viene reso utilizzabile non sia più modificabile o eliminabile per coerenza con il modello organizzativo. La gestione di piani viene quindi resa possibile solamente se il piano non è reso effettivo e quindi considerato dalle funzionalità dell’applicativo, per garantire questo aspetto si decide di mantenere le versioni dei POAS che si stanno modificando come temporanee e di avere la possibilità di renderle definitive tramite una specifica funzionalità. I POAS temporanei avranno come attributo una data di riferimento che indica la presunta data in cui il piano verrà introdotto e che servirà come riferimento per il recupero delle anagrafiche CdR e CdC da considerare per la definizione mentre i piani effettivi saranno identificati come tali avendo un attributo “data_introduzione” valorizzato e uguale alla data di riferimento. Risulta ovvio che essendo i vari piani dei CdR della stessa tipologia evoluzioni nel tempo di un unico POAS sarebbe più comodo partire dall’ultima versione del POAS definito per quella dimensione e modificarla in base alle evoluzioni aziendali piuttosto che dover introdurre un nuovo POAS ad ogni cambiamento organizzativo. Viene quindi prevista la possibilità di selezionare una versione del POAS e clonarla in una nuova versione temporanea. La modifica del POAS verrà effettuata in un’unica pagina in cui sarà visualizzato il CdR radice con il responsabile alla data di riferimento e le varie operazioni effettuabili sullo stesso, tra le quali la possibilità di espandere l’albero visualizzando i figli gerarchici, per ognuno dei quali verranno visualizzate le operazioni previste per il padre. Le operazioni sui CdR potranno essere quelle di inserimento di un nuovo figlio, di modifica del Cdr (selezionando la descrizione dall’anagrafica), di eliminazione con propagazione a tutti i figli, spostamento sotto un altro padre e gestione dei CdC associati. E’ importante sottolineare che la tipologia di CdR viene gestita tramite una funzionalità specifica e prevederà eventuali dipendenze da altre tipologie CdR per poter garantire vincoli gerarchici (ad esempio i CdR di tipologia 1 potranno avere come figli solo CdR di tipologia 3). Questo comporta che nelle operazioni di creazione e spostamento verranno considerate le tipologie come vincoli. Per quanto riguarda i CdC le operazioni effettuabili saranno quelle di associazione di un nuovo CdC al CdR, spostamento dell’afferenza ad un altro CdR, modifica della descrizione con selezione dall’anagrafica ed eliminazione. Riassumendo, le funzionalità da garantire saranno

  • POAS
    • Definizione
    • Modifica
    • Eliminazione
    • Introduzione
    • Clonazione
  • CdR
    • Inserimento (tramite inserimento figlio da padre)
    • Modifica
    • Spostamento afferenza
    • Eliminazione
  • CdC
    • Inserimento (tramite afferenza a CdR)
    • Spostamento afferenza
    • Modifica
    • Eliminazione

Vengono elencati di seguito i vincoli da considerare al momento dell’esecuzione delle operazioni sopra descritte Vincoli sullo spostamento di CdR:

  1. Il padre di destinazione di un CdR non può essere il padre attuale.
  2. Un CdR non può essere figlio di un CdR con tipologia per la quale non è prevista una dipendenza.
  3. Il padre di destinazione non può essere uno dei figli sul ramo gerarchico del CdR che si sta spostando.

Vincoli sulla modifica dei POAS:

  1. Non possono essere effettuate operazioni di modifica alla gerarchia e ai CdR e ai CdC appartenenti a piani già introdotti.
  2. Non possono esistere per lo stesso POAS due CdR / CdC con lo stesso riferimento all’anagrafica dei CdR / CdC
  3. Non può essere introdotto un POAS con il CdR radice senza un responsabile definito
  4. In inserimento / clonazione la data di riferimento del nuovo POAS deve necessariamente essere successiva all’ultima data di riferimento utilizzata per i POAS della stessa tipologia

Vincoli sull’eliminazione:

  1. Non possono essere effettuate operazioni di eliminazione di CdR e CdC appartenenti a piani già introdotti.
  2. Non possono essere effettuate operazioni di eliminazione di piani CdR già introdotti.

Scelte implementative

Alla luce delle considerazioni fatte si delineano le scelte implementative. Si decide in primis di garantire una gestione completa in un’unica pagina di interfaccia che presenterà la scelta della dimensione del POAS da modificare e la possibilità di selezionare, per la tipologia scelta, tutti i piani introdotti ordinati per data di riferimento decrescente e indicando se si tratta di un piano temporaneo o effettivo. Selezionato il piano verranno visualizzate le operazioni effettuabili sullo stesso e l’elemento radice con la possibilità di espandere il livello caricando in maniera asincrona tutti i figli. Ogni modifica del CdR comporterà l’aggiornamento delle informazioni del CdR e il caricamento asincrono dei figli. Questa operazione è prevista per i figli, risulta quindi utile creare una soluzione generica per ogni elemento dell’albero che visualizzi tutti i CdR previsti per un CdR padre con le relative operazioni. L’entità CdR sarà quindi in relazione con se stessa tramite l’attributo ID_padre per permettere di ricostruire la gerarchia dei CdR in maniera ricorsiva. Verrà quindi sviluppata una pagina personalizzata tramite il sistema di templating del framework che prevederà una pagina “contenitore” per la gestione dei POAS ed una pagina che rappresenterà ogni livello gerarchico (CdR) e conterrà un elemento nel quale verranno caricati i figli, ognuno dei quali visualizzato tramite la stessa pagina. Gli obiettivi che si è deciso di perseguire nella fase di implementazione del codice sono quelli di mantenere una struttura flessibile non rigida indipendente dai moduli, per questo alcune informazioni aggiuntive relative ai processi in cui i vari CdR sono coinvolti (programmazione strategica, partecipazione a P&C costi e ricavi ecc) verranno definite direttamente nei moduli che gestiscono gli aspetti specifici. Le relazioni con il POAS verranno sempre gestite dai moduli tramite il codice del CdR, sarà il core che garantirà le relazioni con gli entità corrette tramite la gestione degli storici nelle date di riferimenti.

Modello ER

piano_cdr (ID, data_definizione, data_introduzione, ID_tipo_piano_cdr)

cdr (ID, ID_anagrafica_cdr, ID_piano_cdr, ID_padre)

cdc (ID, ID_anagrafica_cdc, ID_cdr)

tipo_cdr (ID, descrizione, abbreviazione)

tipo_cdr_padre (ID, ID_tipo_cdr, ID_tipo_cdr_padre)

tipo_piano_cdr (ID, descrizione)

Modello Classi

class Cdc

Rappresenta un Cdc.

  • Attributi
  • public $id;
  • public $id_anagrafica_cdc;
  • public $id_cdr;
  • public $codice;
  • public $descrizione;
  • public $abbreviazione;
  • Metodi
  • public function __construct($id=null)
Costruttore. Se id diverso da null vengono valorizzati gli attributi con quelli del record della tabella "cdc" con ID = parametro.
  • public static function factoryFromCodice($codice, PianoCdr $piano_cdr)
Costruttore da parametri differenti da ID. Viene istanziato un oggetto del tipo della classe utilzzando i parametri passati per identificare univocamente il record.
  • public function delete()
Eliminazione del record della tabella "cdc" corrispondente all'oggetto.
  • public static function getAll ($filters=array())
Viene restituito un array di istanze della classe, corrispondenti a tutti i record della tabella "cdc". Il parametro $filters è un array di array associativi "campo_db"=>valore che permette di limitare i risultati ai soli elementi corrispondenti alle condizioni impostate nel parametro che vengono applicati alla query di recupero dei dati.
  • public function getPersonaleCdcInData(DateTime $date = null)
Restituisce un array di oggetti di tipo CdCPersonale contenente la distribuzione delle teste per il cdc, eventualmente filtrata per data di riferimento.
  • public function save()
Viene salvato a db nella tabella "cdc" l'oggetto. Gli attributi vengono salvati come valori dei campi corrispondenti. Se il record esiste già (verifica su ID) viene aggiornato altrimenti viene aggiunto.

class Cdr extends Entity

Rappresenta un CdR.

  • Attributi
  • public $id;
  • public $id_anagrafica_cdr;
  • public $id_piano_cdr;
  • public $id_padre;
  • public $codice;
  • public $descrizione;
  • public $abbreviazione;
  • public $id_tipo_cdr;
  • public $useSql;
  • Metodi
  • public function __construct($id=null, $useSql = false)
Costruttore. Se id diverso da null vengono valorizzati gli attributi con quelli del record della tabella "cdr" con ID = parametro. Vengono inoltre popolati gli attributi "codice", "descrizione", "abbreviazione", "id_tipo_cdr" da "anagrafica_cdr". Nel caso in cui $useSql = true i dati vengono ricavati dall'oggetto globale invece che da db.
  • public static function factoryFromCodice($codice, PianoCdr $piano_cdr)
Costruttore da parametri differenti da ID. Viene istanziato un oggetto del tipo della classe utilzzando i parametri pasati per identificare univocamente il record.

public static function getAll($filters = array(), $useSql = true)

Viene restituito un array di istanze della classe, corrispondenti a tutti i record della tabella "cdr". Il parametro $filters è un array di array associativi "campo_db"=>valore che permette di limitare i risultati ai soli elementi corrispondenti alle condizioni impostate nel parametro che vengono applicati alla query di recupero dei dati.
  • public static function getCdrPianiFromCodice($codice_cdr, $date)
Restituisce un array di array contenente tutti i tipi di piano cdr per i quali è previsto un cdr con il codice passato, in una data specifica. Ogni elemento dell'array sarà costituito da un array associativo "tipo_piano_cdr" e "cdr", chiavi associate rispettivamente alla tipologia del piano e all'oggetto CdR corrispondente al cdr con il codice passato per il piano considerato. array(array("tipo_piano_cdr"=>[TipoPianoCdr], "cdr"=>[Cdr]), ...).
  • public function save()
Viene salvato a db nella tabella "cdr" l'oggetto. Gli attributi vengono salvati come valori dei campi corrispondenti. Se il record esiste già (verifica su ID) viene aggiornato altrimenti viene aggiunto.'
  • public static function getTipoPianoPriorita($codice_cdr, $date)
Restituisce il tipo piano di cdr con priorità più alta al quale il codice cdr è associato in una data specifica.
  • public function getFigli()
Restituisce un array di oggetti di tipo Cdr rappresentante tutti i CdR figli del il CdR istanziato.
  • public function getPadriRamo()
Restituisce un array di oggetti di tipo Cdr rappresentante tutti i CdR padri gerarchici del CdR selezionato, ordinati dal livello più basso a quello più alto (che sarà rappresentato da CdR radice).
  • public function getLivelloGerarchico()
Restituisce un numero intero che rappresenta il livello gerarchico del CdR istanziato nel piano dei CdR (livello radice = 0).
  • public function getGerarchia($cdr = null, $livello = 0, $gerarchia = null, $codici_cdr_figli_esclusi = array())
Restituisce un array multidimensionale con i CdR della gerarchia di cui il cdr corrente è padre ed il livello dei cdr su questa gerarchia (array("cdr" => Cdr, "livello" => int)). L'ultimo parametro è un array contenente i cdr che è possibile escludere dalla gerarchia restituita (con i relativi figli). Il codice del CdR sul quale viene chiamato il metodo non verrà escluso anche nel caso in cui compaia in elenco.
  • public static function getRamiGerarchiciElencoCdr($elenco_codici = array(), PianoCdr $piano_cdr)
Restituisce tutti i rami gerarchici individuati tramite un array di cdr passato come parametro. Vengono restituiti, per ogni codice cdr passato nell'array, tutti i cdr afferenti al ramo gerarchico di quel cdr che non costituiscono a loro volta un elemento dell'array. Viene restituito un array con i cdr afferenti al ramo (array codice e livello rispetto al cdr considerato) compreso il cdr passato come elemento.

  [elenco]array (
     [ramo]array(   
     [cdr]  array ("cdr"=> cdr, "livello" =>  livello),
     )
  • public function getCdc()
Restituisce un array di oggetti Cdc rappresentante i CdC afferenti al CdR.
  • public function getResponsabile(DateTime $data_riferimento)
Restituisce un oggetto di tipo ResponsabileCdr che rappresenta il responsabile del CdR (assegnato direttamente o ereditato gerarchicamente) alla data di riferimento passata come parametro.
  • public function getIfResponsabileRamo(Personale $personale, DateTime $date)
Restituisce true o false dipendentemente dal fatto che il personale passato come parametro abbia visibilità o meno sul CdR
  • public function getPrivileges(Personale $personale, DateTime $date)
Restituisce un array di privilegi sul CdR garantiti in una data specifica al Personale passato come parametro. I valori restituiti possono essere "resp_cdr_selezionato", "resp_padre_cdr_selezionato", "resp_padre_ramo_cdr_selezionato"
  • public function getPersonaleCdcAfferentiInData(DateTime $date)
Restituisce un array di oggetti CdcPersonale rappresentante tutti i dipendenti afferenti ai CdC del CdR in una data specifica
  • public function getPrimoResponsabilePadre(DateTime $date)
Restituisce il primo responsabile su CdR padre differente dal responsabile del CdR istanziato alla data di riferimento passata come parametro. null se non si riesce ad istanziare il responsabile superiore (es cdr radice).
  • public function delete()
Eliminazione del record della tabella "cdr" corrispondente all'oggetto.

class PianoCdr extends Entity

Rappresenta un piano dei CdR.

  • Attributi
  • protected static $tablename = "piano_cdr";
  • Metodi
  • public static function getAll($where=array(), $order=array(array("fieldname"=>"data_definizione", "direction"=>"DESC")))
Viene restituito un array di istanze della classe, corrispondenti a tutti i record della tabella "piano_cdr". I parametri $where e $order vengono utilizzati per poter estendere l'utilizzo della getAll() di Entity preselezionando dei valori di default.
  • public static function getAttivoInData(TipoPianoCdr $tipo_piano, $date)
Restituisce il piano attivo alla data selezionata, null se nessun piano attivo.
  • public static function getPianiCdrCodice($codice, $class)
Vengono restituiti in un array tutti i piani CdR in cui compare il codice CdC/CdR (in base al valore del parametro $class) passato come parametro.
  • public function getCdr()
Restituisce un array con i cdr appartenenti al piano.
  • public function getCdrRadice()
Restituisce il CdR radice (un solo cdr con padre 0 previsto) del piano cdr.
  • public function delete()
Eliminazione del record della tabella "piano_cdr" corrispondente all'oggetto.
  • public function introduzionePiano()
Viene aggiornato il record corrispondente al piano cdr su db valorizzando la data_introduzione con lo stesso valore della data definizione, per renderlo definitivo.
  • public function save()
Viene inserito a db un record nella tabella "piano_cdr_" con i campi valorizzati in base agli attributi dell'oggetto.

class TableCdr extends Singleton

Oggetto per il sistema di caching dei CdR.

  • Attributi
  • private $piani_cdr = null;
  • Metodi
  • protected function __construct()
Costruttore. salva l'attributo $piani_cdr come array associativo il quale ogni elemento rappresenta il piano valido alla data di riferimento (recuperata dai globals) per ogni tipologia di piano attiva.
  array(
     'tipo_piano_cdr' => $tipo_piano,
     'piano_cdr' => $piano_attivo,
     'cdr' => $cdr_piano,
  );
  • public function getPianiCdr()
Restituisce l'oggetto singleton.

class TableResponsabileCdrextends Singleton

Oggetto per il sistema di caching dei responsabili CdR.

  • Attributi
  • private $respCdrInData = null;
  • Metodi
  • protected function __construct()
Costruttore. salva l'attributo $respCdrInData come array di responsabili CdR alla data di riferimento (recuperata dai globals) la cui chiave è rappresentata dall'id del responsabile e il valore l'oggetto ResponsabileCdR corrispondente.

  • public function getRespCdrInData()
Restituisce l'oggetto singleton.

class TipoCdr extends Entity

Rappresenta la tipologia di CdR.

  • Attributi
  • protected static $tablename = "tipo_cdr";
  • Metodi
  • public function getPadri ()
Restituisce un array con tutti i tipi cdr che possono essere definiti come padre per la tipologia rappresentata dall'istanza.
  • public function getPadriRelation ()
Restituisce un array con le relazioni con TipoCdrPadre.
  • public function getFigli ()
Restituisce un array di tutte le tipologie che possono essere figlie dell'istanza.
  • public function canDelete()
Restituisce true se l'oggetto può essere eliminato (nessuna relazione vincolante).

class TipoCdrPadre extends Entity

Rappresenta la relazione fra tipologia CdR e tipologia CdR utilizzabile come padre.

  • Attributi
  • protected static $tablename = "tipo_cdr_padre";
  • Metodi

public static function instanceFromRelation(TipoCdr $tipo_cdr, TipoCdr $tipo_cdr_padre)

Costruttore da parametri differenti da ID. Viene istanziato un oggetto del tipo della classe utilzzando i parametri pasati per identificare univocamente il record.
  • public static function saveNew($row)
Inserisce a db un record corrispondente alla relazione rappresentata dall'istanza nella tabella "tipo_cdr_padre". Riceve un array con coppia chiave=>valore nome_campo=>valore per ogni campo.
  • public function save()
Effettua l'aggiornamento su db del record corrispondente all'istanza nella tabella "tipo_cdr_padre".
  • public function delete()
Effettua l'eliminazione del record corrispondente all'istanza su db nella tabella "tipo_cdr_padre".
  • public static function getAll ($filters=array())
Viene restituito un array di istanze della classe, corrispondenti a tutti i record della tabella "tipo_cdr_padre".

class TipoPianoCdr extends Entity

Rappresenta un piano dei CdR.

  • Attributi
  • protected static $tablename = "tipo_piano_cdr";
  • Metodi
  • public static function getAll($where=array(), $order=array(array("fieldname"=>"priorita", "direction"=>"ASC")))
Viene restituito un array di istanze della classe, corrispondenti a tutti i record della tabella "tipo_piano_cdr". I parametri $where e $order vengono utilizzati per poter estendere l'utilizzo della getAll() di Entity preselezionando dei valori di default.
  • public static function getPrioritaMassima
Restituisce il tipo piano con priorità più alta.
  • public function canDelete()
Restituisce true se l'oggetto può essere eliminato (nessuna relazione vincolante).

Note Tecniche

Template

La realizzazione prevede la creazione di due pagine template:

  1. tree.html
  2. tree_selection.html

La prima va a definire l'albero gerarchico, consentendo la visualizzazione dei pulsanti e legandoli alla chiamata a delle opportune funzioni, implementate all'interno del template tree_selection.html. Il template tree_selection definisce il piano cdr attualmente selezionato e consente la visualizzazione dei pulsanti per le operazioni sul piano, associandoli a delle funzioni che implementano le funzionalità legate a ciascun pulsante. Le varie funzioni per l'adempimento delle operazioni sui cdr sono realizzate utilizzando la tecnica ajax, associando quindi una rotta attraverso la quale reperire i dati. Tale rotta è una pagina php alla quale vanno passati i parametri del cdr/piano cdr selezionato, grazie ai quali è possibile svolgere le dovute operazioni.

Pagine index

Per ogni pagina template, viene definita una pagina index: per la pagina "tree_selection.html" viene definito l'index "index.php" che contiene una form per la selezione del piano cdr su cui lavorare. Vengono quindi recuperati tutti i piani e tutte le tipologie di piani cdr dal database per popolare i menu a tendina. Per la pagina "tree.html" viene definito l'index "tree.php", il quale va a caricare l'albero del piano selezionato mediante la form descritta precedentemente. Inizialmente tale albero risulterà completamente chiuso, e sarà possibile aprirlo un livello alla volta mediante delle funzioni che rielaborano l'albero dinamicamente.

Elaborazione delle operazioni

Definite le rotte nei template, occorre creare fisicamente le pagine php che fungono da destinazione finale attraverso la quale vengono effettuate le operazioni. Per ogni funzionalità viene quindi definita una pagina che contiene il codice per assicurare il rispetto dei vincoli, ed in base all'esito restituisce un messaggio. Nel caso di errori occorre segnalare all'utente il tipo di errore, e nel caso in cui fosse un errore dovuto al mancato rispetto dei vincoli, vengono visualizzati dei messaggi che spiegano il motivo per cui l'operazione non è riuscita.

cdr_modify.php

La pagina in questione contiene il codice per la modifica e l'inserimento di cdr: nel caso in cui il cdr andrà inserito, alla pagina viene passato un id_cdr pari a 0, ed in tal caso non si prova a recuperare i dati per il popolamento della form. Se invece l'id del cdr non è 0, vengono recuperati i valori dalle tabelle del database e la form viene popolata di conseguenza. Nel caso della modifica, alla pressione del tasto "aggiorna", se viene modificata l'anagrafica del cdr, bisognerà inserire una data termine per l'anagrafica attuale e crearne una nuova associata al cdr in questione. Lo stesso ragionamento andrà applicato alla tabella "responsabile_cdr", la quale contiene il codice del cdr: se quest'ultimo cambia, va aggiornata anche quella tabella. La form per la modifica/inserimento consentirà anche, se aperta in modifica, di cancellare il cdr mediante la pressione di un tasto "cancella".

cdr_move.php

Letti i parametri passati in GET, il compito di questa pagina è di verificare che lo spostamento del cdr intrapreso dall'utente sia legittimo e rispetti quindi tutti i vincoli. In caso affermativo, la pagina restituisce un messaggio all'utente che lo informa dell'avvenuto spostamento, altrimenti mostra il tipo di errore riscontrato.

piani_cdr_modify

La creazione, la modifica e la cancellazione di piani cdr avverrà mediante lo stesso procedimento descritto per la modifica dei cdr.

Torna all'Indice del Manuale Tecnico