e.Toscana Compliance 
Request for Comments: 108
Del: 25/06/2008
Categoria: Applicativa
Destinatari: Regione Toscana, Comuni, Amministrazioni locali

	Sincronizzazione e aggiornamento database Sistema Informativo Lavoro

	
	
	
Indice
======
1. Contesto di riferimento	
2. Obiettivi	
3. Analisi 
4. Prodotti attesi
5. Bibliografia



1. Contesto di riferimento
==========================

Nel contesto del potenziamento dei servizi offerti dalla Rete Telematica Regionale Toscana (RTRT),
 stato realizzato un servizio di cooperazione applicativa che consente ai
Sistemi Informativi Lavoro (SIL) connessi alla RTRT di tenere aggiornata,
in modo largamente automatizzato, una base dati SIL a livello regionale.
L'accentramento e l'aggiornamento di tale base dati riguarda tutti dati rilevanti
gestiti dall'applicazione IDOL: dall'anagrafica, allo stato di occupazione
dei soggetti, ai corsi da loro frequentati, eccetera.



2. Obiettivi
============

Il servizio di cooperazione applicativa proposto realizza l'integrazione nell'ambito della RTRT
dei Sistemi Informativi Lavoro distribuiti sul territorio, permettendo la creazione ed il continuo
aggiornamento di una base dati SIL centralizzata, situata presso la Regione Toscana,
al fine di accorpare, razionalizzare e rendere sistematica la catalogazione dei soggetti
trattati dal SIL.

Il servizio  stato realizzato adottando una architettura basata sul paradigma publish/subscribe
con pubblicazione e ricezione di eventi, in modo da minimizzare le latenze e sfruttare il parallelismo
presente nella ricezione di eventi da fonti diverse (i vari SIL presenti sul territorio regionale)

Gli eventi generati dai SIL sono costituiti da due parti: un'intestazione contentente
i dati identificativi dell'evento (mittente, destinatario, data, tipo di evento, eccetera)
e un corpo contenente le righe delle tabelle da aggiornare nella base dati regionale.

L'obiettivo principale e' quello di permettere l'invio periodico del flusso di dati aggregati,
evitando sia una frammentazione eccessiva degli stessi, sia l'invio di eventi di dimensioni eccessive,
e al tempo stesso permettere un'aggiornamento incrementale della base dati regionale.


3. Analisi
==========

Periodicamente, ad esempio ogni giorno, i SIL distribuiti sul territorio pubblicano
uno o pi eventi contententi le modifiche alla loro base dati effettuate recentemente,
in particolare le modifiche effettuate dopo l'ultimo evento pubblicato.

Gli eventi vengono ricevuti dalla base dati SIL centralizzata situata presso la Regione Toscana
e processati in maniera asincrona.

Per garantire l'integrit dei dati e allo stesso tempo permettere l'aggiornamento del software
usato dai SIL, esiste anche un evento di notifica nuova versione, spedito dalla base dati SIL
centralizzata verso i singoli SIL in occasione di aggiornamenti di versione che introducono
incompatibilit nella base dati. In caso di ricezione di un tale evento, ogni SIL controlla
automaticamente la versione del software installato e, in caso di incompatibilit, sospende 
temporaneamente l'invio di eventi di aggiornamento della base dati.

Gli schema XML che definiscono il formato dei messaggi scambiati tra i SIL sul territorio
e quello centralizzato sono riportati sotto:

