Felles lånernummer og lånekort for bibliotekbrukere

(Foreløpig versjon)


Innholdsfortegnelse
1. Innledning
2. Programvare og databasedelen
2.1. Tjener på nettet
2.2. Lånere lokalt vs. sentralt
2.3. Distribusjon av endringer
2.4. Protokoll for kommunikasjon mot basen
2.4.1. Funksjoner
2.4.2. Autentisering av utførende bibliotek
2.5. Åpenhet
3. Folkeregisteret
4. Personvern
5. Maskinvare og lånekort
5.1. Lånerkort med strekkoder
5.2. Lånerkort med magnetstripe eller smartkort
6. Eksempler på praktisk bruk
6.1. Opprettelse av ny låner i den sentrale basen
6.2. Opprettelse av ny låner lokalt
6.3. Endring av låneropplysninger
A. Databasen
B. Lånere med flere lånerkort
C. Funksjoner
D. WSDL beskrivelse av SOAP Web API
Tabelloversikt
A-1. Felter pr. låner
B-1. Lånere med flere lånerkort
C-1. Funksjoner i webservice

Kapittel 1. Innledning

Systemleverandørene har satt ned en gruppe som har til oppgave å utvikle et sentralt lånerregister for personlige lånere i Norge. Gruppen består av:

Felles lånernummer for personlige lånere vil ha mange fordeler framfor dagens system med et lokalt lånerregister pr. bibliotek.

  1. Lånerne vil kunne låne i alle bibliotek i hele landet med et lånernummer.

  2. Bibliotekene vil til enhver tid kunne ha oppdatert adresseinformasjon om lånerne. Dette sikrer at purrebrev ol. kommer fram til riktig person. Dette sparer bibliotekene for arbeid med gjenfinning av lånere.

  3. I et framtidig "sømløst" biblioteknorge vil disse lånernumrene kunne brukes til f.eks. å sende fjernlån direkte til lånerne, uten å gå via lånerens "hjemmebibliotek".

Vi har delt løsningen i to deler. Først et system for å lagre opplysninger på låneren og tildele lånernummer, programvare og databasedelen. Den andre delen er spørsmålet om lånerkort og maskinvare.

Systemleverandørgruppa har funnet at det er mulig å skille innføringen av lånerkort og programvaredelen. På denne måten kan de enkelte bibliotek, evt. regioner med bibliotek, beholde ansvaret for lånerkortet. Informasjonen i lånerkortet må følge beskrivelsen som er gitt her.

Løsningen er bare tenkt å omfatte personlige lånere. Opplysninger om purringer, gebyr, svartelisting osv. er ikke tenkt å ligge i det sentrale lånerregisteret. Det er fortsatt opp til hvert enkelt bibliotek å avklare lånernes lokale låneforhold.

Se Tillegg B for statistikk omkring hvor mange lånere som har lånerkort i flere bibliotek i dag.


Kapittel 2. Programvare og databasedelen


2.4. Protokoll for kommunikasjon mot basen

Vi ønsker å opprette dette som en webservice vha. SOAP og XML. Kommunikasjon over https (sikker http-protokoll).

Tegnsett som benyttes er UTF-8.


2.4.1. Funksjoner

Følgende funksjoner implementeres, se Tillegg D og Tillegg C

  • nyPost

  • hent

  • søk

  • søkEndret

  • endre

  • slett

Alle funksjonene returnerer med tidspunktet for når endringen skjedde. Dette tidspunktet kan så senere brukes til å kalle funksjonen soekEndret. Dette gjøres for å hindre problemer med synkronisering mellom lokal og sentral tid i de lokale databasene.

Endringer kan overføres batchvis f.eks. en gang i døgnet. Dersom en post i den sentrale basen en endret etter lokalt tidsmerke vil feil returneres. Det er da fare for at låneren f.eks. har bedt om endring fra et annet bibliotek som har gjort endringen sentralt først.


Kapittel 3. Folkeregisteret

En løsning med kobling mot folkeregisteret er vurdert. Adressen i folkeregisteret er imidlertid ikke alltid identisk med bostedsadressen. Spesielt gjelder dette f.eks. studenter. Folkeregisteret tar i tillegg betalt for oppslag mot sin base. Av disse grunnene har vi vurdert bruk av folkeregisteret som uaktuelt.


Kapittel 4. Personvern

Det er ønskelig å ha med personnummer i registeret. To viktige grunner til dette er:

