fork(1) download
  1. <?php
  2. declare(strict_types=1);
  3.  
  4. set_error_handler(function ($errno, $errstr, $errfile, $errline ) {
  5. // Не выбрасываем исключение если ошибка подавлена с
  6. // помощью оператора @
  7. if (!error_reporting()) {
  8. return;
  9. }
  10.  
  11. throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
  12. });
  13.  
  14. class Company
  15. {
  16. public $departments;
  17.  
  18. # Кол-во сотрудников всей компании
  19. public function companyEmployees(): float
  20. {
  21. $companyEmp = 0;
  22. foreach ($this->departments as $department) {
  23. $companyEmp += $department->departmentEmp();
  24. }
  25. return $companyEmp;
  26. }
  27.  
  28. # Кол-во сотрудников в среднем на департамент
  29. public function companyEmployeesAverage(): float
  30. {
  31. return round($this->companyEmployees() / count($this->departments), 2);
  32. }
  33.  
  34. #Денёжные выплаты по всей компании
  35. public function companySalary(): float
  36. {
  37. $companySal = 0;
  38. foreach ($this->departments as $department) {
  39. $companySal += $department->departmentSalary();
  40. }
  41. return $companySal;
  42. }
  43.  
  44. # Денёжные выплаты в среднем на департамент
  45. public function companySalaryAverage(): float
  46. {
  47. return round($this->companySalary() / count($this->departments), 2);
  48. }
  49.  
  50. # Кол-во выпитового кофе по компании
  51. public function companyCoffee(): float
  52. {
  53. $companyECof = 0;
  54. foreach ($this->departments as $department) {
  55. $companyECof += $department->departmentCoffee();
  56. }
  57. return $companyECof;
  58. }
  59.  
  60. # Кофе в среднем на департамент
  61. public function companyCoffeeAverage(): float
  62. {
  63. return round($this->companyCoffee() / count($this->departments), 2);
  64. }
  65.  
  66. # Кол-во страниц документов по компании
  67. public function companyPages(): float
  68. {
  69. $companyPag = 0;
  70. foreach ($this->departments as $department) {
  71. $companyPag += $department->departmentPages();
  72. }
  73. return $companyPag;
  74. }
  75.  
  76. # Кол-во страниц в среднем на департамент
  77. public function companyPagesAverage(): float
  78. {
  79. return round($this->companyPages() / count($this->departments), 2);
  80. }
  81.  
  82. # Сумма ден. ед. за страницу по компании
  83. public function companyPagePrice(): float
  84. {
  85. $companyPagPr = 0;
  86. foreach ($this->departments as $department) {
  87. $companyPagPr += $department->pagePrice();
  88. }
  89. return $companyPagPr;
  90. }
  91.  
  92. # Среднея стоимость страницы по компании
  93. public function companyPagePriceAverage(): float
  94. {
  95. return round($this->companyPagePrice() / count($this->departments), 2);
  96. }
  97. }
  98.  
  99. class Department
  100. {
  101. public $name;
  102. public $Employees;
  103.  
  104. #Кол-во сотрудников в отделе
  105. public function departmentEmp(): int
  106. {
  107. return count($this->Employees);
  108. }
  109.  
  110. #Суммарные выплаты зарплат по отделу
  111. public function departmentSalary(): float
  112. {
  113. $departmentSalary = 0;
  114. foreach ($this->Employees as $employee) {
  115. $departmentSalary += $employee->salary();
  116. }
  117. return $departmentSalary;
  118. }
  119.  
  120. #Суммарно выпитое кофе в отделе
  121. public function departmentCoffee(): float
  122. {
  123. $departmentCoffee = 0;
  124. foreach ($this->Employees as $employee) {
  125. $departmentCoffee += $employee->coffee();
  126. }
  127. return $departmentCoffee;
  128. }
  129.  
  130. # Суммарное количество документов в отделе
  131. public function departmentPages(): float
  132. {
  133. $departmentPages = 0;
  134. foreach ($this->Employees as $employee) {
  135. $departmentPages += $employee->reportPages();
  136. }
  137. return $departmentPages;
  138. }
  139.  
  140. # Ден. ед. за страницу по отделу
  141. public function pagePrice(): float
  142. {
  143. return round($this->departmentSalary() / $this->departmentPages(), 2);
  144. }
  145.  
  146. }
  147.  
  148. abstract class Employee
  149. {
  150.  
  151. public $rank; // Ранг работника
  152. public $isTheHead = false; // Является ли работник руководителем
  153. private $rankCoeff = [1, 1.25, 1.5]; // Множитель ставки в зависимости от ранга
  154. protected $monthlyTariffRate; // Месячная ставка
  155. protected $defaultCoffee; // Сколько выпивает кофе
  156. protected $defaultReportPages; // Сколько делает страниц документов
  157.  
  158. public function __construct($rank, $isTheHead = false)
  159. {
  160. $this->rank = $rank;
  161. $this->isTheHead = $isTheHead;
  162. }
  163.  
  164. # Деньги, которые получает работник
  165. public function salary(): float
  166. {
  167. $headCoeff = 1;
  168. if ($this->isTheHead) {
  169. $headCoeff = 1.5;
  170. }
  171.  
  172. switch ($this->rank) {
  173. case 1:
  174. return $headCoeff * $this->rankCoeff[0] * $this->monthlyTariffRate;
  175. case 2:
  176. return $headCoeff * $this->rankCoeff[1] * $this->monthlyTariffRate;
  177. case 3:
  178. return $headCoeff * $this->rankCoeff[2] * $this->monthlyTariffRate;
  179. }
  180. }
  181.  
  182. public function coffee()
  183. {
  184. if ($this->isTheHead) {
  185. $coffee = 0;
  186. } else {
  187. $coffee = $this->defaultCoffee;
  188. }
  189. return $coffee;
  190. }
  191.  
  192. public function reportPages()
  193. {
  194. if ($this->isTheHead) {
  195. $reportPages = 0;
  196. } else {
  197. $reportPages = $this->defaultReportPages;
  198. }
  199. return $reportPages;
  200. }
  201.  
  202. }
  203.  
  204. class Manager extends Employee
  205. {
  206. protected $monthlyTariffRate = 500;
  207. protected $defaultCoffee = 20;
  208. protected $defaultReportPages = 200;
  209.  
  210. }
  211.  
  212. class Marketer extends Employee
  213. {
  214. protected $monthlyTariffRate = 400;
  215. protected $defaultCoffee = 15;
  216. protected $defaultReportPages = 150;
  217.  
  218. }
  219.  
  220. class Engineer extends Employee
  221. {
  222. protected $monthlyTariffRate = 200;
  223. protected $defaultCoffee = 5;
  224. protected $defaultReportPages = 50;
  225.  
  226. }
  227.  
  228. class Analyst extends Employee
  229. {
  230. protected $monthlyTariffRate = 800;
  231. protected $defaultCoffee = 50;
  232. protected $defaultReportPages = 5;
  233.  
  234. }
  235.  
  236.  
  237. # Департамент закупок. Создание работников
  238. # 9×ме1
  239. $me1 = new Manager(1);
  240. $me2 = new Manager(1);
  241. $me3 = new Manager(1);
  242. $me4 = new Manager(1);
  243. $me5 = new Manager(1);
  244. $me6 = new Manager(1);
  245. $me7 = new Manager(1);
  246. $me8 = new Manager(1);
  247. $me9 = new Manager(1);
  248.  
  249. # 3×ме2
  250. $me10 = new Manager(2);
  251. $me11 = new Manager(2);
  252. $me12 = new Manager(2);
  253. #2×ме3
  254. $me13 = new Manager(3);
  255. $me14 = new Manager(3);
  256.  
  257. #2×ма1
  258. $ma1 = new Marketer(1);
  259. $ma2 = new Marketer(1);
  260.  
  261. # Руководитель департамента ме2
  262. $me15 = new Manager(2, true);
  263.  
  264. # Массив работников для департамента закупок
  265. $purchEmp = [$me1, $me2, $me3, $me4, $me5, $me6, $me7, $me8, $me9, $me10, $me11, $me12, $me13, $me14, $ma1, $ma2, $me15];
  266.  
  267. # Создаём отел закупок
  268. $purchasing = new Department;
  269. $purchasing->name = 'Закупок';
  270. $purchasing->Employees = $purchEmp;
  271.  
  272. # Департамент продаж. Создание работников
  273. #12×ме1
  274. for ($i = 0; $i < 12; $i += 1) {
  275. $salesEmp[] = new Manager(1);
  276. }
  277.  
  278. # 6×ма1
  279. for ($i = 0; $i < 6; $i += 1) {
  280. $salesEmp[] = new Marketer(1);
  281. }
  282.  
  283. # 3×ан1
  284. for ($i = 0; $i < 3; $i += 1) {
  285. $salesEmp[] = new Analyst(1);
  286. }
  287.  
  288. # 2×ан2
  289. for ($i = 0; $i < 2; $i += 1) {
  290. $salesEmp[] = new Analyst(2);
  291. }
  292.  
  293. #руководитель ма2
  294. for ($i = 0; $i < 1; $i += 1) {
  295. $salesEmp[] = new Marketer(2, true);
  296. }
  297.  
  298.  
  299. #Создаём отдел продаж
  300. $sales = new Department;
  301. $sales->name = 'Продаж';
  302. $sales->Employees = $salesEmp;
  303.  
  304. # Департамент рекламы. Создание работников
  305. #15×ма1
  306. for ($i = 0; $i < 15; $i += 1) {
  307. $advertisingEmp[] = new Manager(1);
  308. }
  309.  
  310. #10×ма2
  311. for ($i = 0; $i < 10; $i += 1) {
  312. $advertisingEmp[] = new Manager(2);
  313. }
  314.  
  315. #8×ме1
  316. for ($i = 0; $i < 8; $i += 1) {
  317. $advertisingEmp[] = new Marketer(1);
  318. }
  319.  
  320. #2×ин1
  321. for ($i = 0; $i < 2; $i += 1) {
  322. $advertisingEmp[] = new Engineer(1);
  323. }
  324.  
  325. #руководитель ма3
  326. for ($i = 0; $i < 1; $i += 1) {
  327. $advertisingEmp[] = new Manager(3, true);
  328. }
  329.  
  330. #Создание департамента рекламы
  331. $advertising = new Department;
  332. $advertising->name = 'Рекламы';
  333. $advertising->Employees = $advertisingEmp;
  334.  
  335. # Департамент логистики. Создание работников
  336. #13×ме1
  337. for ($i = 0; $i < 13; $i += 1) {
  338. $logisticsEmp[] = new Manager(1);
  339. }
  340.  
  341. #5×ме2
  342. for ($i = 0; $i < 5; $i += 1) {
  343. $logisticsEmp[] = new Manager(2);
  344. }
  345.  
  346. #5×ин1
  347. for ($i = 0; $i < 5; $i += 1) {
  348. $logisticsEmp[] = new Engineer(1);
  349. }
  350.  
  351. #руководитель ме1
  352. for ($i = 0; $i < 1; $i += 1) {
  353. $logisticsEmp[] = new Manager(1, true);
  354. }
  355.  
  356. # Создание департамента логистики
  357. $logistics = new Department;
  358. $logistics->name = 'Логистики';
  359. $logistics->Employees = $logisticsEmp;
  360.  
  361. # Все объекты департаментов кладём в массив
  362. $departments = [$purchasing, $sales, $advertising, $logistics];
  363.  
  364. function padRight($string, int $length): string
  365. {
  366. $string = (string)$string;
  367. $pad = $length - mb_strlen($string);
  368. $string = $string . str_repeat(' ', $pad);
  369. return $string;
  370.  
  371. }
  372.  
  373. function padLeft($string, int $length): string
  374. {
  375. $string = (string)$string;
  376. $pad = $length - mb_strlen($string);
  377. $string = str_repeat(' ', $pad) . $string;
  378. return $string;
  379. }
  380.  
  381.  
  382. # Создание таблички
  383. echo padRight('Департамент', 11) .
  384. padLeft('сотр.', 11) .
  385. padLeft('тугр.', 11) .
  386. padLeft('кофе', 11) .
  387. padLeft('стр.', 11) .
  388. padLeft('тугр./стр.', 16) .
  389. PHP_EOL .
  390. str_repeat('-', 72) .
  391. PHP_EOL;
  392.  
  393. foreach ($departments as $department) {
  394. echo padRight($department->name, 11) .
  395. padLeft($department->departmentEmp(), 11) .
  396. padLeft($department->departmentSalary(), 11) .
  397. padLeft($department->departmentCoffee(), 11) .
  398. padLeft($department->departmentPages(), 11) .
  399. padLeft($department->pagePrice(), 16) .
  400. PHP_EOL;
  401. }
  402.  
  403. # Создаём компанию
  404. $company1 = new Company;
  405. $company1->departments = $departments;
  406.  
  407. # Строки 'всего', 'среднее' итоговые цифры по всей компании
  408. echo str_repeat('-', 72) .
  409. PHP_EOL .
  410. padRight('Всего', 11) .
  411. padLeft($company1->companyEmployees(), 11) .
  412. padLeft($company1->companySalary(), 11) .
  413. padLeft($company1->companyCoffee(), 11) .
  414. padLeft($company1->companyPages(), 11) .
  415. padLeft('-', 16) .
  416. PHP_EOL;
  417.  
  418. echo padRight('Среднее', 11) .
  419. padLeft($company1->companyEmployeesAverage(), 11) .
  420. padLeft($company1->companySalaryAverage(), 11) .
  421. padLeft($company1->companyCoffeeAverage(), 11) .
  422. padLeft($company1->companyPagesAverage(), 11) .
  423. padLeft($company1->companyPagePriceAverage(), 16);
Success #stdin #stdout 0.02s 24524KB
stdin
Standard input is empty
stdout
Департамент      сотр.      тугр.       кофе       стр.      тугр./стр.
------------------------------------------------------------------------
Закупок             17     9612.5        310       3100             3.1
Продаж              24      13550        580       3325            4.08
Рекламы             36      18475        630       6300            2.93
Логистики           24      11375        385       3850            2.95
------------------------------------------------------------------------
Всего              101    53012.5       1905      16575               -
Среднее          25.25   13253.13     476.25    4143.75            3.27