torsdag 15 oktober 2009

DDS: Programmera med personnummer, del 2

Det är flera som frågat när del två av mitt bloggande om personnummer i IT-system kommer. Förra bloggposten avslutades med att vi fått in ett personnummer innehållande ett 'Y' och jag gav mig på jakt efter sanningen. Kunde svenskar ha personnummer med bokstäver?

Vem bryr sig?
Varför grotta ner sig i formatet på personnummer? Jo, det är ju just sånt här vi försöker lösa när vi bygger system. Det ska fungera för verksamheten, gå att underhålla och vara säkert. Då måste centrala begrepp redas ut och modelleras rätt i koden.

Vad säger Wikipedia?
Jag började där vi alla börjar när vi har fått ett problem på halsen -- Google :). Wikipedia dyker alltid upp i sökträffarna och de har bra info om personnummer.

Svenska personnummer är hårt reglerade av Folkbokföringslagen §18 och Skatteverket. Så här ligger det till (Å=år, M=månad, D=dag, F=födelsenummer, K=kontrollsiffra):

ÅÅMMDD-FFFK - till och med det år personen fyller 99 år
ÅÅMMDD+FFFK - från och med det år personen fyller 100 år

FFF är udda för män, jämn för kvinnor. Om det inte längre finns något FFF att tilldela för ett visst datum så får man ett personnummer med ett närliggande datum i samma månad.

I datorsystem formateras personnummer som ÅÅÅÅMMDDFFFK -- alltså fyra siffror i årtalet och inget skiljetecken. De två första siffrorna är inte del av det egentliga personnumret och ska därför inte vara med i beräkningen av kontrollsiffran.

Samordningsnummer tilldelas personer som inte är eller har varit folkbokförda i Sverige. De fungerar precis som personnummer men man adderar 60 till dagen, dvs DD är mellan 61 och 91.

Vad gav Google mer?
Wikipedia sa tyvärr inget om bokstäver i svenska personnummer. Några sökträffar senare hittade jag Socialstyrelsens termbank, uppgifter om svenska biobanker och diverse RIV-dokument (Regelverk för Interoperabilitet inom Vård och omsorg). Det spräckte direkt mitt tidsestimat på arbetsuppgiften. Tydligen finns också ...
  • Reservnummer
  • Katastrofnummer
  • Tvillingnummer
  • Försöksperson-id
OMG! Hur såg alla dessa nummer ut och vilka av dem förväntades vi hantera?

Vad säger Skatteverket?
Det var dags att lämna tangentbordet och plocka upp telefonen. Skatteverket var ofta refererade på nätet så jag började där. Växeln slussade mig till en expert som i sin tur slussade mig till überexperten på svenska personnummer -- Selimovic Fahrudin. Han slängde in ytterligare en nummertyp i grytan -- GD-nummer -- och redde sen ut en del:

Personnummer har ett fast format och Skatteverket ser till att det inte slarvas på den fronten. Så dyker det upp några bokstäver i ett svenskt personnummer så är det fel.

Samordningsnummer tilldelas av Skatteverket som på begäran av en myndighet men de har bara funnits sedan år 2000. Innan dess fick samma personer istället så kallat Tilldelat personnummer eller TP-nummer. Men det får inte finnas några bokstäver där heller.

GD-nummer tilldelas av Skatteverket till personer som äger fastigheter i Sverige men inte har något personnummer (t ex inte bor här). Jag fick ringa X gånger till Bolagsverket och sen tillbaka till Skatteverket innan jag fick tydlig information om dem. GD stod tidigare för Gemensamma distriktet och fungerade som en "virtuell kommun" i Stockholm. Numer kan man tillhöra Stockholm eller Malmö och 'GD' står inte för något speciellt. Skattesatsen i GD är 25%.

Bolagsverket har ett gäng dokument som säger att GD-nummer är "ett juridiskt nummer där månad är större än 1, t ex 3020002568". Det är fel. GD-nummer är en löpnummerserie som börjar på "3020" och var i oktober 2009 uppe i 3022xxxxxx. Det har jag också fått bekräftat från Bolagsverket. Hur som helst -- inga bokstäver där heller.

Selimovic ansåg att det kunde finnas två rimliga förklaringar till vårt 'Y' i patientens personnummer. Antingen är det ett finskt personnummer eller så är det ett reservnummer.

Finska personnummer
Tillbaka till Wikipedia som mycket riktigt säger att finska personnummer (egentligen personbeteckning) har antingen en siffra eller en bokstav mellan a och y som kontrolltecken. Patienten kunde alltså vara finsk!

Reservnummer
Reservnummer används huvudsakligen för att kunna koppla ihop patient och vårddokumentation när personnummer eller samordningsnummer saknas eller är okänt. Patienter som behöver någon form av reservnummer är nyfödda, utländska medborgare (arbetande eller turister), asylsökande, medvetslösa patienter, förvirrade patienter med flera.

Det är Socialstyrelsen som har hand om reservnummer så det fick bli ett samtal till dem. Där fick jag till slut tag på Leif Forsberg på Patientregistret som är expert på personnummer i sjukvården. Han berättade att reservnummer tyvärr inte har ett fastlagt format utan att Socialstyrelsen endast gått ut med en rekommendation. De rekommenderar ett korrekt födelsedatum samt minst en bokstav i de fyra sista siffrorna för att man inte ska råka skapa ett befintligt personnummer. Det skulle alltså kunna förklara vår mystiske patient!

Men som utvecklare går det ju inte att programmera utifrån en rekommendation. Jag ville veta hur det verkligen såg ut. Den vänlige Leif erbjöd sig då att göra en statistisk körning på hur reservnumren ser ut. Han hittade tre olika varianter av reservnummer i patientregistret för 2008:
  • Ca 12 000 reservnummer hade en eller flera bokstäver i de fyra sista fälten och korrekt födelsedatum
  • Ca 10 000 reservnummer hade ett nummer som börjar med 50-99 och resten är ett löpnummer av olika sort
  • Ca 3 000 reservnummer var bara ett löpnummer
Vår patient skulle alltså kunna ha ett reservnummer.

Katastrofnummer, tvillingnummer, försöksperson-id?
Alla de andra numren -- katastrofnummer, tvillingnummer och försöksperson-id -- verkar bara vara alternativa benämningar på reservnummer.

Lösning på problemet
När vi kommit så här långt kunde vi konstatera att vi sannolikt inte behövde hantera finska personnummer men eventuellt behövde hantera reservnummer som tydligen inte hade något fastlagt format.

Då kom lösningen -- datakällan meddelade att de inte hade några patienter med annat än siffror i personnumret i databasen. Vi riskerade därmed inte att stänga ute någon med reservnummer eftersom reservnummer inte finns i den aktuella databasen :).

Konklusion
Person-id-begreppet är tydligen inte så enkelt som i högskolans programmeringsuppgifter. Luhn-algoritmen är kul att implementera men verkligheten är ett sammelsurium av strikta regler, rekommendationer, synonyma begrepp, gamla begrepp och hundratals administrativa system.


Jag har uppdaterat svenska Wikipedia med det mesta av det jag kom fram till.

Lycka till där ute!

1 kommentar:

Mattias Amnefelt sa...

Tack för en givande post. Inom högskolan har vi också egengenererade personnummer men vi verkar ha standardiserat på en bokstav (eller ibland annat tecken, t.ex. *) som 7:e tecken i personnummret följt av ett löpnummer.