Ved folkeregisterloven i 1968 blev personnummeret – CPR-nummeret – indført og hver borger i landet tildelt en 10-cifret unik identifikation. Så unik, at borgeren tager det med sig i graven. Modsat f.eks. mobilnumre så genbruges personnumre ikke. CPR-nummeret var en snedig lille konstruktion, der både indeholdt oplysning om borgerens fødselsdata og køn. Hertil skruet samme på en sådan måde, at sidste ciffer ikke blot rummer oplysning om borgerens køn, men også tjener som kontrolciffer, så en modulus-11 kontrol kunne afgøre om CPR-nummeret var gyldigt og dermed sandsynligvis angivet korrekt. En ganske nyttig valideringsmulighed i de følgende årtiers computerprogrammer, der skulle styre borgerne via bl.a. personnummer.
Desværre havde de fremsynede kræfter overset den ikke helt uvæsentlige detalje, at befolkningstallet stiger og personnummeret i den oprindelige konstruktion kun gav plads til 270 mænd og 270 kvinder per fødselsdato. Det var ikke længere tilstrækkeligt, og derfor meddelte CPR-registret, at fra oktober 2007 kunne modulus-11 ikke længere anvendes ved validering af CPR-numre. Man begyndte fra samme dato af udstede CPR-numre med ”ugyldige” kontrolcifre og et stigende antal borgere må således livet igennem leve med et CPR-nummer, der ikke er Modulus-11 kompatibelt. De første år voldte det en del administrative problemer, da disse personer ikke kunne logges på systemer, der allerede havde implementeret Modulus-11 som validering. Det er den slags ting der sker, når virkeligheden ikke længere har den fornødne fleksibilitet til at tilpasse sig IT-systemer. Det sker med jævne mellemrum. Virkeligheden er ikke perfekt!
Menneskers forhold til deres
CPR-nummer er meget forskelligt. Nogle anser det som en hemmelighed, ikke flere
end nødvendigt skal have kendskab til, mens andre har et mere afslappet forhold
til det. I 1979 udgav Kim Larsen således et album, hvis titel slet og ret var
hans personnummer: ”231045-0637”.
Det er under visse omstændigheder muligt at få skiftet sit personnummer. Det
gælder f.eks. ofre for ID-tyveri og ved lov af 25. juni 2014 er det også blevet
muligt at få nyt CPR-nummer, hvis man oplever at tilhøre – eller identificerer
sig med – et andet køn, end det man er født som.
Udviklingen har således sat sit præg på det 50-årige nummersystem, men det ændrer jo ikke ved, at det skal fortsat skal indtastet i utallige sammenhænge og også valideres på bedst mulig måde.
Det er tilsyneladende ikke helt uproblematisk. F.eks. vil nogle gerne udfylde et CPR-felt med bindestreg, mens andre undlader det, og i mange tilfælde er man som bruger ikke helt sikker på, om systemet, man indtaster til, forventer det ene eller det andet – eller kan tage højde for begge dele.
Følgende fra en læge-booking portal er et typisk eksempel. Man indtaster de ønskede oplysninger og tager chancen med en bindestreg i CPR-numret, det går godt, lige indtal der trykkes på ”Send” hvor fejlmeldingen kommer, at CPR sørme skal være på 10 tegn, hvilket så må betyde, at bindestregen alligevel ikke skulle have været der. I mellemtiden er det indtastede nummer i sikkerheden tjeneste blevet forvandlet til ******** der gør det umuligt at fjerne stregen, og det er så bare forfra igen.

Det er mildest talt lidt bøvlet og andre siden forsøger da også på pædagogisk vis at afværge at brugeren kommer derud, med en længere forklaring på, hvorledes CPR-nummeret korrekt skal indtastes.

Jeg er stødt på online-forms, hvor der ligefrem kan downloades en pdf med instruks i korrekt udfyldning – herunder CPR-feltet

Værst er selvfølgelig de tilfælde, hvor brugeren får en fejlmelding på et korrekt CPR-nummer uden nærmere forklaring. Jeg vil tro kundesupporten har en del ældre medborgere i røret på den konto.

