Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 15

Funkcija za proveru JMBG-a u C#

public static JMBGInfo validateJMBG(string JMBG)


{
JMBGInfo response = new JMBGInfo();

response.response.hasData = true;
response.response.success = true;
response.response.error = new ErrorData();
if (JMBG.Length != 13)
{
response.response.error.message = "JMBG mora sadrati 13 brojeva";
response.response.success = false;
}
else
{
int tmpC;
for (int i = 0; i < 13; i++)
{
if (!int.TryParse(JMBG[i].ToString(), out tmpC))
{
response.response.error.message = "JMBG mora sadrati samo brojeve";
response.response.success = false;
i = 14;
}
}
if (response.response.success)
{
int[] cifre = new int[13];
int ostatak = 0;
DateTime dRodjenja = new DateTime();
for (int i = 0; i < 13; i++)
{
cifre[i] = int.Parse(JMBG[i].ToString());
}
ostatak = 11 - ((7 * (cifre[0] + cifre[6]) + 6 * (cifre[1] + cifre[7]) + 5 * (cifre[2] + cifre[8]) + 4 *
(cifre[3] + cifre[9]) + 3 * (cifre[4] + cifre[10]) + 2 * (cifre[5] + cifre[11])) % 11);

if (ostatak > 9)
{
ostatak = 0;
}
if (ostatak != cifre[12])
{
response.response.error.message = "JMBG nije proao proveru po modulu 13";
response.response.success = false;
}
else
{
int dan = int.Parse(JMBG.Substring(0, 2));
int mesec = int.Parse(JMBG.Substring(2, 2));
int godina = int.Parse(JMBG.Substring(4, 3));
if (godina > 500)
{
godina += 1000;
}
else
{
godina += 2000;
}
try
{
dRodjenja = new DateTime(godina, mesec, dan);
}
catch
{
response.response.error.message = "JMBG ne sadri ispravan datum roenja";
response.response.success = false;
}
response.dRodjenja = dRodjenja;
if (int.Parse(JMBG.Substring(9,3)) > 499)
{
response.pol = '';
}
else
{
response.pol = 'M';
}
}
}
}
return response;
}

JMBGInfo klasa:
public class JMBGInfo
{
public CommandResponse response = new CommandResponse();
public char pol;
public DateTime dRodjenja = new DateTime();
}

Procedura u T-SQL-u:
ALTER PROCEDURE [student].[validateJMB4student]
@sessionId char(36),
@JMB nvarchar(13),
@studentId INT = NULL

AS
BEGIN

SET NOCOUNT ON;

DECLARE @result TABLE(
datumRodjenja DATE,
warning VARCHAR(max)
)