Bruk av personnummer er juridisk sett mulig. I Systemleverandørenes møte 3/4/2002 var juridisk rådgiver i Datatilsynet, Audun Aanæs tilstede for å orientere om behandling av personopplysninger. Det ble der påpekt at personnnummer ikke er en sensitiv opplysning, jfr. personopplysningslovens §12: "Fødselsnummer og andre entydige identifikasjonsmidler kan bare nyttes i behandlingen når det er saklig behov for sikker identifisering og metoden er nødvendig for å oppnå slik identifisering".


Kapittel 5. Maskinvare og lånekort

I Danmark har man et felles kort som alle innbyggerne har/kan få. Dette kan brukes som lånerkort i bibliotekene. I Norge har vi ikke noe slikt felles kort som kan brukes til identifikasjon. Det har vært snakk om at bl.a. bankene og staten vil innføre et felles kort. Dersom det i framtiden kommer et slikt kort vil en unik identifikasjon fra dette kunne legges inn i databasen for oppslag.

For fullt ut å utnytte et felles lånerregister er det ønskelig at alle lånerne med tiden får tildelt et felles lånerkort som kan brukes over alt. Den store utfordringen i forbindelse med dette er at alle bibliotekene da må kunne lese lånerkortene med sitt leseutstyr.


Kapittel 6. Eksempler på praktisk bruk


Tillegg A. Databasen

Det må settes opp en database som kan lagre følgende opplysninger pr låner:


Tillegg B. Lånere med flere lånerkort

En gjennomgang av lånerregistrene i nærtliggende bibliotek viser følgende. Bibliotekene med felles lånernummer er unttatt, da disse vil kunne eksistere i alle fra før. Bare personlige lånere er regnet med. Sammenligningen er gjort ved å finne likt registrerte navn og fødselsdato.


Tillegg C. Funksjoner


Tillegg D. WSDL beskrivelse av SOAP Web API


	  <?xml version="1.0" encoding="UTF-8"?>

<!-- WSDL beskrivelse av SOAP Web API for Nasjonalt LÃ¥nernummer for bibliotekbrukere, "NL".
     Torstein Tjelta, Nasjonalbiblioteket, desember 2002.
     Sist endret 2003-03-05
 -->