Hvor svært bør det være?
Det burde ikke volde den slags kvaler at formidle et CPR-nummer. I virkeligheden kan en streng med CPR-nummer valideres med et enkelt RegEx-mønster, der både tager inkluderer at brugeren kan have brugt bindestreg, mellemrum eller ingenting, og samtidig validerer dato og tager højde for skudår, 29. februar og andet godt fra havet.
Den anden del handler om at guide brugeren bedst muligt under indtastning, så han eller hun oplever, at der kun er den korrekte måde at gøre det på.
Der er ingen grund til at gå over åen efter vand, hvis man kan få en fadøl – og det er præcis hvad man får med det lille open-source plugin cleave.js. Det fylder ikke mere end det kan være i en håndtaske (< 20 Kb) og input-felter kan herefter med enkle midler skræddersyes efter behov.
npm install --save cleave.js
CDN: https://cdnjs.cloudflare.com/ajax/libs/cleave.js/1.5.0/cleave.min.js
GITHUB: https://github.com/nosir/cleave.js
I dette tilfælde vil det være optimalt at CPR-input tilrettelægges således, at feltet kun accepterer tal og at der efter 6 cifre automatisk sættes en bindestreg, hvorefter der accepteres fire yderligere tal. Det kan gøres med
var cleave = new Cleave('.cleaveinput', { numericOnly: true, delimiter: '-', blocks: [6, 4] });
Der er nu sikret en indtastning uden faldgruber, og det er så tid til at validere, hvad valideres kan, og give brugeren en tilbagemelding med det samme.
Hvis man har en af de dage, hvor man synes RegEx-metoden er for langhåret, så kan de første 6 cifre også valideres på en mere ordinær måde. Mærkeligt nok så ligger dato-validering ikke lige til højrebenet i javascript. Metoden er, at sætte dato-oplysningerne ind i et Date-objekt, og så efterfølgende teste, om det var noget den åd. Desværre er det heller ikke nok, da javascript på dato-området opererer med en alternativ begavelse:
Vi risikerer altså, at javascript godkender dato-angivelser, der ikke repræsenterer en gyldig dato. Jeg kan godt lide Eduardo Sganzeria’a enkle løsning. selv om den kræver lidt modifikation. Hvorfor gør tingene mere kompliceret end nødvendigt. Det handler blot om at tjekke, om den dato, der kommer ud er identisk med dén, der puttes ind:
function validDate(str) { var day = str.substring(0, 2); var month = str.substring(2, 4); var year = str.substring(4, 6); const date = new Date(`20${year}/${month}/${day}`); return (Boolean(+date) && date.getDate() == day) }
Gensyn med Modulus-11
Selv om Modulus-11 siden 2007 ikke har været en gyldig måde at afgøre på, om et CPR-nummer er korrekt indtastet, så er faktum stadig – og vil være det mange år endnu – at kun et lille mindretal har CPR-numre med ugyldig kontrolciffer.
Er der tale om en opsætning, der f.eks. kun skal bruges internt i en organisation kan det derfor være en nyttig vejledende information for indtasteren at få at vide, de enkelte gange det sker, at Modulus-11 ikke er opfyldt. Det giver muligheden for hurtigt at tjekke en ekstra gang, om der er tale om en indtastningsfejl.
Modulus-11 beregnes ved at multiplicere hver af de første ni cifre men henholdsvis: 4,3,2,7,6,5,4,3 og 2 og finde summen heraf. 11 minus den rest, som bliver tilbage ved at dividere summen med 11 udgør kontrolcifferet. Giver divisionen resten 1, kan det pågældende løbenummer (ciffer 7-9) ikke anvendes, fordi kontrolcifferet derved ville blive tocifret. I Javascript kan testen udføres på denne måde:
function modulus11(cpr) { var checksum = 0; for (i = 9; i > -1; i--) { checksum += (+cpr.charAt(i)) * ((i > 2) ? (10 - i) : (4 - i)); } if (checksum % 11 == 0) return true; }
Nu mangler blot at “hooke” det hele op med onKeyup, så det registreres hver gang et tal indtastes i feltet og evaluering og evt. svar til indtasteren kommer, så snart der er indtastet 10 cifre:
See the Pen CPR by Per Lindsø Larsen (@lindsoe) on CodePen.