<?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();
}