wdrożenia PrestaShop

Walidacja NIP

  • 4 Odpowiedzi
  • 14574 Wyświetleń

0 użytkowników i 1 Gość przegląda ten wątek.

*

Offline iss

  • Nowy
  • *
  • 6
  • 0
Walidacja NIP
« dnia: Listopad 03, 2010, 03:00:38 pm »
Choć Presta ma możliwość aktywowania pola NIP dla danego kraju, to niestety mechanizm walidacji nie przyjmuje naszych polskich NIPów. Nie znalazłem zadowalającego rozwiązania tego problemu, więc wykombinowałem sam.

W załączniku znajduje się diff uwzględniający nasze NIPy.
Walidacja została zrobiona na szybko i nie jest zbyt wyrafinowana. Sprawdzenie obejmuje usunięcie myślników, sprawdzenie czy zostały same cyfry i czy jest ich 10.

Nie gwarantuję, że działa bezbłędnie. Uwagi, poprawki, itp. mile widziane.

Aha, trzeba dopisać tłumaczenie w sekcji komunikatów błędów, bo nie ma w diffie
« Ostatnia zmiana: Listopad 03, 2010, 03:17:03 pm wysłana przez iss »

*

Offline Romek

  • Nowy
  • *
  • 4
  • 0
Odp: Walidacja NIP
« Odpowiedź #1 dnia: Grudzień 13, 2010, 02:30:10 pm »

Choć nie jestem fachowcem w RegExp  to wydaje mi się, że kod walidacji

Cytuj
if((!preg_match('/((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)/', $dni)) && (!preg_match('/^[0-9-]+$/', $dni)))

jest zbyt długi. 
RegExp uwzględnia warunki dla hiszpańskiego numeru dowodu osobistego zawierającego litery i cyfry, który jednocześnie pełni role polskiego NIPu, zarówno dla obywateli Hiszpanii jak i dla cudzoziemców.  Druga część (po &&) by chyba wystarczyła.

Mogę napisać rzeczywistą walidację NIPu z cyfrą kontrolną jeśli jest parę osób którym jest to potrzebne.

A tak naprawdę to w funkcji Validate trzeba zrobić wyraźny rozdział uzależniony od wybranego kraju.  Teraz tylko Spain wymaga podawania i walidacji ich NIPu.  W polskiej wersji przyjęto, że nie jest to konieczne - należy w bazie to włączyć ale być może pozostawić pole bez gwiazdki i go nie sprawdzać jeśli jest niewypełnione. 
Jak wynika z jakiegoś tekstu na forum, twórcy PrestaShop zbierają informacje o systemach podatkowych różnych krajów.  Podejrzewam, że po to by sprawę PESELi NIPów itp Identification number załatwić generalnie.

ISS  czy mógłbyś podać adres sklepu gdzie można sprawdzić jak twoja weryfikacja NIP działa?

*

Offline iss

  • Nowy
  • *
  • 6
  • 0
Odp: Walidacja NIP
« Odpowiedź #2 dnia: Grudzień 13, 2010, 03:00:25 pm »
Pierwsza część regexpa (ta przed &&) to oryginalny regexp, który sprawdza czy podany numer może być jednym z NIF, CIF lub NIE. Potem kolejne ify sprawdzają już który to konkretnie typ numeru i czy jest prawidłowy.

Nie chciało mi się kombinować jak zmienić ten przydługi regexp, żeby jeszcze nasz NIP łykał, więc tylko dopisałem do wszystkiego osobne sprawdzenie na NIP i skleiłem &&.

Ten wstępny regexp sprawdza czy wpisana wartość to wyłącznie cyfry i myślniki.
Następnie jak metoda isDni potraktuje pole swoimi ifami i nie dopasuje żadnego z DNI (NIF, CIF, NIE), to dochodzi do dopisanego przeze mnie ifa, który usuwa wszystko, co nie jest cyfrą i sprawdza czy zostało 10 cyfr.

NIPu nie trzeba włączać w bazie, można w zakładce Carriers -> Countries. Niestety niezależnie jaki kraj ma włączony NIP, zawsze stosowana jest walidacja wg hiszpańskich zasad.

Do testów musisz zaaplikować diffa na localhoscie, bo aktualnie nie dysponuję niczym szalejącym w sieci. Powinno działać przynajmniej z 1.3.2.3 i 1.3.3.0.

*

Offline Romek

  • Nowy
  • *
  • 4
  • 0
Odp: Walidacja NIP
« Odpowiedź #3 dnia: Grudzień 26, 2010, 01:24:18 am »
Witam,
 weryfikację polskiego NIP trzeba wykonać w pliku \classes\Validate.php  a konkretnie w funkcji isDni($dni).
 rozwiązanie jest prowizorką - wykorzystuję fakt że hiszpański numer DNI ma długość 9 znaków, w tym 8 cyfr i jedną literę, a polski numer NIP ma 10 cyfr.  Można więc w tej funkcji sprawdzać liczbę cyfr;  jeżeli jest ich 10 to przyjmujemy że to jest NIP i sprawdzamy jego cyfrę kontrolną. Jeżeli cyfr nie jest 10 to pozwalamy funkcji badać czy to jest prawidłowy hiszpański  DNI/NIF/CIF/NIE.

Poniżej treść wstawki kodu tuż poniżej komentarzy o Return code:

   $NIP = '';
   for($i=0;$i<strlen($dni);$i++)
     if ( ($dni[$i]>='0') && ($dni[$i]<='9') )
      $NIP = $NIP . $dni[$i];
   if(strlen($NIP)==10)
   {   $sum  = 0;
      for ( $i=0; $i< 9; ++$i )
         $sum += $NIP{$i} * substr('657234567', $i, 1);
      $CK = ($sum % 11) % 10;
      if ( $CK == $NIP{9} )
         return 1;
   }
/* poniżej oryginalna instrukcja sprawdzająca czy wpisano coś w to pole */
      if (!$dni)
         return 1;
      
pozdrawiam
Romek
PS.  Żeby to miało sens to polskie tłumaczenie w authentication.tpl  trzeba poprawić.  :)
  Górny napis NIP powinien brzmieć:  Numer identyfikacyjny
  A zamiast napisu PESEL powinien być NIP,
  a zamiast  DNI/NIF/NIE  można wstawić napis "10 cyfr"

  Można też oczywiście dodać następną walidację numeru REGON, jeśli to komu potrzebne

*

Offline Romek

  • Nowy
  • *
  • 4
  • 0
Odp: Walidacja NIP
« Odpowiedź #4 dnia: Grudzień 27, 2010, 03:06:37 pm »
Drobna korekta - skrócenie kodu i pozbycie się szczególnego przypadku złej weryfikacji.

 $NIP = '';
   for($i=0;$i<strlen($dni);$i++)
     if ( ($dni[$i]>='0') && ($dni[$i]<='9') ) $NIP = $NIP . $dni[$i];
   if(strlen($NIP)==10)
   {   $sum  = 0;
      for ( $i=0; $i< 9; $i++ )
         $sum += $NIP{$i} * substr('657234567', $i, 1);
      if ( ($sum % 11) == $NIP{9} )  return 1;
   }

Reszta bez zmian