----------------------------------
* XSD EventoAggiornamento.xsd *
----------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xsd:element name="MessaggioAssociatoAdEvento">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="Intestazione" />
                <xsd:element ref="Corpo" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="Intestazione">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="Operazione" type="operazione" minOccurs="0" />
                <xsd:element name="Mittente" type="xsd:string" minOccurs="0" />
                <xsd:element name="DestinazionePrincipale" type="provincia" minOccurs="0" />
                <xsd:element name="GestoreEventi" type="xsd:string" minOccurs="0" />
                <xsd:element name="DataConsegna" type="xsd:string" minOccurs="0" />
                <xsd:element name="IdentificativoEvento" type="id_evento" minOccurs="1" />
                <xsd:element name="IdentificativoOperazione" type="xsd:integer" minOccurs="1" />
                <xsd:element name="RichiestaRicevutaNotifica" type="ricevuta_notifica" minOccurs="0" />
                <xsd:element name="DataRicezione" type="xsd:string" minOccurs="0" />
                <xsd:element name="IdentificativoMessaggioRicevuto" type="xsd:string" minOccurs="0" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:complexType name="operazione">
        <xsd:sequence>
            <xsd:element name="ClasseEvento" type="classe_evento" minOccurs="0" />
            <xsd:element name="TipoEvento" type="tipo_evento" minOccurs="0" />
        </xsd:sequence>
    </xsd:complexType>
    <xsd:simpleType name="classe_evento">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="" />
            <xsd:enumeration value="TrasferimentoRegionale" />
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="tipo_evento">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="" />
            <xsd:enumeration value="versioneDB" />
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="provincia">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="(|[A-Z,a-z]{2})" />
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="id_evento">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="[\-0-9A-Za-z]*" />
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="ricevuta_notifica">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="" />
            <xsd:enumeration value="SI" />
            <xsd:enumeration value="NO" />
            <xsd:enumeration value="si" />
            <xsd:enumeration value="no" />
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:element name="Corpo">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="Dati" />
                <xsd:element ref="Errore" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="Dati">
        <xsd:complexType>
            <xsd:choice minOccurs="0" maxOccurs="unbounded">
                <xsd:element name="Altraformazione" type="xsd:string" />
                <xsd:element name="Altridati" type="xsd:string" />
                <xsd:element name="Anagrafica" type="xsd:string" />
                <xsd:element name="AnimatoriConsulenti" type="xsd:string" />
                <xsd:element name="AppAnagrafica" type="xsd:string" />
                <xsd:element name="AppAziendaVar" type="xsd:string" />
                <xsd:element name="AppLavoratoriVar" type="xsd:string" />
                <xsd:element name="AppTrasferimenti" type="xsd:string" />
                <xsd:element name="AppXML" type="xsd:string" />
                <xsd:element name="Attitudini" type="xsd:string" />
                <xsd:element name="AutoCert" type="xsd:string" />
                <xsd:element name="AutorAppr" type="xsd:string" />
                <xsd:element name="AutorCfl" type="xsd:string" />
                <xsd:element name="AutorCflUnp" type="xsd:string" />
                <xsd:element name="Avviamenti" type="xsd:string" />
                <xsd:element name="AvviamentoObb" type="xsd:string" />
                <xsd:element name="Azienda" type="xsd:string" />
                <xsd:element name="Aziorg" type="xsd:string" />
                <xsd:element name="Azioni" type="xsd:string" />
                <xsd:element name="Cancellazione" type="xsd:string" />
                <xsd:element name="CancellazioniStDisocc" type="xsd:string" />
                <xsd:element name="Carico" type="xsd:string" />
                <xsd:element name="Categ181" type="xsd:string" />
                <xsd:element name="Colloquio" type="xsd:string" />
                <xsd:element name="Competenze" type="xsd:string" />
                <xsd:element name="ConsMaster" type="xsd:string" />
                <xsd:element name="ConsOperatori" type="xsd:string" />
                <xsd:element name="Conv" type="xsd:string" />
                <xsd:element name="Corsiprof" type="xsd:string" />
                <xsd:element name="Delete" type="xsd:string" />
                <xsd:element name="DenLav" type="xsd:string" />
                <xsd:element name="Denunce" type="xsd:string" />
                <xsd:element name="DenunceOrgNaz" type="xsd:string" />
                <xsd:element name="Disocc" type="xsd:string" />
                <xsd:element name="Esperienzelavoro" type="xsd:string" />
                <xsd:element name="Forzature_e_a" type="xsd:string" />
                <xsd:element name="Forzature_407" type="xsd:string" />
                <xsd:element name="Indisponibilita" type="xsd:string" />
                <xsd:element name="Iscrizione" type="xsd:string" />
                <xsd:element name="Iscrizione181" type="xsd:string" />
                <xsd:element name="Lingue" type="xsd:string" />
                <xsd:element name="Mansioni" type="xsd:string" />
                <xsd:element name="MarketingAziende" type="xsd:string" />
                <xsd:element name="MarketingAziendeContatti" type="xsd:string" />
                <xsd:element name="MarketingAziendeGestioni" type="xsd:string" />
                <xsd:element name="MarketingAziendeVisite" type="xsd:string" />
                <xsd:element name="Mirato_nulla_osta" type="xsd:string" />
                <xsd:element name="Mirato_visite" type="xsd:string" />
                <xsd:element name="Mobilita" type="xsd:string" />
                <xsd:element name="Modulo" type="xsd:string" />
                <xsd:element name="PeriodiFormativi" type="xsd:string" />
                <xsd:element name="Propensioni" type="xsd:string" />
                <xsd:element name="Proroghe" type="xsd:string" />
                <xsd:element name="Qualart16" type="xsd:string" />
                <xsd:element name="QualObb" type="xsd:string" />
                <xsd:element name="Reddito" type="xsd:string" />
                <xsd:element name="Registraz" type="xsd:string" />
                <xsd:element name="Revisioni" type="xsd:string" />
                <xsd:element name="Servizi" type="xsd:string" />
                <xsd:element name="ServiziAzienda" type="xsd:string" />
                <xsd:element name="SelezLista" type="xsd:string" />
                <xsd:element name="SelezLav" type="xsd:string" />
                <xsd:element name="Sottomodulo" type="xsd:string" />
                <xsd:element name="Stage" type="xsd:string" />
                <xsd:element name="Titolistudio" type="xsd:string" />
                <xsd:element name="TrasfDB" type="database" />
                <xsd:element name="Trasformazioni" type="xsd:string" />
                <xsd:element name="UniLav" type="xsd:string" />
                <xsd:element name="Unprod" type="xsd:string" />
                <xsd:element name="UnprodColl" type="xsd:string" />
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>
    <xsd:simpleType name="database">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="(.*\|\|)*" />
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:element name="Errore">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="Codice" />
                <xsd:element ref="Note" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="Codice" type="xsd:string" />
    <xsd:element name="Note" type="xsd:string" />
