fork download
  1. <?php
  2.  
  3.  
  4. abstract class Employee
  5. {
  6. public $rank;
  7. public $boss;
  8.  
  9. public $salary = array(
  10. 0 => 400, // Marketer
  11. 1 => 800, // Analyst
  12. 2 => 500, // Manager
  13. 3 => 200 // Engineer
  14. );
  15. public $coffee = array(
  16. 0 => 15,
  17. 1 => 50,
  18. 2 => 20,
  19. 3 => 5
  20. );
  21. public $reports = array(
  22. 0 => 150,
  23. 1 => 5,
  24. 2 => 200,
  25. 3 => 50
  26. );
  27.  
  28. public function __construct( int $rank, int $boss)
  29. {
  30. $this->rank = $rank;
  31. $this->boss = $boss;
  32. }
  33.  
  34. public function distributing(int $rank, int $boss)
  35. {
  36.  
  37. if ($rank == 2) {
  38. $coefficient = 1.25; // метод для определения дальнейшего
  39. } elseif ($rank == 3) { // коэффициента умножения зарплаты
  40. $coefficient = 1.5; // исходя из ранга сотрудника
  41. } else {
  42. $coefficient = 1;
  43. }
  44.  
  45. if ($boss == 1) {
  46.  
  47. $coefficient *= 2;
  48. }
  49.  
  50. return $coefficient;
  51. }
  52.  
  53. public function bossORNot(int $boss)
  54. {
  55. if ($boss == 1) {
  56.  
  57. $forBoss = 0;
  58. return $forBoss; // метод исключительно для того, чтобы в случае с
  59. // боссом обнулить количество написанных отчётов для него
  60. } else {
  61.  
  62. $forBoss = 1;
  63. return $forBoss;
  64. }
  65. }
  66. }
  67.  
  68. class Marketer extends Employee
  69. {
  70. public function getSalary(array $salary, int $coefficient)
  71. {
  72. $getSalary = $salary[0] * $coefficient;
  73. return $getSalary;
  74. }
  75. public function getCoffee(array $coffee, int $coefficient) // тут всё вроде понятно, 3 метода для
  76. { // вычисления зар. платы, кофе и отчётов
  77. $getCoffee = $coffee[0] * $coefficient; // правда мне не нравится то, что по сути для
  78. return $getCoffee; // всех 4 должностей написан один и тот же код
  79. } // может чёт в абстрактный стоит вынести?
  80. public function getReports(array $reports, int $forBoss)
  81. {
  82. $getReports = $reports[0] * $forBoss;
  83. return $getReports;
  84. }
  85. }
  86.  
  87. class Analyst extends Employee
  88. {
  89. public function getSalary(array $salary, int $coefficient)
  90. {
  91. $getSalary = $salary[1] * $coefficient;
  92. return $getSalary;
  93. }
  94. public function getCoffee(array $coffee, int $coefficient)
  95. {
  96. $getCoffee = $coffee[1] * $coefficient;
  97. return $getCoffee;
  98. }
  99. public function getReports(array $reports, int $forBoss)
  100. {
  101. $getReports = $reports[1] * $forBoss;
  102. return $getReports;
  103. }
  104. }
  105.  
  106. class Manager extends Employee
  107. {
  108. public function getSalary(array $salary, int $coefficient)
  109. {
  110. $getSalary = $salary[2] * $coefficient;
  111. return $getSalary;
  112. }
  113. public function getCoffee(array $coffee, int $coefficient)
  114. {
  115. $getCoffee = $coffee[2] * $coefficient;
  116. return $getCoffee;
  117. }
  118. public function getReports(array $reports, int $forBoss)
  119. {
  120. $getReports = $reports[2] * $forBoss;
  121. return $getReports;
  122. }
  123. }
  124.  
  125. class Engineer extends Employee
  126. {
  127. public function getSalary(array $salary, int $coefficient)
  128. {
  129.  
  130. $getSalary = $salary[3] * $coefficient;
  131. return $getSalary;
  132. }
  133. public function getCoffee(array $coffee, int $coefficient)
  134. {
  135.  
  136. $getCoffee = $coffee[3] * $coefficient;
  137. return $getCoffee;
  138. }
  139. public function getReports(array $reports, int $forBoss)
  140. {
  141.  
  142. $getReports = $reports[3] * $forBoss;
  143. return $getReports;
  144. }
  145. }
  146.  
  147. $departments = array( // просто массив со всеми отделами
  148. // и кол-вом сотрудников разных должностей и ранга в них
  149. 0 => array( // Закупки
  150. "ме1" => 9,
  151. "ме2" => 3,
  152. "ме3" => 2,
  153. "ма1" => 2,
  154. "директорМе2" => 1
  155. ),
  156. 1 => array( // Продажи
  157. "ме1" => 12,
  158. "ма1" => 6,
  159. "ан1" => 3,
  160. "ан2" => 2,
  161. "директорМа2" => 1
  162. ),
  163.  
  164. 2 => array( // Реклама
  165. "ме1" => 8,
  166. "ма1" => 15,
  167. "ма2" => 10,
  168. "ин1" => 2,
  169. "директорМа3" => 1
  170. ),
  171.  
  172. 3 => array( // Логистика
  173. "ме1" => 13,
  174. "ме2" => 5,
  175. "ин1" => 5,
  176. "директорМе1" => 1
  177. )
  178. );
  179.  
  180. function padLeft($string, $length) {
  181.  
  182. $amount = iconv_strlen($string);
  183. $difference = $length - $amount;
  184. $whitespaces = str_repeat(' ', $difference); // для таблиц
  185. $leftSide = $whitespaces . $string;
  186.  
  187. return $leftSide;
  188. }
  189.  
  190. function padRight($string, $length) {
  191.  
  192. $amount = iconv_strlen($string);
  193. $difference = $length - $amount;
  194. $whitespaces = str_repeat(" ", $difference);
  195. $rightSide = $string . $whitespaces;
  196.  
  197. return $rightSide;
  198.  
  199. }
  200.  
  201. function createEmployees()
  202. {
  203. $allEmployees = array(); // делаю двуслойный массив, распределяю всех по отделам
  204. $buying = array(); // тут нет никакой проверки правильности внесения сотрудников,
  205. // остаётся лишь внимательно ориентироваться на массив $departments
  206. $manager1 = new Manager(1, 0); // и в соответствии с ним переносить должностя
  207. $manager2 = new Manager(2, 0);
  208. $manager3 = new Manager(3, 0);
  209. $marketer1 = new Marketer(1, 0);
  210. $directorMe2 = new Manager(2, 1);
  211.  
  212. array_push($buying, $manager1, $manager2, $manager3, $marketer1, $directorMe2);
  213.  
  214. $selling = array();
  215.  
  216. $manager1 = new Manager(1, 0);
  217. $marketer1 = new Marketer(1, 0);
  218. $analyst1 = new Analyst(1, 0);
  219. $analyst2 = new Analyst(2, 0);
  220. $directorMar2 = new Marketer(2, 1);
  221.  
  222. array_push($selling, $manager1, $marketer1, $analyst1, $analyst2, $directorMar2);
  223.  
  224. $ads = array();
  225.  
  226. $manager1 = new Manager(1, 0);
  227. $marketer1 = new Marketer(1, 0);
  228. $marketer2 = new Marketer(2, 0);
  229. $engineer1 = new Engineer(1, 0);
  230. $directorMar3 = new Marketer(3, 1);
  231.  
  232. array_push($ads, $manager1, $marketer1, $marketer2, $engineer1, $directorMar3);
  233.  
  234. $logistics = array();
  235.  
  236. $manager1 = new Manager(1, 0);
  237. $manager2 = new Manager(2, 0);
  238. $engineer1 = new Engineer(1, 0);
  239. $directorMa1 = new Manager(1, 1);
  240.  
  241. array_push($logistics, $manager1, $manager2, $engineer1, $directorMa1);
  242.  
  243. array_push($allEmployees, $buying, $selling, $ads, $logistics);
  244.  
  245. return $allEmployees;
  246.  
  247. }
  248.  
  249. $employees = createEmployees();
  250.  
  251. function getAll (array $employees, array $departments)
  252. {
  253. $getIt = array();
  254.  
  255. $buying = array();
  256. $selling = array();
  257. $ads = array();
  258. $logistics = array();
  259. $average = array();
  260. $total = array();
  261.  
  262. $averageSum = 0;
  263. $averageS = 0;
  264. $averageC = 0;
  265. $averageSh = 0;
  266. $averageP = 0;
  267.  
  268. array_push($getIt, $buying, $selling, $ads, $logistics, $average, $total);
  269. // снова двойной масси с распределением по отделам
  270.  
  271. for ($i=0; $i < 4; $i++) {
  272.  
  273. $howMuch = array();
  274. $salary = array();
  275. $coffee = array();
  276. $sheets = array();
  277.  
  278. foreach ($departments[$i] as $amount) {
  279.  
  280. array_push($howMuch, $amount);
  281. }
  282.  
  283. foreach ($employees[$i] as $employee) { // считаю зарплату, кофе, и отчёты для каждого отдела
  284.  
  285. array_push($salary, $employee->getSalary($employee->salary, $employee->distributing($employee->rank, $employee->boss)));
  286.  
  287. array_push($coffee, $employee->getCoffee($employee->coffee, $employee->distributing($employee->rank, $employee->boss)));
  288.  
  289. array_push($sheets, $employee->getReports($employee->reports, $employee->bossORNot($employee->boss)));
  290. }
  291.  
  292. for ($a=0; $a < count($howMuch); $a++) {
  293.  
  294. $salary[$a] *= $howMuch[$a]; // каждое из значений помножаю на соответствующее
  295. $coffee[$a] *= $howMuch[$a]; // количество сотрудников в данном отделе на данном ранге
  296. $sheets[$a] *= $howMuch[$a];
  297.  
  298. }
  299.  
  300. $sum = array_sum($howMuch);
  301. $forRounding = array_sum($salary) / array_sum($sheets);
  302. $perSheet = round($forRounding, 1);
  303.  
  304. $averageSum += $sum;
  305. $averageS += array_sum($salary); // для дальнейшего показания средних рез-тов и всего вместе
  306. $averageC += array_sum($coffee); // собираю в конце каждого цикла значения
  307. $averageSh += array_sum($sheets); // изначально вообще не задумывал собирать эти значения
  308. $averageP += $perSheet; // именно в этой функции, да и сейчас как-то это стрёмно
  309. // выглядит, я считаю
  310. array_push($getIt[$i], $sum, array_sum($salary), array_sum($coffee), array_sum($sheets), $perSheet);
  311. }
  312.  
  313. array_push($getIt[4], $averageSum / 4, $averageS / 4, $averageC / 4, $averageSh / 4, $averageP / 4);
  314. array_push($getIt[5], $averageSum, $averageS, $averageC, $averageSh, $averageP);
  315.  
  316. // я так уверенно поставил цифры 4 и 5 в верхние пуши потому, что заведомо знаю что под
  317. // этими ключами у меня будут средние и полные значения
  318. // так быть вообще не должно, тут хоть что тронешь и всё нахуй развалится, это всё из-за того
  319. // что я решил средние значения получать именно здесь
  320. return $getIt;
  321. }
  322.  
  323.  
  324. $getIt = getAll($employees, $departments);
  325.  
  326. echo padRight("Департамент", 30) .
  327. padLeft("Сотр.", 10) .
  328. padLeft("Тугр.", 10) .
  329. padLeft("Кофе", 10) . // ну и тут уже формируется полная таблица
  330. padLeft("Стр.", 10) .
  331. padLeft("Тугр./стр.", 10) . "\n\n";
  332.  
  333. $names = array("Закупки","Продажи","Реклама","Логистика", "Среднее", "Всего");
  334.  
  335. $onAverage = array();
  336. $buying = array();
  337. $selling = array();
  338. $ads = array();
  339. $logistics = array();
  340.  
  341. array_push($onAverage, $buying, $selling, $ads, $logistics);
  342.  
  343. for ($i=0; $i < count($names); $i++) {
  344.  
  345. echo padRight($names[$i], 30);
  346.  
  347. foreach ($getIt[$i] as $value) {
  348.  
  349. echo padLeft($value, 10);
  350.  
  351. }
  352.  
  353. echo "\n";
  354. }
  355.  
  356. ?>
Success #stdin #stdout 0s 82560KB
stdin
Standard input is empty
stdout
Департамент                        Сотр.     Тугр.      Кофе      Стр.Тугр./стр.

Закупки                               17      8800       350      3100       2.8
Продажи                               24     13200       610      3325         4
Реклама                               36     15600       590      5450       2.9
Логистика                             24     11000       425      3850       2.9
Среднее                            25.25     12150    493.75   3931.25      3.15
Всего                                101     48600      1975     15725      12.6