fork download
  1. <?php
  2. //Убрал в функция createEmployee, padLeft, padRight - тайп-хинт
  3. //Для int и string, т.к. ideone считает их за объекты
  4.  
  5.  
  6. define("SMALL_COL", 7);
  7. define("MEDIUM_COL", 12);
  8. define("LARGE_COL", 20);
  9.  
  10. class Company
  11. {
  12. private $name;
  13. private $listOfDepatments;
  14.  
  15. public function __construct($name)
  16. {
  17. $this->name = $name;
  18. $this->listOfDepatments = array();
  19. }
  20.  
  21. public function __clone()
  22. {
  23. $countDepartment = $this->getCountDeparments();
  24. for ($i = 0; $i < $countDepartment; $i++) {
  25. $this->listOfDepatments[$i] = clone $this->listOfDepatments[$i];
  26. }
  27. }
  28.  
  29. /**
  30.   * Метод возвращающий имя компании
  31.   *
  32.   * @return string Имя компании
  33.   */
  34. public function getNameCompany()
  35. {
  36. return $this->name;
  37. }
  38.  
  39. /**
  40.   * Метод возвращающий количество департаментов
  41.   *
  42.   * @return integer Имя компании
  43.   */
  44. public function getCountDeparments()
  45. {
  46. return count($this->listOfDepatments);
  47. }
  48.  
  49. /**
  50.   * Метод добавляющий новый департамент в компанию
  51.   *
  52.   * @param Department $newDepartment Добавляемый департамент
  53.   * @return void
  54.   */
  55. public function addDepartmentToCompany(Department $newDepartment)
  56. {
  57. $this->listOfDepatments[] = $newDepartment;
  58. }
  59.  
  60. /**
  61.   * Метод возвращающий список департаментов
  62.   *
  63.   * @return array Массив департаментов
  64.   */
  65. public function getListOfDepartments()
  66. {
  67. return $this->listOfDepatments;
  68. }
  69. }
  70.  
  71. class Department
  72. {
  73. private $name;
  74. private $listOfEmployee;
  75.  
  76. public function __construct($name)
  77. {
  78. $this->name = $name;
  79. $this->listOfEmployee = array();
  80. }
  81.  
  82. public function __clone()
  83. {
  84. $countEmployee = $this->getCountEmployee();
  85. for ($i = 0; $i < $countEmployee; $i++) {
  86. $this->listOfEmployee[$i] = clone $this->listOfEmployee[$i];
  87. }
  88. }
  89.  
  90. /**
  91.   * Метод возвращающий имя департамента
  92.   *
  93.   * @return string Имя департамент
  94.   */
  95. public function getDepartmentName()
  96. {
  97. return $this->name;
  98. }
  99.  
  100. /**
  101.   * Метод возвращающий список сотрудников
  102.   *
  103.   * @return array Список сотрудников
  104.   */
  105. public function getListOfEmployee()
  106. {
  107. return $this->listOfEmployee;
  108. }
  109.  
  110. /**
  111.   * Метод изменяет список список
  112.   *
  113.   * @param array $listOfEmployee Новый список сотрудников
  114.   * @return void
  115.   */
  116. public function setListOfEmployee(array $listOfEmployee)
  117. {
  118. $this->listOfEmployee = $listOfEmployee;
  119. }
  120.  
  121. /**
  122.   * Метод добавляющий нового сотрудника
  123.   *
  124.   * $param Employee $newEmployee Новый сотрудник
  125.   * @return void
  126.   */
  127. public function addEmployeeToDepartment(Employee $newEmployee)
  128. {
  129. $this->listOfEmployee[] = $newEmployee;
  130. }
  131.  
  132. /**
  133.   * Метод возвращающий количество сотрудников
  134.   *
  135.   * @return integer Количество сотрудников
  136.   */
  137. public function getCountEmployee()
  138. {
  139. return count($this->listOfEmployee);
  140. }
  141.  
  142. /**
  143.   * Метод возвращающий зарплату всего департамента
  144.   *
  145.   * @return integer Зарплата департамента
  146.   */
  147. public function getTotalSalary()
  148. {
  149. $totalSalary = 0;
  150. foreach ($this->listOfEmployee as $employee) {
  151. $totalSalary += $employee->getSalary();
  152. }
  153. return $totalSalary;
  154. }
  155.  
  156. /**
  157.   * Метод возвращающий общее число наработанных страниц
  158.   *
  159.   * @return integer Количество страниц
  160.   */
  161. public function getTotalPages()
  162. {
  163. $totalPages = 0;
  164. foreach ($this->listOfEmployee as $employee) {
  165. $totalPages += $employee->getPages();
  166. }
  167. return $totalPages;
  168. }
  169.  
  170. /**
  171.   * Метод возвращающий общее число выпитых кружен
  172.   *
  173.   * @return integer Число выпитых кружек
  174.   */
  175. public function getTotalCups()
  176. {
  177. $totalCups = 0;
  178. foreach ($this->listOfEmployee as $employee) {
  179. $totalCups += $employee->getCupOfCoffee();
  180. }
  181. return $totalCups;
  182. }
  183.  
  184. /**
  185.   * Метод возвращает количество инженеров в департаменте
  186.   *
  187.   * @return integer Количество инженеров
  188.   */
  189. public function totalEngineer()
  190. {
  191. $result = 0;
  192. foreach ($this->listOfEmployee as $employee) {
  193. if ($employee->checkProffession('Engineer')) {
  194. $result++;
  195. }
  196. }
  197. return $result;
  198. }
  199.  
  200. /**
  201.   * Метод возвращает количество менеджеров в департаменте
  202.   *
  203.   * @return integer Количество менеджеров
  204.   */
  205. public function totalManager()
  206. {
  207. $result = 0;
  208. foreach ($this->listOfEmployee as $employee) {
  209. if ($employee->checkProffession('Manager')) {
  210. $result++;
  211. }
  212. }
  213. return $result;
  214. }
  215.  
  216. /**
  217.   * Метод возвращает руководителя департамента, если он существует, либо NULL
  218.   *
  219.   * @return Employee Сотрудник руководитель департамента
  220.   */
  221. public function findDirector()
  222. {
  223. $director = NULL;
  224. foreach ($this->listOfEmployee as $employee) {
  225. if ($employee->isDirector) {
  226. $director = $employee;
  227. break;
  228. }
  229. }
  230. return $director;
  231. }
  232. }
  233.  
  234. abstract class Employee
  235. {
  236. public $isDirector;
  237. protected $rank;
  238. protected $proffession;
  239. protected $salary;
  240. protected $pages;
  241. protected $cupOfCoffee;
  242.  
  243. public function __construct($rank, $isDirector = false)
  244. {
  245. $this->rank = $rank;
  246. $this->isDirector = $isDirector;
  247. $this->setSalary();
  248. $this->setPages();
  249. $this->setCupOfCoffee();
  250. $this->setProffession();
  251. }
  252.  
  253. abstract public function setSalary();
  254. abstract public function setPages();
  255. abstract public function setCupOfCoffee();
  256. abstract public function setProffession();
  257.  
  258. public function setRank($rank)
  259. {
  260. $this->rank = $rank;
  261. }
  262.  
  263. /**
  264.   * Метод возвращающий профессию сотрудника
  265.   *
  266.   * @return string Профессия сотрудника
  267.   */
  268. public function getEmployeeProffession()
  269. {
  270. return $this->proffession;
  271. }
  272.  
  273. /**
  274.   * Метод возвращающий ранг сотрудника
  275.   *
  276.   * @return integer Ранг сотрудника
  277.   */
  278. public function getEmployeeRank()
  279. {
  280. return $this->rank;
  281. }
  282.  
  283. /**
  284.   * Метод возвращающий зарплату сотрудника
  285.   *
  286.   * @return integer Зарплата сотрудника
  287.   */
  288. public function getSalary()
  289. {
  290. $totalSalary = $this->salary;
  291. if ($this->rank == 2) {
  292. $totalSalary *= 1.25;
  293. } elseif ($this->rank == 3) {
  294. $totalSalary *= 1.5;
  295. }
  296.  
  297. if ($this->isDirector) {
  298. $totalSalary *= 1.5;
  299. }
  300. return $totalSalary;
  301. }
  302.  
  303. /**
  304.   * Метод возвращающий количество наработанных страниц сотрудником
  305.   *
  306.   * @return integer Общее число страниц сотрудника
  307.   */
  308. public function getPages()
  309. {
  310. return ($this->isDirector ? 0 : $this->pages);
  311. }
  312.  
  313. /**
  314.   * Метод возвращающий количество выпитых кружек сотрудником
  315.   *
  316.   * @return integer Количество выпитых кружек
  317.   */
  318. public function getCupOfCoffee()
  319. {
  320. return ($this->isDirector ? ($this->cupOfCoffee * 2) : $this->cupOfCoffee);
  321. }
  322.  
  323. /**
  324.   * Метод проверяющий соответствие сотрудника заданной профессии
  325.   *
  326.   * @param string $proffession Заданная профессия
  327.   * @return boolean Соответствует ли сотрудник указанной профессии
  328.   */
  329. public function checkProffession($proffession) {
  330. return (static::class == $proffession) ? true : false;
  331. }
  332. }
  333.  
  334. class Manager extends Employee
  335. {
  336. public function setSalary($salary = 500)
  337. {
  338. $this->salary = $salary;
  339. }
  340.  
  341. public function setPages($pages = 200)
  342. {
  343. $this->pages = $pages;
  344. }
  345.  
  346. public function setCupOfCoffee($cups = 20)
  347. {
  348. $this->cupOfCoffee = $cups;
  349. }
  350.  
  351. public function setProffession()
  352. {
  353. $this->proffession = 'Менеджер';
  354. }
  355. }
  356.  
  357. class Marketer extends Employee
  358. {
  359. public function setSalary($salary = 400)
  360. {
  361. $this->salary = $salary;
  362. }
  363.  
  364. public function setPages($pages = 150)
  365. {
  366. $this->pages = $pages;
  367. }
  368.  
  369. public function setCupOfCoffee($cups = 15)
  370. {
  371. $this->cupOfCoffee = $cups;
  372. }
  373.  
  374. public function setProffession()
  375. {
  376. $this->proffession = 'Маркетолог';
  377. }
  378. }
  379.  
  380. class Engineer extends Employee
  381. {
  382. public function setSalary($salary = 200)
  383. {
  384. $this->salary = $salary;
  385. }
  386.  
  387. public function setPages()
  388. {
  389. $this->pages = 50;
  390. }
  391.  
  392. public function setCupOfCoffee()
  393. {
  394. $this->cupOfCoffee = 5;
  395. }
  396.  
  397. public function setProffession()
  398. {
  399. $this->proffession = 'Инженер';
  400. }
  401. }
  402.  
  403. class Analyst extends Employee
  404. {
  405. public function setSalary($salary = 800)
  406. {
  407. $this->salary = $salary;
  408. }
  409.  
  410. public function setPages($pages = 5)
  411. {
  412. $this->pages = $pages;
  413. }
  414.  
  415. public function setCupOfCoffee($cups = 50)
  416. {
  417. $this->cupOfCoffee = $cups;
  418. }
  419.  
  420. public function setProffession()
  421. {
  422. $this->proffession = 'Аналитик';
  423. }
  424. }
  425.  
  426. class CrisisCommittee
  427. {
  428. /**
  429.   * Метод "отдающий приказ" на увольнение инженеров в каждом департаменте
  430.   *
  431.   * @param Company $company Компания, в которой идет сокращение
  432.   * @return void
  433.   */
  434. //Дать приказ на увольнение инженеров в каждом департаменте
  435. public function reduceEngineer(Company $company)
  436. {
  437. $listOfDepatments = $company->getListOfDepartments();
  438. foreach ($listOfDepatments as $departament) {
  439. $this->reduceEngineerInDep($departament, 40);
  440. }
  441. }
  442.  
  443. /**
  444.   * Метод возвращающий список номеров сотрудников соответствующие указанной профессии
  445.   *
  446.   * @param array $listOfEmployee Список всех сотрудников
  447.   * @param string $proffession Профессия для фильтра
  448.   * @return array Список номеров нужных сотрудников
  449.   */
  450. public function getEmployeeByCondition(array $listOfEmployee, $proffession)
  451. {
  452. $result = array();
  453.  
  454. uasort($listOfEmployee, 'sortByRank');
  455. $countEmployee = count($listOfEmployee);
  456.  
  457. for ($i = 0; $i < $countEmployee; $i++) {
  458. if ($listOfEmployee[$i]->checkProffession($proffession) && (!$listOfEmployee[$i]->isDirector)) {
  459. $result[] = $i;
  460. }
  461. }
  462. return $result;
  463. }
  464.  
  465. /**
  466.   * Метод увольнения инженеров с наименьшим рангов и не являющихся руководителями
  467.   *
  468.   * @param Department $departament Департамент, в котором происходит увольнение
  469.   * @return void
  470.   */
  471. public function reduceEngineerInDep(Department $departament)
  472. {
  473. $listOfEmployee = $departament->getListOfEmployee();
  474. $listOfEngineers = $this->getEmployeeByCondition($listOfEmployee, 'Analyst');
  475.  
  476. $countEngineer = count($listOfEngineers);
  477. $engineerDelete = ceil(0.4 * $countEngineer);
  478. $listOfReduceEngineer = array_slice($listOfEngineers, 0, $engineerDelete);
  479.  
  480. foreach ($listOfReduceEngineer as $numberEngineer) {
  481. unset($listOfEmployee[$numberEngineer]);
  482. }
  483.  
  484. $departament->setListOfEmployee($listOfEmployee);
  485. }
  486.  
  487. /**
  488.   * Метод повышения зарплаты
  489.   *
  490.   * @param Department $departament Департамент, в котором происходит повышение
  491.   * @param string $proffession Профессия, которой повышают зарплату
  492.   * @return void
  493.   */
  494. public function raiseSalary(Department $departament, $proffession)
  495. {
  496. $listOfEmployee = $departament->getListOfEmployee();
  497. foreach ($listOfEmployee as $employee) {
  498. if ($employee->checkProffession($proffession)) {
  499. $employee->setSalary(1100);
  500. $employee->setCupOfCoffee(75);
  501. }
  502. }
  503. }
  504.  
  505. /**
  506.   * Метод "отдающий приказ" на повышение зарплаты аналитикам и повышении их в должности
  507.   * (вторая антикризисная мера)
  508.   *
  509.   * @param Company $company Компания
  510.   * @return integer Количество выпитых кружек
  511.   */
  512. public function raiseAnalytics(Company $company)
  513. {
  514. $listOfDepatments = $company->getListOfDepartments();
  515. foreach($listOfDepatments as $departament) {
  516. $this->raiseSalary($departament, "Analyst");
  517. $this->changeDirector($departament, "Analyst");
  518. }
  519. }
  520.  
  521. /**
  522.   * Метод поиска сотрудника с высшим рангом указанной профессии
  523.   *
  524.   * @param Department $departament Департамент, в котором идет поиск
  525.   * @param string $proffession Профессия для фильтра
  526.   * @return Employee | boolean
  527.   */
  528. public function findHighestRankInProffession(Department $departament, $proffession)
  529. {
  530. $rank = 0;
  531.  
  532. $listOfEmployee = $departament->getListOfEmployee();
  533. foreach ($listOfEmployee as $employee) {
  534. if (($employee->getEmployeeRank() > $rank) && ($employee->checkProffession($proffession))) {
  535. $analytics = $employee;
  536. $rank = $employee->getEmployeeRank();
  537. }
  538. }
  539.  
  540. return ($rank) ? $analytics : false;
  541. }
  542.  
  543. /**
  544.   * Метод смены руководителя департамента
  545.   *
  546.   * @param Department $departament Департамент, в котором происходит смена
  547.   * @param string $proffession Указывает, какая профессия должна быть у нового руководителя
  548.   * @return void
  549.   */
  550. public function changeDirector(Department $departament, $proffession)
  551. {
  552. $director = $departament->findDirector();
  553.  
  554. if (!$director) {
  555. echo "Не задан директор";
  556. exit();
  557. }
  558.  
  559. if (!$director->checkProffession('Analyst')) {
  560.  
  561. $highestAnalytics = $this->findHighestRankInProffession($departament, $proffession);
  562.  
  563. if ($highestAnalytics) {
  564. $highestAnalytics->isDirector = true;
  565. $director->isDirector = false;
  566. }
  567. }
  568. }
  569.  
  570. /**
  571.   * Метод "отдающий приказ" на повышение менеджеров в каждом департаменте
  572.   * (третий антикризисный план)
  573.   *
  574.   * @param Company $company Компания, в которой идет повышение
  575.   * @return void
  576.   */
  577. public function raiseManager(Company $company)
  578. {
  579. $listOfDepatments = $company->getListOfDepartments();
  580. foreach($listOfDepatments as $departament) {
  581. $this->raiseManagerInDep($departament, 50);
  582. }
  583. }
  584.  
  585. /**
  586.   * Метод повышающий ранг $percent процентам менеджерам
  587.   *
  588.   * @param Department $departament Департамент, в котором идет повышение
  589.   * @param int $percent Процент менеджеров, которым повышается ранг
  590.   * @return void
  591.   */
  592. public function raiseManagerInDep(Department $departament, $percent)
  593. {
  594. $countEmployee = $departament->getCountEmployee();
  595. $countManager = $departament->totalManager();
  596. $managerRaise = ceil(0.5 * $countManager);
  597.  
  598. $listOfEmployee = $departament->getListOfEmployee();
  599. for ($i = 0; $i < $countEmployee; $i++) {
  600. if ($managerRaise == 0) {
  601. break;
  602. }
  603. if ($listOfEmployee[$i]->checkProffession('Manager') && ($listOfEmployee[$i]->getEmployeeRank() != 3)) {
  604. $oldRank = $listOfEmployee[$i]->getEmployeeRank();
  605. $listOfEmployee[$i]->setRank($oldRank + 1);
  606. $managerRaise--;
  607. }
  608. }
  609. }
  610. }
  611.  
  612. /**
  613.   * Класс для создания отчета по компании
  614.   */
  615. class CompanyReport
  616. {
  617. public function printInfoAboutCompany(Company $company, $mssg = '')
  618. {
  619. $countDepartment = $company->getCountDeparments();
  620. $total = array('сотр' => 0, 'тугр' => 0, 'кофе' => 0, 'стр' => 0);
  621.  
  622. echo "\"{$company->getNameCompany()}\"\n";
  623. echo "{$mssg}\n";
  624. echo padRigth("Деп. ", LARGE_COL) . padLeft("сотр.", SMALL_COL) . padLeft("тугр.", MEDIUM_COL) .
  625. padLeft("кофе", SMALL_COL) . padLeft("стр.", MEDIUM_COL) . padLeft("тугр./стр.", LARGE_COL) . "\n";
  626. $listOfDepatments = $company->getListOfDepartments();
  627. foreach ($listOfDepatments as $departament) {
  628. echo padRigth($departament->getDepartmentName(), LARGE_COL) . padLeft($departament->getCountEmployee(), SMALL_COL) .
  629. padLeft($departament->getTotalSalary(), MEDIUM_COL) . padLeft($departament->getTotalCups(), SMALL_COL) .
  630. padLeft($departament->getTotalPages(), MEDIUM_COL) . padLeft($departament->getTotalSalary() / $departament->getTotalPages(), LARGE_COL) . "\n";
  631. $total['сотр'] += $departament->getCountEmployee();
  632. $total['тугр'] += $departament->getTotalSalary();
  633. $total['кофе'] += $departament->getTotalCups();
  634. $total['стр'] += $departament->getTotalPages();
  635. }
  636.  
  637. echo padRigth('Среднее', LARGE_COL) . padLeft($total['сотр'] / $countDepartment, SMALL_COL) .
  638. padLeft($total['тугр'] / $countDepartment, MEDIUM_COL) . padLeft($total['кофе'] / $countDepartment, SMALL_COL) .
  639. padLeft($total['стр'] / $countDepartment, MEDIUM_COL) . padLeft(($total['тугр'] / $total['стр']) / $countDepartment, LARGE_COL) . "\n";
  640. echo padRigth('Всего', LARGE_COL) . padLeft($total['сотр'], SMALL_COL) .
  641. padLeft($total['тугр'], MEDIUM_COL) . padLeft($total['кофе'], SMALL_COL) .
  642. padLeft($total['стр'], MEDIUM_COL) . padLeft($total['тугр'] / $total['стр'], LARGE_COL) . "\n";
  643. }
  644. }
  645.  
  646. function sortByRank($a, $b)
  647. {
  648. return ($a->getEmployeeRank() > $b->getEmployeeRank()) ? 1 : -1;
  649. }
  650.  
  651. function padLeft($text, $length)
  652. {
  653. if (mb_strlen($text) < $length) {
  654. $text = str_repeat(" ", $length - mb_strlen($text)) . $text;
  655. }
  656.  
  657. return $text;
  658. }
  659.  
  660. function padRigth($text, $length) {
  661. if (mb_strlen($text) < $length) {
  662. $text .= str_repeat(" ", $length - mb_strlen($text));
  663. }
  664.  
  665. return $text;
  666. }
  667.  
  668. /**
  669.   * Функция создания массива сотрудников
  670.   *
  671.   * @param string $message Строка вида:9xме1;3xмe2;2xмe3;2xмa1;1xмe2 (последний идет руководитель)
  672.   * @return array Список сотрудников
  673.   */
  674. function createEmployee($message)
  675. {
  676. $employee = array();
  677.  
  678. $people = explode(';', $message);
  679. $totalPeople = count($people);
  680.  
  681.  
  682. for ($i = 0; $i < $totalPeople; $i++) {
  683.  
  684. $matches = array();
  685. preg_match('/([0-9]+)x([а-яё]+)([0-9])/iu', $people[$i], $matches);
  686.  
  687. $countEmployee = (int) $matches[1];
  688. $proffession = $matches[2];
  689. $rank = (int) $matches[3];
  690.  
  691. $isDirector = ($i == ($totalPeople - 1)) ? true : false;
  692.  
  693. for ($j = 0; $j < $countEmployee; $j++ ) {
  694. switch ($proffession) {
  695. case "ме": $employee[] = new Manager($rank, $isDirector);
  696. break;
  697. case "ма": $employee[] = new Marketer($rank, $isDirector);
  698. break;
  699. case "ан": $employee[] = new Analyst($rank, $isDirector);
  700. break;
  701. case "ин": $employee[] = new Engineer($rank, $isDirector);
  702. break;
  703. default: echo "Проверьте входные данные! {$proffession}";
  704. exit();
  705. }
  706. }
  707. }
  708.  
  709. return $employee;
  710. }
  711.  
  712. /**
  713.   * Функция добавляет созданный список сотрудников в департамент
  714.   *
  715.   * @return void
  716.   */
  717. function addAllEmployeeToDepartment(array $employee, Department $departament)
  718. {
  719. $totalEmployee = count($employee);
  720.  
  721. for ($i = 0; $i < $totalEmployee; $i++) {
  722. $departament->addEmployeeToDepartment($employee[$i]);
  723. }
  724. }
  725.  
  726. function createCompany($procurementPeople, $salesPeople, $advertisingPeople, $logisticsPeople)
  727. {
  728. $vector = new Company('Вектор');
  729.  
  730. $procurementDepartment = new Department('закупок');
  731. $vector->addDepartmentToCompany($procurementDepartment);
  732.  
  733. $salesDepartament = new Department('продаж');
  734. $vector->addDepartmentToCompany($salesDepartament);
  735.  
  736. $advertisingDepartment = new Department('рекламы');
  737. $vector->addDepartmentToCompany($advertisingDepartment);
  738.  
  739. $logisticsDepartament = new Department('логистики');
  740. $vector->addDepartmentToCompany($logisticsDepartament);
  741.  
  742.  
  743. $procurementEmployee = array();
  744. $procurementEmployee = createEmployee($procurementPeople);
  745. addAllEmployeeToDepartment($procurementEmployee, $procurementDepartment);
  746.  
  747. $salesEmployee = array();
  748. $salesEmployee = createEmployee($salesPeople);
  749. addAllEmployeeToDepartment($salesEmployee, $salesDepartament);
  750.  
  751. $advertisingEmployee = array();
  752. $advertisingEmployee = createEmployee($advertisingPeople);
  753. addAllEmployeeToDepartment($advertisingEmployee, $advertisingDepartment);
  754.  
  755. $logisticsEmployee = array();
  756. $logisticsEmployee = createEmployee($logisticsPeople);
  757. addAllEmployeeToDepartment($logisticsEmployee, $logisticsDepartament);
  758.  
  759. return $vector;
  760. }
  761.  
  762. $vector = createCompany(
  763. '9xме1;3xме2;2xме3;2xма1;1xме2',
  764. '12xме1;6xма1;3xан1;2xан2;1xма2',
  765. '15xма1;10xма2;8xме1;2xин1;1xма3',
  766. '13xме1;5xме2;5xин1;1xме1');
  767.  
  768. $report = new CompanyReport();
  769. $report->printInfoAboutCompany($vector, '[Без антикризисных мер]');
  770. echo str_repeat('-', 80) . "\n";
  771.  
  772. $crisisCommittee = new CrisisCommittee();
  773.  
  774. $vectorWithoutEngineer = clone $vector;
  775. $crisisCommittee->reduceEngineer($vectorWithoutEngineer);
  776. $report->printInfoAboutCompany($vectorWithoutEngineer, '[Первая антикризисная мера]');
  777. echo str_repeat('-', 80) . "\n";
  778.  
  779. $vectorRaiseAnalytics = clone $vector;
  780. $crisisCommittee->raiseAnalytics($vectorRaiseAnalytics);
  781. $report->printInfoAboutCompany($vectorRaiseAnalytics, '[Вторая антикризисная мера]');
  782. echo str_repeat('-', 80) . "\n";
  783.  
  784. $vectorRaiseManager = clone $vector;
  785. $crisisCommittee->raiseManager($vectorRaiseManager);
  786. $report->printInfoAboutCompany($vectorRaiseManager, '[Третья антикризисная мера]');
  787. ?>
  788.  
