<?php
header("Content-Type: text/plain");
mb_internal_encoding('utf-8');

/*  Программа для расчета зарплаты сотрудников международной динамично развивающейся компании «Вектор»
    Объекты в PHP, часть 2
 */ 


class Employee             
{
    public $norm = 40;          // недельная норма рабочих часов
    public $name;               // фамилия-имя
    public $rate;               // часовая ставка (сколько он получает тугриков за час работы)
    public $hours = array();    // массив, содержащий отработанные часы по неделям

    
     public function __construct($name, $rate)
    {
        // задаем имя и часовую ставку
        $this->name = $name;
        $this->rate = $rate;
    }

    /* Считает общее число отработанных часов */
    public function getTotalHoursWorked()
    {
        // Просто складываем значения часов в массиве
        return array_sum($this->hours);
    }
    
    /* Считает число часов переработки */
    public function getOvertimeHours() {
        $totalOvertimeHours=0;
        $overtimeHours=0;
        foreach ($this->hours as $week) {
            if ($week > $this->norm) {
                $overtimeHours = $week - $this->norm;
            } 
                $totalOvertimeHours += $overtimeHours;
        }
        return $totalOvertimeHours;
    }

    /* Считает зарплату */
    public function getSalary()
    {
        // Получаем число отработанных часов
        $totalHours = $this->getTotalHoursWorked();
        $overtimeHours = $this->getOvertimeHours();
        // и умножаем на часовую ставку
        $salary = (($totalHours - $overtimeHours) * $this->rate)+($overtimeHours * $this->rate * 2);
        return $salary;
    }
    
    /* Выводит короткое имя */
    public function getShortName() {
         $shortName = preg_replace ("/(\\w*)(\\s+)(\\w)(\\w*)/u", "$1 $3.", $this->name);
         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);  // Петр взял отгул и потому отработал меньше часов, 

// Компания
class Company {
    public $name = "";
    public $employees = array();    // Работники
    public $totalHours = 0;         // Всего часов для всех работников
    public $totalSalary = 0;        // Всего бананов выплачено
    public $totalOvertime = 0;      // Всего переработки
    
    public function __construct ($name) {
        $this->$name = $name;
    }
    
    // Добавление работника
    public function setEmployee ($employee) {
        $this->employees[] = $employee;
    }
    
    // Расчет часов работы для всех работников
    public function getTotalHours () {
        foreach ($this->employees as $employee) {
            $this->totalHours += $employee->getTotalHoursWorked();
        }
        return $this->totalHours;
    }
    
    // Расчет оплаты для всех работников
    public function getTotalSalary () {
        foreach ($this->employees as $employee) {
            $this->totalSalary += $employee->getSalary();
        }
        return $this->totalSalary;
    }
    
    // Расчет часов переработки для всех работников
    public function getTotalOvertime () {
        foreach ($this->employees as $employee) {
            $this->totalOvertime += $employee->getOvertimeHours();
        }
        return $this->totalOvertime;
    }    
}

$company = new Company("Vector");

// Добавляем работников в компанию
$company->setEmployee($ivan);
$company->setEmployee($peter);

// Ширина колонок
$col1 = 30;
$col2 = 8;
$col3 = 15;
$col4 = 8;
$col5 = 8;

// Добавление пробелов слева
function padLeft($string, $length) {
    $string = str_repeat(" ", $length-mb_strlen($string)) . $string;
    return $string;
}

// Добавление пробелов справа
function padRight($string, $length) {
    $string .= str_repeat(" ", $length-mb_strlen($string));
    return $string;
}

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

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

// Итого
echo padRight("Всего:", $col1) .
     padLeft($company->getTotalHours(), $col2) . 
     padLeft($company->getTotalOvertime(), $col3) .
     padLeft("", $col4) . 
     padLeft($company->getTotalSalary(), $col5) . "\n\n";

?>