Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Validacija PIB-a

[es] :: PostgreSQL :: Validacija PIB-a

[ Pregleda: 9632 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
*.tippnet.co.yu.

Sajt: www.baze-podataka.net


+4 Profil

icon Validacija PIB-a26.06.2006. u 20:58 - pre 173 meseci
Verovatno vam se desavalo u praksi da morate/zelite proveriti ispravnost PIB-a nekog pravnog lica.

Evo PostgreSQL funkcija koja proverava ispravnost unetog PIB-a.
Code:

CREATE OR REPLACE FUNCTION proveri_pib (pib varchar) RETURNS smallint AS
$body$

--
-- Funkcija 'proveri_pib' proverava ispravnost prosledjenog PIB-a
--   - pib: poreski identifikacioni broj u formatu NNNNNNNNK
--       N = cifra
--       K = kontrolna cifra
--   - Rezultat:
--       1 = ako je pib ispravan,
--       0 = ako pib nije ispravan.
--

DECLARE

  i     SMALLINT;
  cifra SMALLINT;
  saldo SMALLINT;

BEGIN

  IF (pib IS NULL) OR (length(pib) <> 9) THEN

    -- odbacivanje ocigledno losih pib-ova

    RETURN 0;

  ELSE

    -- pib je ispravne duzine te se pristupa racunanju kontrolne cifre

    saldo = 0;

    FOR i IN 1 .. 8 LOOP
      saldo = saldo + CAST(substring(pib from i for 1) AS SMALLINT);
      IF saldo > 10 THEN saldo = saldo - 10; END IF;
      saldo = 2 * saldo;
      IF saldo > 10 THEN saldo = saldo - 11; END IF;
    END LOOP;

    cifra = 11 - saldo;
    IF cifra > 10 THEN cifra = 0; END IF;

    -- proveri kontrolnu cifru

    IF cifra = CAST(substring(pib from 9 for 1) AS SMALLINT) THEN
      RETURN 1;
    ELSE
      RETURN 0;
    END IF;

  END IF;

END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;


Primer koriscenja ove funkcije.

Napravicemo tabelu 'partneri' koja ce izmedju ostalih atributa imati i atribut 'pib_partnera'. Nad ovom tabelom cemo postaviti CHECK CONSTRAINT koji nece dozvoliti unos neispravnog PIB-a.
Code:

CREATE TABLE partneri(

  sifra_partnera CHAR(5)     NOT NULL,
  pib_partnera   CHAR(9)     NOT NULL,
  naziv_partnera VARCHAR(50) NOT NULL,
  
  CONSTRAINT sifra_partnera PRIMARY KEY (sifra_partnera),
  CONSTRAINT ispravan_pib   CHECK (proveri_pib(pib_partnera) = 1)
  
);


Ispravnost svega cemo proveriti pomocu podataka koji sadrze ispravne PIB-ove.
Code:

INSERT INTO partneri (sifra_partnera, pib_partnera, naziv_partnera)
VALUES ('00001', '100837287', 'Vinoprodukt-Coka doo');

INSERT INTO partneri (sifra_partnera, pib_partnera, naziv_partnera)
VALUES ('00002', '104256433', 'Zlatibo2r Voda doo');

COMMIT;

Ovi INSERT-i su prosli bez problema.

Takodje cemo pokusati da unesemo i jedan neispravan PIB
Code:

INSERT INTO partneri (sifra_partnera, pib_partnera, naziv_partnera)
VALUES ('00003', '100000111', 'Delyug ad');

COMMIT;

Ovaj INSERT je prijavio gresku 'new row for relation "partneri" violates check constraint "ispravan_pib"' jer je PIB Delyug-a 100000112, a ne 100000111.

"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
 
Odgovor na temu

CandyMan

Član broj: 3420
Poruke: 147



+49 Profil

icon Re: Validacija PIB-a17.08.2006. u 08:22 - pre 171 meseci
Nije baš tako...
Fizička lica takođe imaju svoj PIB koji je dužine 13 - JMBG.
Često se sreću u praksi poslovni partneri fizička lica koji npr. prodaju svoje intelektualne usluge i koje je potrebno voditi u sistemu i čuvati njihov PIB.
Takođe nedostaje provera da li se PIB sastoji samo od cifara.

Pozdrav
Nisam ni znao da znam dok nisam prob'o!
 
Odgovor na temu

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
*.suonline.net.

Sajt: www.baze-podataka.net


+4 Profil

icon Re: Validacija PIB-a17.08.2006. u 11:47 - pre 171 meseci
Citat:
CandyMan: Fizička lica takođe imaju svoj PIB koji je dužine 13 - JMBG.

Tacno.

Tabela 'partneri' je data samo kao demonstracija upotrebe funkcije za proveru PIB-a, bez ulaska u problematiku fizickih/pravnih lica, ino partnera, itd.


Citat:
CandyMan: Takođe nedostaje provera da li se PIB sastoji samo od cifara.

U komentaru funkcije je navedeno da se funkciji kao ulazni parametar prosledjuje PIB u obliku 'NNNNNNNNK', N = cifra, K= kontrolna cifra. Dakle funkcija trazi da se upotrebljava sa parametrom 'pib' koji se sastoji samo od cifara! Ipak, funkcija se zaista mora maksimalno obezbediti od losih ulaznih parametara.


Umesto slabijeg uslova
Code:
(pib IS NULL) OR (length(pib) <> 9)

koji propusta ne-cifre, stavicemo jaci uslov koji propusta samo PIB koji se sastoji od 9 cifara
Code:
(pib IS NULL) OR (pib !~ '[[:digit:]]{9}')

te funkcija sada izgleda
Code:

CREATE OR REPLACE FUNCTION "public"."proveri_pib" (pib varchar) RETURNS smallint AS
$body$
--
-- Funkcija 'proveri_pib' proverava ispravnost prosledjenog PIB-a
--   - pib: poreski identifikacioni broj u formatu NNNNNNNNK
--       N = cifra
--       K = kontrolna cifra
--   - Rezultat:
--       1 = ako je pib ispravan,
--       0 = ako pib nije ispravan.
--

DECLARE

  i     SMALLINT;
  cifra SMALLINT;
  saldo SMALLINT;

BEGIN

  IF (pib IS NULL) OR (pib !~ '[[:digit:]]{9}') THEN

    -- odbacivanje ocigledno losih pib-ova

    RETURN 0;

  ELSE

    -- pib je ispravne duzine te se pristupa racunanju kontrolne cifre

    saldo = 0;

    FOR i IN 1 .. 8 LOOP
      saldo = saldo + CAST(substring(pib from i for 1) AS SMALLINT);
      IF saldo > 10 THEN saldo = saldo - 10; END IF;
      saldo = 2 * saldo;
      IF saldo > 10 THEN saldo = saldo - 11; END IF;
    END LOOP;

    cifra = 11 - saldo;
    IF cifra > 10 THEN cifra = 0; END IF;

    -- proveri kontrolnu cifru

    IF cifra = CAST(substring(pib from 9 for 1) AS SMALLINT) THEN
      RETURN 1;
    ELSE
      RETURN 0;
    END IF;

  END IF;

END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;


@CandyMan: Hvala na konstruktivnoj zamerci, koja je dovela do otpornije funkcije.
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
 
Odgovor na temu

gosha
Zemun

Član broj: 2384
Poruke: 589
*.dynamic.sbb.co.yu.



+40 Profil

icon Re: Validacija PIB-a17.08.2006. u 14:54 - pre 171 meseci
Citat:
CandyMan: Nije baš tako...
Fizička lica takođe imaju svoj PIB koji je dužine 13 - JMBG.
Često se sreću u praksi poslovni partneri fizička lica koji npr. prodaju svoje intelektualne usluge i koje je potrebno voditi u sistemu i čuvati njihov PIB.
Takođe nedostaje provera da li se PIB sastoji samo od cifara.

Pozdrav


PIB i JMBG nije isto niti tje ikada biti isto. Cak je u nekom zakonu bio rok do kada sva fizicka lica moraju otvoriti PIB kod poreske uprave.
I oni koji rade sa JMBG-om treba da vode racuna da postoje MB koji u sebi imaju pogresan kontrolni broj.
Takav JMBG moze da se koristi ali ne prolazi kontrolu, tako da u programima treba samo upozoriti operatera da je JMBG pogresan, a ne zabraniti unos istog.

Pozdrav Gosha.
JokeJunky :)