<definitions name="NL"
             targetNamespace="http://nb.no/biblev/NL"
             xmlns:typens="http://nb.no/biblev/NL"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema"
             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
             xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
             xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
             xmlns="http://schemas.xmlsoap.org/wsdl/">

  <!-- Typer for sammensatte meldinger -->

  <types>
    <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" 
                targetNamespace="http://nb.no/biblev/NL">
            
      <!-- Resultat: for respons til hent, soek, soekEndret -->
      <xsd:complexType name="Resultat">
        <xsd:all>
          <xsd:element name="status"                         type="xsd:boolean"/>
          <xsd:element name="melding"                        type="xsd:string"/>
          <xsd:element name="antall_treff"                   type="xsd:int"/>
          <xsd:element name="antall_poster_returnert"        type="xsd:int"/>
          <xsd:element name="neste_indeks"                   type="xsd:int"/>
          <xsd:element name="respons_poster"                 type="typens:LaanerListe"/>
          <xsd:element name="server_tid"                     type="xsd:string"/>
        </xsd:all>
      </xsd:complexType>

      <!-- Svar: for respons til nyPost, endre, slett -->
      <xsd:complexType name="Svar">
        <xsd:all>
          <xsd:element name="status"                         type="xsd:boolean"/>
          <xsd:element name="melding"                        type="xsd:string"/>
          <xsd:element name="lnr"                            type="xsd:string"/>
          <xsd:element name="server_tid"                     type="xsd:string"/>
        </xsd:all>
      </xsd:complexType>

      <!-- Laaner: en post i databasen -->
      <xsd:complexType name="Laaner">
        <xsd:all>
          <xsd:element name="lnr"                            type="xsd:string"/>
          <xsd:element name="navn"                           type="xsd:string"/>
          <xsd:element name="adresse1"                       type="xsd:string"/>
          <xsd:element name="adresse2"                       type="xsd:string"/>
          <xsd:element name="postnr"                         type="xsd:string"/>
          <xsd:element name="sted"                           type="xsd:string"/>
          <xsd:element name="land"                           type="xsd:string"/>
          <xsd:element name="tlf_hjemme"                     type="xsd:string"/>
          <xsd:element name="tlf_jobb"                       type="xsd:string"/>
          <xsd:element name="tlf_mobil"                      type="xsd:string"/>
          <xsd:element name="epost"                          type="xsd:string"/>
          <xsd:element name="prim_kontakt"                   type="xsd:string"/>
          <xsd:element name="fdato"                          type="xsd:string"/>
          <xsd:element name="personnr"                       type="xsd:string"/>
          <xsd:element name="pin"                            type="xsd:string"/>
          <xsd:element name="opprettet"                      type="xsd:string"/>
          <xsd:element name="opprettet_av"                   type="xsd:string"/>
          <xsd:element name="sist_endret"                    type="xsd:string"/>
          <xsd:element name="sist_endret_av"                 type="xsd:string"/>
        </xsd:all>
      </xsd:complexType>
  
      <xsd:complexType name="LaanerListe">
        <xsd:complexContent>
          <xsd:restriction base="soapenc:Array">
             <xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="typens:Laaner[]"/>
          </xsd:restriction>
        </xsd:complexContent>
      </xsd:complexType>

    </xsd:schema>
  </types> 

  <!-- Meldinger for Web API  -->
             
  <message name="nyPost">
    <part name="post"             type="typens:Laaner"/>
  </message>

  <message name="nyPostResponse">
    <part name="return"           type="typens:Svar"/>           
  </message>
             
  <message name="hent">
    <part name="lnr"              type="xsd:string"/>
  </message>

  <message name="hentResponse">
    <part name="return"           type="typens:Resultat"/>           
  </message>
             
  <message name="soek">
    <part name="navn"             type="xsd:string"/>
    <part name="fdato"            type="xsd:string"/>
    <part name="personnr"         type="xsd:string"/>
  </message>

  <message name="soekResponse">
    <part name="return"           type="typens:Resultat"/>           
  </message>
             
  <message name="soekEndret">
    <part name="tidspunkt"        type="xsd:string"/>
    <part name="max_antall"       type="xsd:int"/>
    <part name="start_indeks"     type="xsd:int"/>
  </message>

  <message name="soekEndretResponse">
    <part name="return"           type="typens:Resultat"/>           
  </message>
             
  <message name="endre">
    <part name="post"             type="typens:Laaner"/>
  </message>

  <message name="endreResponse">
    <part name="return"           type="typens:Svar"/>           
  </message>
             
  <message name="slett">
    <part name="lnr"              type="xsd:string"/>
  </message>

  <message name="slettResponse">
    <part name="return"           type="typens:Svar"/>           
  </message>

  <!-- Port for Web API -->

  <portType name="NLPort">

    <operation name="nyPost">
      <input message="typens:nyPost"/>
      <output message="typens:nyPostResponse"/>
    </operation>

    <operation name="hent">
      <input message="typens:hent"/>
      <output message="typens:hentResponse"/>
    </operation>

    <operation name="soek">
      <input message="typens:soek"/>
      <output message="typens:soekResponse"/>
    </operation>

    <operation name="soekEndret">
      <input message="typens:soekEndret"/>
      <output message="typens:soekEndretResponse"/>
    </operation>

    <operation name="endre">
      <input message="typens:endre"/>
      <output message="typens:endreResponse"/>
    </operation>

    <operation name="slett">
      <input message="typens:slett"/>
      <output message="typens:slettResponse"/>
    </operation>

  </portType>


  <!-- Binding for Web API - RPC, SOAP over HTTP -->

  <binding name="NLBinding" type="typens:NLPort">
    <soap:binding style="rpc"
                  transport="http://schemas.xmlsoap.org/soap/http"/>

    <operation name="nyPost">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="encoded"
                   namespace="http://nb.no/biblev/NL"
                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
        <soap:body use="encoded"
                   namespace="http://nb.no/biblev/NL"
                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
    </operation>

    <operation name="hent">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="encoded"
                   namespace="http://nb.no/biblev/NL"
                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
        <soap:body use="encoded"
                   namespace="http://nb.no/biblev/NL"
                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
    </operation>

    <operation name="soek">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="encoded"
                   namespace="http://nb.no/biblev/NL"
                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
        <soap:body use="encoded"
                   namespace="http://nb.no/biblev/NL"
                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
    </operation>

    <operation name="soekEndret">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="encoded"
                   namespace="http://nb.no/biblev/NL"
                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
        <soap:body use="encoded"
                   namespace="http://nb.no/biblev/NL"
                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
    </operation>

    <operation name="endre">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="encoded"
                   namespace="http://nb.no/biblev/NL"
                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
        <soap:body use="encoded"
                   namespace="http://nb.no/biblev/NL"
                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
    </operation>
	
    <operation name="slett">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="encoded"
                   namespace="http://nb.no/biblev/NL"
                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
        <soap:body use="encoded"
                   namespace="http://nb.no/biblev/NL"
                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
    </operation>

  </binding>

  <!-- Endpoint for Web API -->
  <service name="NLService">
    <port name="NLPort" binding="typens:NLBinding">
      <!-- Midlertidig adresse for testing -->
      <soap:address location="http://www.nb.no:9000/cgi-bin/test/biblev_flbb.cgi"/> 
    </port>
  </service>

</definitions>