Symfony i tworzenie nowego walidatora part. 1

Symfony ma bardzo bogaty zestaw walidatorów umożliwiających w bardzo łatwy sposób zaimplementować sprawdzanie formularzy.

Za pomocą poniższych wywołań możemy sprawdzić daty, typy znaków, poprawność maili, telefonów czy nawet poprawność podanego numeru NIP czy REGON (wyrażeniami regularnymi…):

  • sfValidatorString
  • sfValidatorRegex
  • sfValidatorEmail
  • sfValidatorUrl
  • sfValidatorInteger
  • sfValidatorNumber
  • sfValidatorBoolean
  • sfValidatorChoice
  • sfValidatorPass
  • sfValidatorCallback
  • sfValidatorDate
  • sfValidatorTime
  • sfValidatorDateTime
  • sfValidatorDateRange
  • sfValidatorFile
  • sfValidatorAnd
  • sfValidatorOr
  • sfValidatorSchema
  • sfValidatorSchemaCompare
  • sfValidatorSchemaFilter
  • sfValidatorI18nChoiceCountry
  • sfValidatorI18nChoiceLanguage
  • sfValidatorI18nTimezone
  • sfValidatorPropelChoice
  • sfValidatorPropelUnique
  • sfValidatorDoctrineChoice
  • sfValidatorDoctrineUnique

Lista gotowych komponentów jak widać jest naprawdę bogata i imponująca, do większości zastosowań nam w zupełności wystarczy

Co jednak zrobić gdy nasz klient postanowi wykonać znacznie bardziej rozbudowany validator niż tylko ten oparty na podstawowych, udostępnionych metodach? Cóż, musimy wziąć sprawę w swoje ręce, właściwie klawiaturę i zabrać się za robotę.

Jeśli chodzi o sposób sprawdzania poprawności REGON-u, oparłem się na opisanej w wikipedii, podobnie w przypadku NIP-u

POzwolę sobie na pełne przedruk tego co znalazłem na obydwa tematy w wikipedii:

REGON (akronim od Rejestr Gospodarki Narodowej) – Krajowy Rejestr Urzędowy Podmiotów Gospodarki Narodowej, rejestr statystyczny prowadzony przez Prezesa Głównego Urzędu Statystycznego. Pod pojęciem REGON-u rozumiany jest także numer REGON, czyli dziewięciocyfrowy numer statystyczny podmiotu gospodarczego w powyższym rejestrze.

Budowa numeru REGON

9-cyfrowy REGON

Początkowo REGON był 7-cyfrowy, a numery były nadawane centralnie. Później (ok. 1985-90 r.) rozszerzono REGON na 9 cyfr, gdzie regonom „starym” (7-cyfrowym) po prostu dołożono na początku 2 zera, a nowe zaczęto tworzyć wg klucza: 2 cyfry wyróżnika województwa + 6 cyfr „numeru seryjnego” + 1 cyfra kontrolna. Województw było 49 i miały nadane kolejne numery nieparzyste – od 01 (warszawskie) do 97 (zielonogórskie).

Suma kontrolna

Dziewiąta cyfra jest cyfrą kontrolną obliczaną następująco:

Wagi: 8 9 2 3 4 5 6 7

Pierwsze osiem cyfr REGON: 1 2 3 4 5 6 7 8

Wynik: 1*8 + 2*9 + 3*2 + 4*3 + 5*4 + 6*5 + 7*6 + 8*7 = 192

Cyfra kontrolna: 192 mod 11 = 5

Cały REGON: 123456785

W przypadku, gdy mod zwraca 10 za cyfrę kontrolną przyjmuje się 0.

14-cyfrowy REGON

Jednostkom organizacyjnym, które mają swoje siedziby w różnych województwach nadaje się REGON 14-cyfrowy (identyfikator jednostki lokalnej). Dziewięć pierwszych cyfr takiego numeru pokrywa się z REGON-em jednostki macierzystej. Cyfra kontrolna numeru obliczana jest tym samym sposobem, ale wagi są inne. Ponieważ jeden ze współczynników wagowych wynosi zero to weryfikacja „długiego” REGON-u wymaga weryfikacji 9 cyfr z wagami jak dla 9-cyfrowego numeru, a następnie weryfikacji długiego REGON-u z innymi wagami.

Suma kontrolna

W przypadku REGON-ów 14-cyfrowych cyfrę kontrolną oblicza się następująco:

Wagi: 2 4 8 5 0 9 7 3 6 1 2 4 8

Pierwsze trzynaście cyfr REGON: 1 2 3 4 5 6 7 8 5 1 2 3 4

Wynik: 1*2 + 2*4 + 3*8 + 4*5 + 5*0 + 6*9 + 7*7 + 8*3 + 5*6 + 1*1 + 2*2 + 3*4 + 4*8 = 260

Cyfra kontrolna: 260 mod 11 = 7

Cały REGON: 12345678512347

Jak widać podstawy są… :) Teraz warto by  to jakoś ładnie opakować w kod php który da się zaimpelemtować do aplikacji symfony…

Jak przebiega tworzenie nowego walidatora? Szczerze mówiąc pojęcia nie mam :), ale krok po kroku coś z tego może wyjdzie :)

Z pomocą przychodz i mi strona snippets symfony gdzie znaleźć można duży zbiór różnych mniej luib bardzie gotowych rozwiązań oraz rodzima strona phpedia gdzie świetnie opisana jest metoda zarówno walidacji regonu jak i walidacji NIP-u

Ciąg dalszy za chwil kilka… w następnym odcinku :)

Leave a Reply