Walidacja NIP-u

Poprawne NIPy

5261040828  ✓ (poprawna suma kontrolna)
1234563218  ✓ (poprawna suma kontrolna)
7010416109  ✓ (poprawna suma kontrolna)
5261040567  ✓ (poprawna suma kontrolna)

Ministerstwo Finansów: 5260250274


Funkcja generująca poprawny NIP

function generateValidNIP(): string 
{
    // Wagi dla 9 pierwszych cyfr
    $weights = [6, 5, 7, 2, 3, 4, 5, 6, 7];
    
    // Generuj 9 losowych cyfr
    $digits = [];
    for ($i = 0; $i < 9; $i++) {
        $digits[] = rand(0, 9);
    }
    
    // Oblicz sumę kontrolną
    $sum = 0;
    for ($i = 0; $i < 9; $i++) {
        $sum += $digits[$i] * $weights[$i];
    }
    
    $checksum = $sum % 11;
    
    // Jeśli suma kontrolna = 10, generuj ponownie
    if ($checksum == 10) {
        return generateValidNIP();
    }
    
    // Dodaj cyfrę kontrolną
    $digits[] = $checksum;
    
    return implode('', $digits);
}

// Przykład użycia:
$validNIP = generateValidNIP();
echo $validNIP; // np. 5261040828

Walidacja NIP-u

function validateNIP(string $nip): bool 
{
    // Usuń ewentualne myślniki
    $nip = str_replace('-', '', $nip);
    
    // Sprawdź długość
    if (strlen($nip) !== 10 || !ctype_digit($nip)) {
        return false;
    }
    
    $weights = [6, 5, 7, 2, 3, 4, 5, 6, 7];
    $sum = 0;
    
    for ($i = 0; $i < 9; $i++) {
        $sum += (int)$nip[$i] * $weights[$i];
    }
    
    $checksum = $sum % 11;
    
    return $checksum == 10 ? false : $checksum == (int)$nip[9];
}

// Test:
var_dump(validateNIP('0987654321')); // false ❌
var_dump(validateNIP('5261040828')); // true