</xsd:schema>



Un esempio di evento conforme allo schema XML  il seguente:


<MessaggioAssociatoAdEvento>
  <Intestazione>
    <Operazione>
      <ClasseEvento>TrasferimentoRegionale</ClasseEvento>
      <TipoEvento></TipoEvento>
    </Operazione>
    <Mittente>GR</Mittente>
    <DestinazionePrincipale>09</DestinazionePrincipale>
    <GestoreEventi>http://localhost:80/IDOLCart/ws/IDOLService</GestoreEventi>
    <DataConsegna>2008 06 25 12:19:20</DataConsegna>
    <IdentificativoEvento>GR-20080609-1</IdentificativoEvento>
    <IdentificativoOperazione>0936</IdentificativoOperazione>
    <RichiestaRicevutaNotifica>SI</RichiestaRicevutaNotifica>
    <DataRicezione />
    <IdentificativoMessaggioRicevuto />
  </Intestazione>
  <Corpo>
    <Dati>
      <Anagrafica />
      <Altridati />
      <Qualart16 />
      <Cancellazione />
      <Carico />
      <Corsiprof />
      <Esperienzelavoro />
      <Iscrizione />
      <Propensioni />
      <Altraformazione />
      <Reddito />
      <Revisioni />
      <Lingue />
      <Titolistudio />
      <Stage />
      <Azienda />
      <Unprod />
      <Aziorg />
      <AutorAppr />
      <AutorCfl />
      <AutorCflUnp />
      <Avviamenti />
      <Proroghe />
      <AutoCert />
      <Categ181 />
      <Colloquio />
      <Azioni />
      <CancellazioniStDisocc />
      <Servizi />
      <ServiziAzienda />
      <SelezLista />
      <SelezLav />
      <Attitudini />
      <Iscrizione181 />
      <Disocc />
      <Mobilita />
      <Modulo />
      <Sottomodulo />
      <Denunce />
      <Mansioni />
      <Conv />
      <Registraz />
      <DenLav />
      <DenunceOrgNaz />
      <AvviamentoObb />
      <QualObb />
      <Delete />
      <ConsOperatori />
      <Trasformazioni />
      <AppAnagrafica />
      <UniLav />
      <PeriodiFormativi />
      <MarketingAziende />
      <MarketingAziendeContatti />
      <MarketingAziendeGestioni />
      <MarketingAziendeVisite />
      <Competenze />
      <ConsMaster />
      <AnimatoriConsulenti />
      <Indisponibilita />
      <Forzature_e_a />
      <Forzature_407 />
      <Mirato_nulla_osta />
      <Mirato_visite />
      <TrasfDB>20080205||20080506||1.2||20081212 12:51:06||1.2||20080513 00:00:00||GR||</TrasfDB>
      <AppXML />
      <AppTrasferimenti />
      <AppAziendaVar />
      <AppLavoratoriVar />
      <UnprodColl />
    </Dati>
    <Errore>
      <Codice />
      <Note />
    </Errore>
  </Corpo>
