Rozwiązanie do zadania z tematu 16 (nr PESEL)


<?php
//nie ma sprawdzania poprawności cyfry kontrolnej
class Pesel {
    private $pesel;

    public function __construct($pesel){
        $this->pesel = $pesel;
    }
    
    public function validatePesel(){
        $isValid = true;
        if(!is_numeric($this->pesel)) {
            echo "Podaj same liczby.<br>";
            $isValid = false;
        }
        elseif(strlen($this->pesel)!=11) {
            echo "Wprowadź dokładnie 11 liczb.<br>";
            $isValid = false;
        }
        elseif(!$this->checkControlDigit()) {
            echo "Niepoprawna cyfra kontrolna<br>";
            $isValid = false;
        }
        return $isValid;
    }

    public function checkControlDigit(){
        // Tablica wag
        $weights = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3];

        // Oblicz sumę ważoną pierwszych 10 cyfr PESEL
        $sum = 0;
        for ($i = 0; $i < 10; $i++) {
            $digit = (int)$this->pesel[$i];
            $weight = $weights[$i];
            $product = $digit * $weight;

            // Dodaj ostatnią cyfrę wyniku mnożenia do sumy
            $sum += $product % 10;
        }

        // Oblicz cyfrę kontrolną
        $controlDigitCalculated = (10 - ($sum % 10)) % 10;
        
        // Pobierz faktyczną cyfrę kontrolną z PESEL
        $controlDigitActual = (int)$this->pesel[10];
        
        // Porównaj obliczoną cyfrę kontrolną z rzeczywistą
        return $controlDigitCalculated === $controlDigitActual;
    }

    public function decodePesel(){
        $year = (int)substr($this->pesel, 0,2);
        $month = (int)substr($this->pesel, 2,2);
        $day = (int)substr($this->pesel, 4,2);

        $gender = (int)$this->pesel[9] % 2 == 0 ? "Kobieta urodzona w " : "Mężczyzna urodzony w ";

        if($month>12){            
            $year = 2000 + $year;
            $month = $month - 20;
        }else{
            $year = 1900 + $year;
        }

        return [
            'year' => $year,
            'month' => $month,
            'day' => $day,
            'gender' => $gender
        ];
    }

    public function formatOutput(){
        $data = $this->decodePesel();
        $week_day = date('l', mktime(0,0,0,$data['month'],$data['day'],$data['year']));
        $pl_days = [
            'Monday' => 'poniedziałek',
            'Tuesday' => 'wtorek',
            'Wednesday' => 'środę',
            'Thursday' => 'czwartek',
            'Friday' => 'piątek',
            'Saturday' => 'sobotę'
        ];
        $pl_months = ['stycznia', 'lutego', 'marca', 'kwietnia', 'maja', 'czerwca', 'lipca', 'sierpnia', 'września', 'października', 'listopada', 'grudnia'];
        $month_index = $data['month']-1;

        $sek_now = time();
        $sek_birthday = mktime(0,0,0,$data['month'],$data['day'],date('Y'));
        $sec_to = $sek_birthday-$sek_now;
        if($sec_to<0){
            $sek_birthday = mktime(0,0,0,$data['month'],$data['day'],date('Y')+1);
        }
        $sec_to = $sek_birthday-$sek_now;
        $minutes_to = round($sec_to / 60); 
        $hours_to = round($minutes_to / 60); 
        $days_to = round($hours_to / 24); 

        echo "{$data['gender']} {$pl_days[$week_day]} {$data['day']}go {$pl_months[$month_index]} {$data['year']} roku. Do urodzin pozostało: $days_to dni, czyli $hours_to godzin, czyli $minutes_to minut, czyli $sec_to sekund.";
    }
}

$obiekt1 = new Pesel('tu wprowadź pesel');// przykład poprawnego - 02070803628 / przykład błędnej cyfry kontrolnej - 02070803629
if ($obiekt1->validatePesel()) {
    $obiekt1->formatOutput();
}