Wednesday, November 12, 2008

Validacija po modulu 11

Jeste li znali da svaki matični broj fizičkih i pravnih lica mora zadovoljiti ispravnost "po modulu 11" ?!Na net - u sam uspjela pronaći opis pravila za validaciju, koje se koristi u našoj zemlji, ali i zemljama u okruženju ( http://hr.wikipedia.org/wiki/Matični_broj_građana). Međutim, nisam uspjela pronaći čak ni približno riješen problem u nekom od programskih jezika. Zato sam odlučila da isti riješim, za početak, u PL\SQL - u, a zatim i u Java - i.

Slijedi rješenje u PL\SQL - u:

1. Funkcija za ispitivanje validnosti:


function validacijaPoModulu11(MB varchar2) return boolean is
rezultat integer;
ostatak integer;
razlika integer;
praviMB varchar2(13);
ind boolean;
begin

if length(MB) <= 13 then

if length(MB) = 13 then

rezultat := to_number(substr(MB,1,1)) * 7 + to_number(substr(MB,2,1)) * 6 + to_number(substr(MB,3,1)) * 5 + to_number(substr(MB,4,1)) * 4 + to_number(substr(MB,5,1)) * 3 + to_number(substr(MB,6,1)) * 2 + to_number(substr(MB,7,1)) * 7 + to_number(substr(MB,8,1)) * 6 + to_number(substr(MB,9,1)) * 5 + to_number(substr(MB,10,1)) * 4 + to_number(substr(MB,11,1)) * 3 + to_number(substr(MB,12,1)) * 2;
ostatak := mod(rezultat,11);
razlika := 11 - ostatak;

if ostatak = 1 then
ind := false;
end if;

if ostatak = 0 then
if to_number(substr(MB,13,1)) <> 0 then
ind := false;
else
ind := true;
end if;
end if;

if (ostatak > 1 and ostatak < 11) then
if to_number(substr(MB,13,1)) <> razlika then
ind := false;
else
ind := true;
end if;
end if;

end if;

if length(MB) = 8 then

rezultat := to_number(substr(MB,1,1)) * 8 + to_number(substr(MB,2,1)) * 7 + to_number(substr(MB,3,1)) * 6 + to_number(substr(MB,4,1)) * 5 + to_number(substr(MB,5,1)) * 4 + to_number(substr(MB,6,1)) * 3 + to_number(substr(MB,7,1)) * 2;
ostatak := mod(rezultat,11);
razlika := 11 - ostatak;

if ostatak = 1 then
if to_number(substr(MB,8,1)) <> 0 then
ind := false;
else
ind := true;
end if;
end if;

if ostatak = 0 then
ind := false;
end if;

if (ostatak > 1 and ostatak < 11) then
if to_number(substr(MB,8,1)) <> razlika then
ind := false;
else
ind := true;
end if;
end if;

end if;


else
ind := false;
end if;

return ind;

end validacijaPoModulu11;