</MessaggioAssociatoAdEvento>



4. Prodotti attesi
==================

I SIL ricevono eventi esponendo Web Services corrispondenti al seguente WSDL:

-------------------------
* WSDL IDOLService.wsdl *
-------------------------

<?xml version="1.0" encoding="UTF-8"?>
<definitions name="IDOLService" targetNamespace="http://www.rete.toscana.it/wsdl/cart/idol"
            xmlns="http://schemas.xmlsoap.org/wsdl/"
            xmlns:tns="http://www.rete.toscana.it/wsdl/cart/idol"
            xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
    <types>
        <xsd:schema targetNamespace="http://www.rete.toscana.it/wsdl/cart/idol"
                    xmlns="http://www.w3.org/2001/XMLSchema"
                    xmlns:tns="http://www.rete.toscana.it/wsdl/cart/idol"
                    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <xsd:element name="inviaMessaggio">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="MessaggioXML" type="xsd:string"/>
                        <xsd:element name="ClasseEvento" type="xsd:string"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="inviaMessaggioResponse" type="xsd:string" nillable="true"/>
            
            <xsd:element name="riceviMessaggio">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="ClasseEvento" type="xsd:string"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="riceviMessaggioResponse">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="MessaggioID"  type="xsd:string"/>
                        <xsd:element name="MessaggioXML" type="xsd:string"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:schema>
    </types>

    <message name="inviaMessaggioRequest">
        <part name="parameters" element="tns:inviaMessaggio"/>
    </message>
    <message name="inviaMessaggioResponse">
        <part name="result" element="tns:inviaMessaggioResponse"/>
    </message>
    
    <message name="riceviMessaggioRequest">
        <part name="parameters" element="tns:riceviMessaggio"/>
    </message>
    <message name="riceviMessaggioResponse">
        <part name="result" element="tns:riceviMessaggioResponse"/>
    </message>
    
    <portType name="IDOLInterfaceWS">
        <operation name="inviaMessaggio">
            <input message="tns:inviaMessaggioRequest"/>
            <output message="tns:inviaMessaggioResponse"/>
        </operation>
        <operation name="riceviMessaggio">
            <input message="tns:riceviMessaggioRequest"/>
            <output message="tns:riceviMessaggioResponse"/>
        </operation>
    </portType>
    
    <binding name="IDOLInterfaceBinding" type="tns:IDOLInterfaceWS">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <operation name="inviaMessaggio">
            <soap:operation soapAction=""/>
            <input><soap:body use="literal"/></input>
            <output><soap:body use="literal"/></output>
        </operation>
        <operation name="riceviMessaggio">
            <soap:operation soapAction=""/>
            <input><soap:body use="literal"/></input>
            <output><soap:body use="literal"/></output>
        </operation>
    </binding>
    
    <service name="IDOLService">
        <port name="IDOLInterfacePort" binding="tns:IDOLInterfaceBinding">
            <soap:address location="https://www.caribel.it/IDOLCart/ws/IDOLServer"/>
        </port>
    </service>
</definitions>

In caso che la comunicazione avvenga su protocollo sicuro (https),
saranno necessari certificati elettronici rilasciati da Regione Toscana.





5. Bibliografia
===============
[1] Web Services Description Language (WSDL) 1.1 http://www.w3.org/TR/wsdl
[2] XML Schema http://www.w3.org/XML/Schema
[3] Latest SOAP versions http://www.w3.org/TR/soap/