DECLARE @varUserSession INT
SELECT @varUserSession = dbo.cpSession(@sessionId)
if (@varUserSession = 0) begin
raiserror('MSSQL >> Vrednost sessionId nije ispravna - AKCIJA SE
OTKAZUJE !',16,1) ;
return
END

DECLARE @c1 int
DECLARE @c2 int
DECLARE @c3 int
DECLARE @c4 int
DECLARE @c5 int
DECLARE @c6 int
DECLARE @c7 int
DECLARE @c8 int
DECLARE @c9 int
DECLARE @c10 int
DECLARE @c11 int
DECLARE @c12 int
DECLARE @k int
declare @res int
declare @ostatak INT

DECLARE @varDan CHAR(2)
DECLARE @varMesec CHAR(2)
DECLARE @varGodina CHAR(4)
DECLARE @varDatum DATE
DECLARE @varPoruka VARCHAR(max) = ''

begin try
set @c1=substring(@JMB,1,1)
set @c2=substring(@JMB,2,1)
set @c3=substring(@JMB,3,1)
set @c4=substring(@JMB,4,1)
set @c5=substring(@JMB,5,1)
set @c6=substring(@JMB,6,1)
set @c7=substring(@JMB,7,1)
set @c8=substring(@JMB,8,1)
set @c9=substring(@JMB,9,1)
set @c10=substring(@JMB,10,1)
set @c11=substring(@JMB,11,1)
set @c12=substring(@JMB,12,1)
set @k=substring(@JMB,13,1)
end try
begin catch
RAISERROR('JMB ne sme sadrati druge karaktere osim numerikih',16,1);
return
end CATCH

SET @varDan = SUBSTRING(@JMB,1,2)
SET @varMesec = SUBSTRING(@JMB,3,2)
SET @varGodina = CASE
WHEN @c5=9
THEN '1' + SUBSTRING(@JMB,5,3)
ELSE
'2' + SUBSTRING(@JMB,5,3)
END

BEGIN TRY
SELECT @varDatum = CAST(@varGodina+@varMesec+@varDan AS DATE)
END TRY
BEGIN CATCH
RAISERROR('JMB mora sadrati ispravan datum',16,1);
return
end CATCH


if(len(@JMB)<>13)
begin
RAISERROR('JMB mora biti dugaak 13 karaktera',16,1);
return
end

set @c1=7*@c1
set @c2=6*@c2
set @c3=5*@c3
set @c4=4*@c4
set @c5=3*@c5
set @c6=2*@c6
set @c7=7*@c7
set @c8=6*@c8
set @c9=5*@c9
set @c10=4*@c10
set @c11=3*@c11
set @c12=2*@c12

set @res=@c1+@c2+@c3+@c4+@c5+@c6+@c7+@c8+@c9+@c10+@c11+@c12

set @ostatak=@res % 11
set @ostatak=11-@ostatak


if(@ostatak=11) set @ostatak=0

if(@ostatak<>@k)
begin
RAISERROR('JMB nije proao proveru po modulu 13',16,1);
return
END

IF (EXISTS(SELECT * FROM student.student WHERE JMB = @JMB AND (@studentId IS NULL OR
studentId <> @studentId)))
BEGIN
SET @varPoruka = 'Pod unetim brojem je ve upisan student ' + (SELECT TOP 1 prezime
+ ' ' + ime + 'sa brojem indeksa ' + indeks FROM student.student WHERE JMB = @JMB AND (@studentId
IS NULL OR studentId <> @studentId))
END

INSERT INTO @result
( datumRodjenja, warning )
VALUES ( @varDatum, -- datumRodjenja - date
@varPoruka -- warning - varchar(max)
)
SELECT CONVERT(VARCHAR, datumRodjenja) AS datumRodjenja,
warning
FROM @result

END

Procedura za rangiranje studenata (tu je i izraunavanje broja bodova iz
srednje kole i na prijemnom):
USE [medicina]
GO
/****** Object: StoredProcedure [student].[generateRangListaKandidat] Script Date: 22.08.2014
9:34:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [student].[generateRangListaKandidat]
-- Add the parameters for the stored procedure here
@sessionId CHAR(36),
@upisniRok2skolskaGodinaId INT,
@studijskiProgramId INT = NULL
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

DECLARE @varUserSession INT
DECLARE @curKandidatId INT
DECLARE @curIme VARCHAR(50)
DECLARE @curPrezime VARCHAR(50)
DECLARE @curImeRoditelja VARCHAR(50)
DECLARE @curJmbg CHAR(13)
DECLARE @curSifra VARCHAR(30)
DECLARE @curStudijskiProgramId INT
DECLARE @curStudijskiProgramNaziv VARCHAR(50)
DECLARE @varUspehUkupno DECIMAL(5,2)
DECLARE @varUspehSrednjaSkola DECIMAL(4,2)
DECLARE @varUspehPrijemni DECIMAL(4,2)
DECLARE @varZadovoljenPrijemni BIT
DECLARE @varStatusKandidata TINYINT
DECLARE @curStudijskiProgram4rangiranjeId INT
DECLARE @curMestaBudzet TINYINT
DECLARE @curMestaSamofinansiranje TINYINT
DECLARE @curOdustao BIT
DECLARE @varPredmet1 VARCHAR(150)
DECLARE @varPredmet2 VARCHAR(150)
DECLARE @varPredmet1Bodovi DECIMAL(5,2)
DECLARE @varPredmet2Bodovi DECIMAL(5,2)
DECLARE @i INT = 0
DECLARE @tmpId INT
DECLARE @tmpBodovi DECIMAL(5,2)
DECLARE @tmpPrijemni DECIMAL(5,2)

DECLARE @result TABLE
(
kandidatId INT NULL,
ime VARCHAR(50) NULL,
prezime VARCHAR(50) NULL,
imeRoditelja VARCHAR(50) NULL,
jmbg CHAR(13) NULL,
sifra VARCHAR(30) NULL,
studijskiProgramId INT NULL,
nazivStudijskogPrograma VARCHAR(50) NULL,
uspehSrednjaSkola DECIMAL(4,2) NULL,
uspehPrijemni DECIMAL(4,2) NULL,
uspehUkupno DECIMAL(5,2) NULL,
zadovoljenPrijemni BIT NULL,
statusKandidata TINYINT NULL,
punNaziv VARCHAR(250) NULL,
predmet1 VARCHAR(150) NULL,
predmet1Bodovi DECIMAL(5,2),
predmet2 VARCHAR(150) NULL,
predmet2Bodovi DECIMAL(5,2) NULL,
odustao BIT
)

DECLARE @orderedList TABLE
(
kandidatId INT NULL,
ime VARCHAR(50) NULL,
prezime VARCHAR(50) NULL,
imeRoditelja VARCHAR(50) NULL,
jmbg CHAR(13) NULL,
sifra VARCHAR(30) NULL,
studijskiProgramId INT NULL,
nazivStudijskogPrograma VARCHAR(50) NULL,
uspehSrednjaSkola DECIMAL(4,2) NULL,
uspehPrijemni DECIMAL(4,2) NULL,
uspehUkupno DECIMAL(5,2) NULL,
zadovoljenPrijemni BIT NULL,
statusKandidata TINYINT NULL,
punNaziv VARCHAR(250) NULL,
predmet1 VARCHAR(150) NULL,
predmet1Bodovi DECIMAL(5,2),
predmet2 VARCHAR(150) NULL,
predmet2Bodovi DECIMAL(5,2) NULL,
odustao BIT
)

BEGIN TRY

SELECT @varUserSession = dbo.cpSession(@sessionId)
IF (@varUserSession = 0) BEGIN
RAISERROR('MSSQL >> Vrednost sessionId nije ispravna - AKCIJA SE OTKAZUJE
!',16,1);
RETURN
END

DECLARE curKandidatRangListaI CURSOR FAST_FORWARD FOR
SELECT k.kandidatId
,k.ime
,k.prezime
,k.imeRoditelja
,k.jmbg
,k.sifra
,k.studijskiProgramId
,sp.naziv AS nazivStudijskogPrograma
,k.odustao
FROM student.kandidat AS k
LEFT OUTER JOIN student.studijskiProgram AS sp ON k.studijskiProgramId =
sp.studijskiProgramId
WHERE k.upisniRok2skolskaGodinaId = @upisniRok2skolskaGodinaId
AND (@studijskiProgramId IS NULL OR k.studijskiProgramId =
@studijskiProgramId)
--AND k.odustao = 0
ORDER BY k.studijskiProgramId

OPEN curKandidatRangListaI

FETCH NEXT FROM curKandidatRangListaI INTO @curKandidatId

,@curIme

,@curPrezime

,@curImeRoditelja

,@curJmbg

,@curSifra

,@curStudijskiProgramId

,@curStudijskiProgramNaziv

,@curOdustao

WHILE @@FETCH_STATUS = 0 BEGIN
-- svaki put se bodovi za predmet1 i predmet2 postavljaju na 0
SELECT @varPredmet1 = 0, @varPredmet2 = 0, @varPredmet1Bodovi = 0,
@varPredmet2Bodovi = 0

-- uspeh koji je kandidat osvojio u srednjoj skoli
SELECT @varUspehSrednjaSkola = (student.kandidat.prosekI +
student.kandidat.prosekII + student.kandidat.prosekIII + student.kandidat.prosekIV) * 2
FROM student.kandidat WHERE student.kandidat.kandidatId = @curKandidatId

-- uspeh koji je kandidat osvojio na prijemnom
SELECT @varUspehPrijemni =
SUM(student.kandidat2predmet4prijemni.rezultat)
FROM student.kandidat2predmet4prijemni WHERE
student.kandidat2predmet4prijemni.kandidatId = @curKandidatId
IF(@varUspehPrijemni IS NULL)
SELECT @varUspehPrijemni = 0

-- ukupno bodova
SET @varUspehUkupno = @varUspehPrijemni + @varUspehSrednjaSkola

--provera da li je kandidat osvojio minimalno bodova na prijemnom iz svakog
predmeta
IF EXISTS(SELECT * FROM student.kandidat2predmet4prijemni AS k2p2p
LEFT OUTER JOIN student.predmet4prijemni AS p4p ON
k2p2p.predmet4prijemniId = p4p.predmet4prijemniId
WHERE k2p2p.rezultat < p4p.prag AND
k2p2p.kandidatId = @curKandidatId)
BEGIN
SET @varZadovoljenPrijemni = 0
END
ELSE
BEGIN
SET @varZadovoljenPrijemni = 1
END

-- na osnovu toga da li je kandidat presao prag za polaganje prijemnog postavlja
se status kandidata. 1-budzet,
-- 2-samofinansiranje, 3-van kvote, 4-nije polozio prijemni, 5-nije pristupio ispitu
IF(@curOdustao = 1)
BEGIN
SET @varStatusKandidata = 5
END
ELSE IF(@varZadovoljenPrijemni = 0 OR @varUspehPrijemni = 0)
BEGIN
SET @varStatusKandidata = 4
END
ELSE
BEGIN
SET @varStatusKandidata = 2
END

-- podaci o predmetima sa primenog
SELECT @varPredmet1 = p4p.naziv + ':' + CONVERT(VARCHAR(15),
k2p4p.rezultat)
,@varPredmet1Bodovi = rezultat
FROM student.kandidat2predmet4prijemni AS k2p4p
LEFT OUTER JOIN student.predmet4prijemni AS p4p ON
k2p4p.predmet4prijemniId = p4p.predmet4prijemniId
LEFT OUTER JOIN student.predmet4prijemni2studijskiProgram AS p4p2sp ON
p4p.predmet4prijemniId = p4p2sp.predmet4prijemniId
LEFT OUTER JOIN student.studijskiProgram2upisniRok AS sp2ur ON
p4p2sp.studijskiProgram2upisniRokId = sp2ur.studijskiProgram2upisniRokId
WHERE k2p4p.kandidatId = @curKandidatId AND rbr = 1 AND
studijskiProgramId = @curStudijskiProgramId
--ORDER BY k2p4p.kandidat2predmet4prijemniId ASC

SELECT @varPredmet2 = p4p.naziv + ':' + CONVERT(VARCHAR(15),
k2p4p.rezultat)
,@varPredmet2Bodovi = rezultat
FROM student.kandidat2predmet4prijemni AS k2p4p
LEFT OUTER JOIN student.predmet4prijemni AS p4p ON
k2p4p.predmet4prijemniId = p4p.predmet4prijemniId
LEFT OUTER JOIN student.predmet4prijemni2studijskiProgram AS p4p2sp ON
p4p.predmet4prijemniId = p4p2sp.predmet4prijemniId
LEFT OUTER JOIN student.studijskiProgram2upisniRok AS sp2ur ON
p4p2sp.studijskiProgram2upisniRokId = sp2ur.studijskiProgram2upisniRokId
WHERE k2p4p.kandidatId = @curKandidatId AND rbr = 2 AND
studijskiProgramId = @curStudijskiProgramId
--ORDER BY k2p4p.kandidat2predmet4prijemniId DESC

INSERT INTO @result
( kandidatId
,ime
,prezime
,imeRoditelja
,jmbg
,sifra
,studijskiProgramId
,nazivStudijskogPrograma
,uspehSrednjaSkola
,uspehPrijemni
,uspehUkupno
,zadovoljenPrijemni
,statusKandidata
,punNaziv
,predmet1
,predmet2
,predmet1Bodovi
,predmet2Bodovi
,odustao
)
VALUES ( @curKandidatId, -- kandidatId - int
@curIme, -- ime - varchar(50)
@curPrezime, -- prezime - varchar(50)
@curImeRoditelja, -- imeRoditelja - varchar(50)
@curJmbg, -- jmbg - char(13)
@curSifra, -- sifra - varchar(30)
@curStudijskiProgramId, -- studijskiProgramId - int
@curStudijskiProgramNaziv, -- nazivStudijskogPrograma - varchar(50)
@varUspehSrednjaSkola, -- uspehSrednjaSkola - decimal
@varUspehPrijemni, -- uspehPrijemni - decimal
@varUspehUkupno, -- uspehUkupno - decimal
@varZadovoljenPrijemni, -- zadovoljenPrijemni - bit
@varStatusKandidata, -- statusKandidata - tinyint
@curPrezime + ' ' + @curIme + ' ' + @curSifra,
@varPredmet1,
@varPredmet2,
@varPredmet1Bodovi,
@varPredmet2Bodovi,
@curOdustao
)

FETCH NEXT FROM curKandidatRangListaI INTO @curKandidatId

,@curIme

,@curPrezime

,@curImeRoditelja

,@curJmbg

,@curSifra

,@curStudijskiProgramId

,@curStudijskiProgramNaziv

,@curOdustao

END

CLOSE curKandidatRangListaI
DEALLOCATE curKandidatRangListaI

INSERT INTO @orderedList
(kandidatId
,ime
,prezime
,imeRoditelja
,jmbg
,sifra
,studijskiProgramId
,nazivStudijskogPrograma
,uspehSrednjaSkola
,uspehPrijemni
,uspehUkupno
,zadovoljenPrijemni
,statusKandidata
,punNaziv
,predmet1
,predmet2
,predmet1Bodovi
,predmet2Bodovi
,odustao
)
SELECT [@result].kandidatId
,[@result].ime
,[@result].prezime
,[@result].imeRoditelja
,[@result].jmbg
,[@result].sifra
,[@result].studijskiProgramId
,[@result].nazivStudijskogPrograma
,[@result].uspehSrednjaSkola
,[@result].uspehPrijemni
,[@result].uspehUkupno
,[@result].zadovoljenPrijemni
,[@result].statusKandidata
,[@result].punNaziv
,[@result].predmet1
,[@result].predmet2
,[@result].predmet1Bodovi
,[@result].predmet2Bodovi
,[@result].odustao
FROM @result
ORDER BY [@result].studijskiProgramId, [@result].statusKandidata,
[@result].uspehUkupno DESC, [@result].uspehPrijemni DESC

-- prebacivanje na budzet kandidata
DECLARE curStudijskiProgram CURSOR FAST_FORWARD FOR
SELECT student.studijskiProgram2upisniRok.studijskiProgramId
,student.studijskiProgram2upisniRok.mestaBudzet
,student.studijskiProgram2upisniRok.mestaSamofinansiranje
FROM student.studijskiProgram2upisniRok

OPEN curStudijskiProgram

FETCH NEXT FROM curStudijskiProgram INTO @curStudijskiProgram4rangiranjeId

,@curMestaBudzet

,@curMestaSamofinansiranje

WHILE @@FETCH_STATUS = 0 BEGIN

SELECT @tmpBodovi = 0, @tmpPrijemni = 0

-- status kandidata se prebacuje na budzet (1) za sve studente koji se uklapaju u
kvotu
UPDATE TOP(@curMestaBudzet) @orderedList SET statusKandidata = 1
WHERE studijskiProgramId = @curStudijskiProgram4rangiranjeId AND
statusKandidata = 2

-- selektujemo najmanji broj bodova na budzetu kako bismo proverili da li ima
jos kandidata sa tim brojem bodova
SELECT TOP 1 @tmpBodovi = uspehUkupno, @tmpPrijemni = uspehPrijemni
FROM @orderedList
WHERE studijskiProgramId = @curStudijskiProgram4rangiranjeId AND
statusKandidata = 1
ORDER BY uspehUkupno DESC, uspehPrijemni DESC

-- sve kandidate koji imaju isti broj bodova kao poslednji na listi na budzetu
prebacujemo na budzet
UPDATE @orderedList SET statusKandidata = 1
WHERE studijskiProgramId = @curStudijskiProgram4rangiranjeId AND
statusKandidata = 2
AND uspehUkupno = @tmpBodovi AND uspehPrijemni >=
@tmpPrijemni

-- status kandidata se prebacuje na ispod crte (3) za sve studente koji se ne
uklapaju u kvotu
UPDATE @orderedList SET statusKandidata = 3
WHERE kandidatId NOT IN (SELECT TOP(@curMestaSamofinansiranje)
kandidatId FROM @orderedList
WHERE studijskiProgramId =
@curStudijskiProgram4rangiranjeId AND statusKandidata = 2)
AND studijskiProgramId = @curStudijskiProgram4rangiranjeId
AND statusKandidata = 2

-- selektujemo najmanji broj bodova na samofinansiranju kako bismo proverili
da li ima jos kandidata sa tim brojem bodova
SELECT TOP 1 @tmpBodovi = uspehUkupno, @tmpPrijemni = uspehPrijemni
FROM @orderedList
WHERE studijskiProgramId = @curStudijskiProgram4rangiranjeId AND
statusKandidata = 2
ORDER BY uspehUkupno DESC, uspehPrijemni DESC

-- sve kandidate koji imaju isti broj bodova kao poslednji na listi na
samofinansiranju prebacujemo na samofinansiranje
UPDATE @orderedList SET statusKandidata = 2
WHERE studijskiProgramId = @curStudijskiProgram4rangiranjeId AND
statusKandidata = 3
AND uspehUkupno = @tmpBodovi AND uspehPrijemni >=
@tmpPrijemni

FETCH NEXT FROM curStudijskiProgram INTO
@curStudijskiProgram4rangiranjeId

,@curMestaBudzet

,@curMestaSamofinansiranje

END

CLOSE curStudijskiProgram
DEALLOCATE curStudijskiProgram

END TRY
BEGIN CATCH

DECLARE @error VARCHAR(MAX)
SET @error = ERROR_MESSAGE()

EXEC sigurnost.log
@entity = 'kandidat', -- varchar(100)
@action = 'select', -- varchar(20)
@xml = 'generateRangListaKandidat', -- xml
@error = @error, -- varchar(max)
@userId = @varUserSession -- int

END CATCH

SELECT ROW_NUMBER() OVER (PARTITION BY [@orderedList].studijskiProgramId ORDER BY
[@orderedList].studijskiProgramId) AS redniBroj
,[@orderedList].kandidatId
,[@orderedList].ime
,[@orderedList].prezime
,[@orderedList].imeRoditelja
,[@orderedList].jmbg
,[@orderedList].sifra
,[@orderedList].studijskiProgramId
,[@orderedList].nazivStudijskogPrograma
,[@orderedList].uspehSrednjaSkola
,[@orderedList].uspehPrijemni
,[@orderedList].uspehUkupno
,[@orderedList].zadovoljenPrijemni
,[@orderedList].statusKandidata
,[@orderedList].punNaziv
,[@orderedList].predmet1
,[@orderedList].predmet2
,[@orderedList].predmet1Bodovi
,[@orderedList].predmet2Bodovi
,[@orderedList].odustao
FROM @orderedList
END

You might also like