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:
Lise Øvereng, Bibliotekservice As.
Jon Harald Berge, Bibliotekenes IT-senter.
Tore Morkemo, Bibliotek-Systemer As.
Torstein Tjelta, Nasjonalbiblioteket.
Felles lånernummer for personlige lånere vil ha mange fordeler framfor dagens system med et lokalt lånerregister pr. bibliotek.
Lånerne vil kunne låne i alle bibliotek i hele landet med et lånernummer.
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.
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.
Det sentrale lånerregisteret settes opp på en tjener som kan betjene bibliotekene. For autentisering se Seksjon 2.4.2. Nasjonalbiblioteket står for driften av tjeneren.
De lånerne som ønsker å ha et lånernummer som kan brukes i andre bibliotek henvender seg til et bibliotek som er knyttet opp mot den sentrale basen.
Det vil ikke bli foretatt noen initiell fylling av den sentrale basen. Det er opp til de enkelte lånerne om de vil ha lånernummer som kan benyttes i andre bibliotek. Av personvernmessige hensyn er dette den beste løsningen. Lånerne selv må kunne få bestemme om opplysninger om dem skal distribueres til andre bibliotek.
Alle bibliotekene som ønsker å bruke den sentrale basen vil normalt ha kopier av lånernes poster fra basen. I sin lokale base vil det da normalt finnes 2 lånernummer. Det primære nummeret vil som regel være det lokale lånernummeret. I den lokale lånerposten vil så nummeret i den sentrale basen ligge.
Dersom det gjøres endringer i lokal post vil de forskjellige biblioteksystemene kunne gjøre oppdateringer, umiddelbart eller batchvis, mot den sentrale basen. Se Seksjon 6.1, Seksjon 6.2 og Seksjon 6.3 for eksempler på bruk.
Det er opp til den lokale bibliotekar å identifisere og finne ut om det er riktig person som opprettes eller endres.
Endring av opplysninger om lånere i databasen gjøres ved et av de bibliotekene som har data fra den sentrale basen. Låneren kan henvende seg til hvilket som helst av de bibliotekene han er registrert i. I databasen er det tilstrekkelige kontroller på om endringer gjøres flere steder.
I f.eks. nattlige rutiner vil bibliotekene kunne laste ned endrede opplysninger om de felleslånerne de har data om lokalt. Man vil da få oppdatert sitt lokale lånerregister med riktige opplysninger om lånerne. Dette vil være rutiner tilsvarende de som i dag fungerer for de nasjonale biblioteknumrene.
Det oppfordres til at endringer som gjøres lokalt så raskt som mulig blir overført til den sentrale basen.
Vi ønsker å opprette dette som en webservice vha. SOAP og XML. Kommunikasjon over https (sikker http-protokoll).
Tegnsett som benyttes er UTF-8.
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.
Det lages et passord for alle norske bibliotek som har Biblioteknummer i Base bibliotek. Dette kan hvert enkelt bibliotek be om å få tilsendt. Dette passordet må benyttes for å få utført alle funksjoner i protokollen.
Det lages et web-grensesnitt hvor alle bibliotek med biblioteknummer i Base bibliotek kan be om å få tilsendt sitt passord. På forespørsel sendes passordet med epost til epost-adressen som er registrert i Base bibliotek.
Det lages en web-side hvor alle lånere, vha. PIN-kode, kan se hvilke opplysninger som er lagret om låneren. Fra denne siden bør også låneren kunne slette seg selv som låner i den sentrale basen. Låneren kan også selv endre sin PIN-kode på denne siden.
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.
Det er ønskelig å ha med personnummer i registeret. To viktige grunner til dette er:
Autentisering av låneren. Personnummer fra andre identifikasjonsbevis regnes som sikker autentisering.
Kommunikasjon mot evt. framtidig nasjonalt system med kort. Dersom bankene, posten eller andre oppretter nasjonale identifikasjonsbevis så er det sannsynlig at personnummer vil være med i dette. Dette kan så brukes til å knytte et slikt kort opp mot vårt register.
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".
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.
I dag bruker alle systemene strekkoder på lånerkortene Strekkodene er tildels forskjellige fra system til system, og det brukes forskjellig strekkodetyper. De typene som er i bruk er Interleaved 2 of 5, Code 128 og Code 39.
Innføringen av dette har noen sider som har større eller mindre økonomiske sider.
Det meste av strekkodelesere kan konfigureres til å lese strekkoder av flere typer. Dette krever omkonfigurering av leseutstyr.
De som ikke har strekkodelesere som kan omkonfigureres må bytte ut dette for å kunne lese kortene.
Innholdet i strekkodene må kodes likt. Det er også ønskelig at denne kodingen ikke er i konflikt med de "gamle" lånerkortene som bibliotekene bruker. De forskjellige systemleverandørene må gjøre sine system i stand til å lese kodene.
De nye lånerkortene må produseres.
Lånerkortene må overleveres/sendes til lånerne.
Lånerkort med magnetstripe eller smartkort vil medføre større utgifter for bibliotekene. Kort av denne typen er dyrere, og leseutstyret er dyrere.
Notat: Dette er en tenkt situasjon. Implementasjon av rutinene kan variere fra biblioteksystem til biblioteksystem.
En låner som allerede er registrert lokalt ønsker å få et lånernummer i den sentrale basen til bruk i andre bibliotek.
Låneren identifierer seg med sitt lokale lånernummer/lånerkort.
Det gjøres en oppkobling mot den sentrale basen.
Skrankepersonale søker etter låneren i den sentrale basen. Søk skjer vha. personnummer.
Dersom låneren ikke allerede finnes sentralt ber man om at denne opprettes. Et nytt lånernummer returneres.
Det sentrale lånernummeret lagres i det lokale lånerregisteret for evt. senere oppdateringer.
Låneren får sitt nye lånernummer som kan brukes i andre bibliotek.
Notat: Dette er en tenkt situasjon. Implementasjon av rutinene kan variere fra biblioteksystem til biblioteksystem.
En låner med lånernummer i den sentrale basen kommer for å låne i et bibliotek som ikke har denne låneren i sitt lokale register fra før.
Låner oppgir sitt nummer i den sentrale basen.
Skrankepersonale slår opp dette nummeret i den lokale basen for å forsikre seg om at en lokal registrering ikke finnes allerde.
Skrankepersonale slår opp nummeret i den sentrale basen og ber låneren om ytterligere identifikasjon.
Hvis man er sikker på at det er korrekt låner som har oppgitt nummeret, og låneren oppfyller alle andre krav til å bli låner i biblioteket, kopieres lånerposten inn i lokal base.
Notat: Dette er en tenkt situasjon. Implementasjon av rutinene kan variere fra biblioteksystem til biblioteksystem.
En låner med lånernummer i den sentrale varsler endring av f.eks. adresseopplysninger.
Låner varsler endring til et bibliotek hvor han er registrert lokalt. Her kan både lokalt og sentralt lånernummer oppgis.
Lokalt på biblioteket forsikrer man seg om at endringen skal utføres. Endringen utføres, foreløpig bare i lokal base.
I en nattlig rutine overføres alle endringer foretatt lokalt til den sentrale basen.
En annen nattlig rutine, som kjøres etter rutinen i punktet ovenfor, forespør den sentrale basen etter endringer foretatt siste døgn. Alle lånere som er registrert lokalt blir oppdatert med nye opplysninger i den lokale basen.
Det må settes opp en database som kan lagre følgende opplysninger pr låner:
Tabell A-1. Felter pr. låner
| Felt | Innhold | Maks. lengde | Påkrevet? | Kommentar |
|---|---|---|---|---|
| lnr | Løpenummer, 7 siffer + 1 sjekksiffer | Ja | Prefix på lånerkort skal være bokstavene NL, kun store bokstaver. | |
| Navn | Lånerens navn. Etternavn, fornavn | 100 | Ja | Tomt felt her betyr at låneren er slettet. |
| Adresselinje 1 | 100 | Ja | ||
| Adresselinje 2 | 100 | Nei | ||
| Postnummer | Ja | |||
| Sted | 100 | Ja | ||
| Land | Kode fra ISO 3166-1 | 2 | Ja | |
| Telefon hjemme | Bare tall, evt + forran for utenlandske | 20 | Nei | |
| Telefon jobb | Bare tall, evt + forran for utenlandske | 20 | Nei | |
| Telefon mobil | Bare tall, evt + forran for utenlandske | 20 | Nei | |
| epost-adresse | Lovlig epost-adresse | 100 | Nei | |
| primær kontakt | epost, brev eller sms | 10 | Nei | |
| Fødselsdato | YYYY-MM-DD | Ja | ||
| Personnummer | Bare tall | 5 | J | Se Kapittel 4. |
| PIN-kode | Bare tall | 4 | Nei | Til evt. bruk i automater ol. |
| Opprettet av | Biblioteknummer | 7 siffer | Ja | |
| Tidspunkt for opprettelse | Tidspunkt | dateTime | Ja | dateTime som beskrevet i ISO 8601. |
| Sist endret av | Biblioteknummer | 7 siffer | Nei | |
| Sist endret | tidspunkt | dateTime | Nei | dateTime som beskrevet i ISO 8601. |
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.
Tabell B-1. Lånere med flere lånerkort
| Bibliotek | Andel av lånere med 2 eller flere lånerkort blant disse bibliotekene |
|---|---|
| Deichman, Bærum, Asker | 4.5% |
| Porsgrunn, Skien, Bamble | 8.3% |
| Larvik, Sandefjord, Tønsberg, Horten | 6.3% |
| Hamar, Ringsaker, Lillehammer | 4.1% |
| Larvik, Sandefjord, Tønsberg, Horten, Porsgrunn, Skien, Bamble | 7.4% |
| Totalt alle bibliotekene ovenfor | 7.3% |
Tabell C-1. Funksjoner i webservice
| Funksjon | Argument | Retur | Kommentar |
|---|---|---|---|
| nyPost | post | Nytt lnr, el. feil | Dersom en tilsvarende post allerede finnes returneres feil.
|
| hent | lnr | Hele post, el. feil | Feil dersom lnr ikke finnes. |
| soek | navn, fødselsdato, personnummer | Alle poster som matcher, evt. ingen. Navn kan søkes med trunkeringstegn %. | |
| soekEndret | tidspunkt, maks_antall, start_nr. | Alle poster endret siden angitt tidspunkt. Returnerer maks_antall poster. | Denne er tenkt til batchvise oppdateringer i lokal base. |
| endre | post | Status ok eller feil. Ikke utfylte felter i posten ansees som sletting av innholdet i feltet. | |
| slett | lnr | Status ok eller feil | Feil hvis låner ikke fantes. Enhver låner bør til enhver tid kunne be om å bli slettet. Funksjonen sletter alle felter unntatt lånernummer, opprettet, opprettet_av, sist_endret og sist_endret_av. Lånernummeret bevareres for å hindre senere misbruk av nummer som ikke lenger er i bruk. |
<?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>