Mrzim sublimirane marketinske poruke.
 
Odgovor na temu

_deran_

Član broj: 69493
Poruke: 233
*.suonline.net.



+1 Profil

icon Re: Validacija PIB-a18.08.2006. u 14:53 - pre 171 meseci
Onda ako je duzina 9 neka proverava PIB a ako je 13 neka proverava JMBG. Moze i da vrati sta je proverio (0-neispravno, 1-pib, 2-jmbg).
 
Odgovor na temu

milivoye
milivoye

Član broj: 28289
Poruke: 36
80.93.254.*



Profil

icon Re: Validacija PIB-a24.12.2008. u 15:24 - pre 143 meseci
Mislim da postupak ne funkcioniše na PIB koji se završavaju sa 0 (npr.: 104027360, 102524400, 105068730, 102115810)
Proverite, molim Vas, da li grešim.

Pozdrav!
 
Odgovor na temu

milivoye
milivoye

Član broj: 28289
Poruke: 36
80.93.254.*



Profil

icon Re: Validacija PIB-a24.12.2008. u 15:34 - pre 143 meseci
Mislim da je problem u sledećoj liniji:
Code:
IF cifra > 10 THEN cifra = 0; END IF;


tj. da je ispravno sledeće:
Code:
IF cifra >= 10 THEN cifra = 0; END IF;


Pozdrav!
 
Odgovor na temu

[es] :: PostgreSQL :: Validacija PIB-a

[ Pregleda: 9632 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.