Success #stdin #stdout 0.01s 52488KB
stdin
Standard input is empty
stdout
"Вектор"
[Без антикризисных мер]
Деп.                  сотр.       тугр.   кофе        стр.          тугр./стр.
закупок                  17      9612.5    350        3100     3.1008064516129
продаж                   24       13550    610        3325     4.0751879699248
рекламы                  36       16300    575        5450     2.9908256880734
логистики                24       11375    425        3850     2.9545454545455
Среднее               25.25   12709.375    490     3931.25    0.80822734499205
Всего                   101     50837.5   1960       15725     3.2329093799682
--------------------------------------------------------------------------------
"Вектор"
[Первая антикризисная мера]
Деп.                  сотр.       тугр.   кофе        стр.          тугр./стр.
закупок                  17      9612.5    350        3100     3.1008064516129
продаж                   22       11950    510        3315      3.604826546003
рекламы                  36       16300    575        5450     2.9908256880734
логистики                24       11375    425        3850     2.9545454545455
Среднее               24.75   12309.375    465     3928.75    0.78328825962456
Всего                    99     49237.5   1860       15715     3.1331530384982
--------------------------------------------------------------------------------
"Вектор"
[Вторая антикризисная мера]
Деп.                  сотр.       тугр.   кофе        стр.          тугр./стр.
закупок                  17      9612.5    350        3100     3.1008064516129
продаж                   24     15637.5    795        3470     4.5064841498559
рекламы                  36       16300    575        5450     2.9908256880734
логистики                24       11375    425        3850     2.9545454545455
Среднее               25.25    13231.25 536.25      3967.5    0.83372715816005
Всего                   101       52925   2145       15870     3.3349086326402
--------------------------------------------------------------------------------
"Вектор"
[Третья антикризисная мера]
Деп.                  сотр.       тугр.   кофе        стр.          тугр./стр.
закупок                  17     10612.5    350        3100     3.4233870967742
продаж                   24       14300    610        3325     4.3007518796992
рекламы                  36       16800    575        5450     3.0825688073394
логистики                24       12625    425        3850     3.2792207792208
Среднее               25.25   13584.375    490     3931.25    0.86387122416534
Всего                   101     54337.5   1960       15725     3.4554848966614