<?php

error_reporting(-1);

class Employee             
{
    public $name;               // имя-фамилия
    public $rate;               // часовая ставка (сколько он получает тугриков за час работы)
    public $hours = array();
    public $fullName; 
    
    public function __construct($name, $rate)
    {
        // задаем имя и часовую ставку
        $this->name = $name;
        $this->rate = $rate;
        $this->fullName = $this->name . " " . $this->getShortName();
    }

	public function getTotalHoursWorked()
    {
        // Просто складываем значения часов в массиве
        return array_sum($this->hours);
    }


    public function getNormalHoursWorked()
    {
    	$normal = 0;
    	foreach ($this->hours as $week) {
    		if ($week <= 40) {
    			$normal += $week;
    		}
    	}
        return $normal;
    }
        public function getOverHoursWorked()
    {
    	$overtime = 0;
    	foreach ($this->hours as $week) {
    		if ($week > 40) {
    			
    			$overtime += $week - 40;
    		}
    	}
        return $overtime;
    }

    /** Считает зарплату */
    public function getSalary()
    {
        // Получаем число отработанных часов
        $hoursNormal = $this->getNormalHoursWorked();
        // и умножаем на часовую ставку
        $salaryNormal = $hoursNormal * $this->rate;
        
        $hoursOver = $this->getOverHoursWorked();
        // и умножаем на часовую ставку
        $salaryOver = $hoursOver * $this->rate * 2;
        
        $salary = $salaryNormal + $salaryOver;
        
        return $salary;
    }
    
    public function getShortName()
    {
    	$names = explode(" ", $this->name);
		$initials = [];
		foreach ($names as $name) {
			$initials[] = mb_substr($name, 0, 1); 
		}   
		$shortName = implode(".", $initials);
		return "(" . $shortName. ".)";
    }
}


$ivan = new Employee("Иванов Иван", 10);
// name и rate заданы через конструктор, потому осталось лишь написать часы
$ivan->hours = array(40, 40, 40, 40);   // Иван работает по 40 часов в неделю


$peter = new Employee("Петров Петр", 8);
$peter->hours = array(40, 10, 40, 50);  // Петр взял отгул и потому отработал меньше часов, 

$vlad = new Employee("Владимир Владимирович", 9000);
$vlad->hours = [100,100,100,100];

$maria = new Employee("Мария Ивановна Петрова", 6);
$maria->hours = [60,10,20,30];


$employees = array($ivan, $peter, $vlad, $maria);

function padLeft ($string, $length) {
	$strLength = mb_strlen($string);
	$spases = array_fill(0, ($length - $strLength - 1), " ");
	$spases = implode($spases);
	$string = "|" . $spases . $string;
	return $string;
}

function padRight ($string, $length) {
	$strLength = mb_strlen($string);
	$spases = array_fill(0, ($length - $strLength), " ");
	$spases = implode($spases);
	$string .= $spases; 
	return $string;
}

// Ширина колонок
$col1 = 35;
$col2 = 12;
$col3 = 12;
$col4 = 12;

// Заголовок таблицы
echo padRight("Сотрудник", $col1) .
     padLeft("Часы", $col2) . 
     padLeft("Ставка", $col3) . 
     padLeft("Овертайм", $col3) .
     padLeft("З/п", $col4) . "\n\n";

// Сама таблица
foreach ($employees as $employee) {
    echo padRight($employee->fullName, $col1)  .
         padLeft($employee->getTotalHoursWorked(), $col2) . 
         padLeft($employee->rate, $col3) . 
         padLeft($employee->getOverHoursWorked(), $col3) .
         padLeft($employee->getSalary(), $col4) . "\n";
}

