fork download
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. class Company
  6. {
  7. public $departments;
  8.  
  9. # Кол-во сотрудников всей компании
  10. public function companyEmployees(): float
  11. {
  12. $companyEmp = 0;
  13. foreach ($this->departments as $department) {
  14. $companyEmp += $department->departmentEmp();
  15. }
  16. return $companyEmp;
  17. }
  18.  
  19. # Кол-во сотрудников в среднем на департамент
  20. public function companyEmployeesAverage(): float
  21. {
  22. return round($this->companyEmployees() / count($this->departments), 2);
  23. }
  24.  
  25. #Денёжные выплаты по всей компании
  26. public function companySalary(): float
  27. {
  28. $companySal = 0;
  29. foreach ($this->departments as $department) {
  30. $companySal += $department->departmentSalary();
  31. }
  32. return $companySal;
  33. }
  34.  
  35. # Денёжные выплаты в среднем на департамент
  36. public function companySalaryAverage(): float
  37. {
  38. return round($this->companySalary() / count($this->departments), 2);
  39. }
  40.  
  41. # Кол-во выпитового кофе по компании
  42. public function companyCoffee(): float
  43. {
  44. $companyECof = 0;
  45. foreach ($this->departments as $department) {
  46. $companyECof += $department->departmentCoffee();
  47. }
  48. return $companyECof;
  49. }
  50.  
  51. # Кофе в среднем на департамент
  52. public function companyCoffeeAverage(): float
  53. {
  54. return round($this->companyCoffee() / count($this->departments), 2);
  55. }
  56.  
  57. # Кол-во страниц документов по компании
  58. public function companyPages(): float
  59. {
  60. $companyPag = 0;
  61. foreach ($this->departments as $department) {
  62. $companyPag += $department->departmentPages();
  63. }
  64. return $companyPag;
  65. }
  66.  
  67. # Кол-во страниц в среднем на департамент
  68. public function companyPagesAverage(): float
  69. {
  70. return round($this->companyPages() / count($this->departments), 2);
  71. }
  72.  
  73. # Сумма ден. ед. за страницу по компании
  74. public function companyPagePrice(): float
  75. {
  76. $companyPagPr = 0;
  77. foreach ($this->departments as $department) {
  78. $companyPagPr += $department->pagePrice();
  79. }
  80. return $companyPagPr;
  81. }
  82.  
  83. # Среднея стоимость страницы по компании
  84. public function companyPagePriceAverage(): float
  85. {
  86. return round($this->companyPagePrice() / count($this->departments), 2);
  87. }
  88. }
  89.  
  90. class Department
  91. {
  92. public $name;
  93. public $Employees;
  94.  
  95. #Кол-во сотрудников в отделе
  96. public function departmentEmp(): int
  97. {
  98. $amount = 0;
  99. foreach ($this->Employees as $profEmp) {
  100. $amount += $profEmp->NumberOfEmp;
  101. }
  102. return $amount;
  103. }
  104.  
  105. #Суммарные выплаты зарплат по отделу
  106. public function departmentSalary(): float
  107. {
  108. $departmentSalary = 0;
  109. foreach ($this->Employees as $employee) {
  110. $departmentSalary += $employee->salary();
  111. }
  112. return $departmentSalary;
  113. }
  114.  
  115. #Суммарно выпитое кофе в отделе
  116. public function departmentCoffee(): float
  117. {
  118. $departmentCoffee = 0;
  119. foreach ($this->Employees as $employee) {
  120. $departmentCoffee += $employee->coffee();
  121. }
  122. return $departmentCoffee;
  123. }
  124.  
  125. # Суммарное количество документов в отделе
  126. public function departmentPages(): float
  127. {
  128. $departmentPages = 0;
  129. foreach ($this->Employees as $employee) {
  130. $departmentPages += $employee->reportPages();
  131. }
  132. return $departmentPages;
  133. }
  134.  
  135. # Ден. ед. за страницу по отделу
  136. public function pagePrice(): float
  137. {
  138. return round($this->departmentSalary() / $this->departmentPages(), 2);
  139. }
  140.  
  141. }
  142.  
  143. abstract class Employee
  144. {
  145.  
  146. public $NumberOfEmp;
  147. public $rank; // Ранг работника
  148. public $isTheHead = false; // Является ли работник руководителем
  149.  
  150. public $rankCoeff = [1, 1.25, 1.5]; // Множитель ставки в зависимости от ранга
  151. public $monthlyTariffRate; // Месячная ставка
  152. public $defaultCoffee; // Сколько выпивает кофе
  153. public $defaultReportPages; // Сколько делает страниц документов
  154.  
  155. public function __construct($rank, $isTheHead = false)
  156. {
  157. $this->rank = $rank;
  158. $this->isTheHead = $isTheHead;
  159. }
  160.  
  161. # Деньги, которые получает работник
  162. public function salary(): float
  163. {
  164. $headCoeff = 1;
  165. if ($this->isTheHead) {
  166. $headCoeff = 1.5;
  167. }
  168.  
  169. switch ($this->rank) {
  170. case 1:
  171. return $this->NumberOfEmp * $headCoeff * $this->rankCoeff[0] * $this->monthlyTariffRate;
  172. case 2:
  173. return $this->NumberOfEmp * $headCoeff * $this->rankCoeff[1] * $this->monthlyTariffRate;
  174. case 3:
  175. return $this->NumberOfEmp * $headCoeff * $this->rankCoeff[2] * $this->monthlyTariffRate;
  176. }
  177. }
  178.  
  179. public function coffee()
  180. {
  181. if ($this->isTheHead) {
  182. $coffee = 0;
  183. } else {
  184. $coffee = $this->defaultCoffee;
  185. }
  186. return $this->NumberOfEmp * $coffee;
  187. }
  188.  
  189. public function reportPages()
  190. {
  191. if ($this->isTheHead) {
  192. $reportPages = 0;
  193. } else {
  194. $reportPages = $this->defaultReportPages;
  195. }
  196. return $this->NumberOfEmp * $reportPages;
  197. }
  198.  
  199. }
  200.  
  201. class Managers extends Employee
  202. {
  203.  
  204. public $monthlyTariffRate = 500;
  205. public $defaultCoffee = 20;
  206. public $defaultReportPages = 200;
  207.  
  208. }
  209.  
  210. class Marketers extends Employee
  211. {
  212. public $monthlyTariffRate = 400;
  213. public $defaultCoffee = 15;
  214. public $defaultReportPages = 150;
  215.  
  216. }
  217.  
  218. class Engineers extends Employee
  219. {
  220. public $monthlyTariffRate = 200;
  221. public $defaultCoffee = 5;
  222. public $defaultReportPages = 50;
  223.  
  224. }
  225.  
  226. class Analysts extends Employee
  227. {
  228. public $monthlyTariffRate = 800;
  229. public $defaultCoffee = 50;
  230. public $defaultReportPages = 5;
  231.  
  232. }
  233.  
  234. # Департамент закупок. Создание работников
  235. # 9×ме1
  236. $purchMe1 = new Managers (1);
  237. $purchMe1->NumberOfEmp = 9; // Теперь пересчеты всех свойств деньги кофе и так далее, буду зависит от этого свойства
  238.  
  239. # 3×ме2
  240. $purchMe2 = new Managers(2);
  241. $purchMe2->NumberOfEmp = 3;
  242.  
  243. #2×ме3
  244. $purchMe3 = new Managers(3);
  245. $purchMe3->NumberOfEmp = 2;
  246.  
  247. #2×ма1
  248. $purchMa1 = new Marketers(1);
  249. $purchMa1->NumberOfEmp = 2;
  250.  
  251. # Руководитель департамента ме2
  252. $purchHeadMa1 = new Managers(2,true);
  253. $purchHeadMa1->NumberOfEmp = 1;
  254.  
  255. # Массив работников для департамента закупок
  256. $purchEmp = [$purchMe1,$purchMe2,$purchMe3,$purchMa1,$purchHeadMa1];
  257.  
  258. #Создаём департамент заукпок
  259. $purchasing = new Department;
  260. $purchasing->name = 'Закупок';
  261. $purchasing->Employees = $purchEmp;
  262.  
  263. # Все объекты департаментов кладём в массив
  264. $departments = [$purchasing];
  265.  
  266. function padRight($string, int $length): string
  267. {
  268. $string = (string)$string;
  269. $pad = $length - mb_strlen($string);
  270. $string = $string . str_repeat(' ', $pad);
  271. return $string;
  272.  
  273. }
  274.  
  275. function padLeft($string, int $length): string
  276. {
  277. $string = (string)$string;
  278. $pad = $length - mb_strlen($string);
  279. $string = str_repeat(' ', $pad) . $string;
  280. return $string;
  281. }
  282.  
  283. # Создание таблички
  284. echo padRight('Департамент', 11) .
  285. padLeft('сотр.', 11) .
  286. padLeft('тугр.', 11) .
  287. padLeft('кофе', 11) .
  288. padLeft('стр.', 11) .
  289. padLeft('тугр./стр.', 16) .
  290. PHP_EOL .
  291. str_repeat('-', 72) .
  292. PHP_EOL;
  293.  
  294. foreach ($departments as $department) {
  295. echo padRight($department->name, 11) .
  296. padLeft($department->departmentEmp(), 11) .
  297. padLeft($department->departmentSalary(), 11) .
  298. padLeft($department->departmentCoffee(), 11) .
  299. padLeft($department->departmentPages(), 11) .
  300. padLeft($department->pagePrice(), 16) .
  301. PHP_EOL;
  302. }
  303.  
  304.  
  305. # Создаём компанию
  306. $company1 = new Company();
  307. $company1->departments = $departments;
  308.  
  309. echo str_repeat('-', 72) .
  310. PHP_EOL .
  311. padRight('Всего', 11) .
  312. padLeft($company1->companyEmployees(), 11) .
  313. padLeft($company1->companySalary(), 11) .
  314. padLeft($company1->companyCoffee(), 11) .
  315. padLeft($company1->companyPages(), 11) .
  316. padLeft('-', 16) .
  317. PHP_EOL;
  318.  
  319. echo padRight('Среднее', 11) .
  320. padLeft($company1->companyEmployeesAverage(), 11) .
  321. padLeft($company1->companySalaryAverage(), 11) .
  322. padLeft($company1->companyCoffeeAverage(), 11) .
  323. padLeft($company1->companyPagesAverage(), 11) .
  324. padLeft($company1->companyPagePriceAverage(), 16);
  325.  
Success #stdin #stdout 0.02s 24560KB
stdin
Standard input is empty
stdout
Департамент      сотр.      тугр.       кофе       стр.      тугр./стр.
------------------------------------------------------------------------
Закупок             17     9612.5        310       3100             3.1
------------------------------------------------------------------------
Всего               17     9612.5        310       3100               -
Среднее             17     9612.5        310       3100             3.1