fork(1) download
  1. <?php
  2.  
  3.  
  4. abstract class Employee
  5. {
  6. private $rate;
  7. private $litresOfCoffee;
  8. private $pgsOfDocs;
  9. private $rank;
  10. private $boss;
  11.  
  12. public function __construct($rate, $litresOfCoffee, $pgsOfDocs, $rank, $boss = false){
  13. $this->rate = $rate;
  14. $this->litresOfCoffee = $litresOfCoffee;
  15. $this->pgsOfDocs = $pgsOfDocs;
  16. $this->rank = $rank;
  17. $this->boss = $boss;
  18. if ($this->rank > 1) {
  19. $this->setRateWithRank();
  20. }
  21. if ($boss) {
  22. $this->setBossPrivelege();
  23. }
  24. }
  25.  
  26. public function getRate(){
  27. return $this->rate;
  28. }
  29.  
  30. public function getCoffee(){
  31. return $this->litresOfCoffee;
  32. }
  33.  
  34. public function getPages(){
  35. return $this->pgsOfDocs;
  36. }
  37.  
  38. private function setRateWithRank(){
  39. if ($this->rank == 2) {
  40. $this->rate = $this->rate * 1.25;
  41. }
  42. if ($this->rank == 3) {
  43. $this->rate = $this->rate * 1.50;
  44. }
  45. }
  46.  
  47. private function setBossPrivelege(){
  48. $this->rate = $this->rate * 1.50;
  49. $this->litresOfCoffee = $this->litresOfCoffee * 2;
  50. $this->pgsOfDocs = 0;
  51. }
  52. }
  53.  
  54. class Manager extends Employee
  55. {}
  56. class Marketer extends Employee
  57. {}
  58. class Engineer extends Employee
  59. {}
  60. class Analyst extends Employee
  61. {}
  62.  
  63. class Department
  64. {
  65. private $name;
  66. private $employees;
  67.  
  68. public function __construct($name, $employees){
  69. $this->name = $name;
  70. $this->employees = $employees;
  71. }
  72.  
  73. public function getNumOfEmployees(){
  74. $numOfEmployees = 0;
  75. foreach ($this->employees as list($num, $position)) {
  76. $numOfEmployees += $num;
  77. }
  78. return $numOfEmployees;
  79. }
  80.  
  81. public function getSalaryOfEmployees(){
  82. $salaryOfEmployees = 0;
  83. foreach ($this->employees as list($num, $position)) {
  84. $salaryOfEmployees += $position->getRate() * $num;
  85. }
  86. return $salaryOfEmployees;
  87. }
  88.  
  89. public function getDrunkCoffee(){
  90. $drunkCoffee = 0;
  91. foreach ($this->employees as list($num, $position)) {
  92. $drunkCoffee += $position->getCoffee() * $num;
  93. }
  94. return $drunkCoffee;
  95. }
  96.  
  97. public function getPagesOfDocs(){
  98. $pagesOfDocs = 0;
  99. foreach ($this->employees as list($num, $position)) {
  100. $pagesOfDocs += $position->getPages() * $num;
  101. }
  102. return $pagesOfDocs;
  103. }
  104.  
  105. public function getTugricsPerPage(){
  106. return round(($this->getSalaryOfEmployees() / $this->getPagesOfDocs()), 1);
  107. }
  108.  
  109. public function getNameOfDept(){
  110. return $this->name;
  111. }
  112.  
  113. }
  114.  
  115. class Company
  116. {
  117. private $departments;
  118. private $name;
  119.  
  120. public function __construct($name, $departments)
  121. {
  122. $this->name = $name;
  123. $this->departments = $departments;
  124. }
  125.  
  126. public function getNameOfCompany(){
  127. return $this->name;
  128. }
  129. public function getDepartments(){
  130. return $this->departments;
  131. }
  132. }
  133.  
  134. function padRight($string, $widthOfCol){
  135. $lengthOfString = mb_strlen($string);
  136. if ($lengthOfString < $widthOfCol) {
  137. $formattedString = $string . str_repeat(" ", $widthOfCol - $lengthOfString);
  138. return $formattedString;
  139. }
  140. }
  141.  
  142. function padLeft($string, $widthOfCol){
  143. $lengthOfString = mb_strlen($string);
  144. if ($lengthOfString < $widthOfCol) {
  145. $formattedString = str_repeat(" ", $widthOfCol - $lengthOfString) . $string;
  146. return $formattedString;
  147. }
  148. }
  149. //существующие виды сотрудников в компании
  150. $manager1 = new Manager(500, 20, 200, 1);
  151. $manager2 = new Manager(500, 20, 200, 2);
  152. $manager2boss = new Manager(500, 20, 200, 2, true);
  153. $manager3 = new Manager(500, 20, 200, 3);
  154. $marketer1 = new Marketer(400, 15, 150, 1);
  155. $analyst1 = new Analyst(800, 50, 5, 1);
  156. $analyst2 = new Analyst(800, 50, 5, 2);
  157. $marketer2boss = new Marketer(400, 15, 150, 2, true);
  158. $marketer2 = new Marketer(400, 15, 150, 2);
  159. $engineer1 = new Engineer(200, 5, 50, 1);
  160. $marketer3boss = new Marketer(400, 15, 150, 3, true);
  161. $manager1boss = new Manager(500, 20, 200, 1, true);
  162. //Сотрудники в департаментах
  163. $procurementDepartmentEmpls = [
  164. [9, $manager1],
  165. [3, $manager2],
  166. [2, $manager3],
  167. [2, $marketer1],
  168. [1, $manager2boss]
  169. ];
  170. $salesDepartmentEmpls = [
  171. [12, $manager1],
  172. [6, $marketer1],
  173. [3, $analyst1],
  174. [2, $analyst2],
  175. [1, $marketer2boss]
  176. ];
  177. $advertisingDepartmentEmpls = [
  178. [15, $marketer1],
  179. [10, $marketer2],
  180. [8, $manager1],
  181. [2, $engineer1],
  182. [1, $marketer3boss]
  183. ];
  184. $logisticsDepartmentEmpls = [
  185. [13, $manager1],
  186. [5, $manager2],
  187. [5, $engineer1],
  188. [1, $manager1boss],
  189. ];
  190. //Департаменты
  191. $departments = [
  192. $procurementDepartment = new Department("Закупок", $procurementDepartmentEmpls),
  193. $salesDepartment = new Department("Продаж", $salesDepartmentEmpls),
  194. $advertisingDepartment = new Department("Рекламы", $advertisingDepartmentEmpls),
  195. $logisticsDepartment = new Department("Логистики", $logisticsDepartmentEmpls),
  196. ];
  197. //Компания
  198. $company = new Company("Вектор", $departments);
  199.  
  200. //Вывод информации
  201. $col1 = 15;
  202. $col2 = 10;
  203. $col3 = 10;
  204. $col4 = 10;
  205. $col5 = 10;
  206. $col6 = 12;
  207.  
  208. echo padRight("Департамент", $col1) .
  209. padLeft("Сотр.", $col2) .
  210. padLeft("Тугр.", $col3) .
  211. padLeft("Кофе", $col4) .
  212. padLeft("Стр.", $col5) .
  213. padLeft("Тугр./стр.", $col6) . "\n\n";
  214.  
  215. $allEmployees = 0;
  216. $allSalary = 0;
  217. $allCoffee = 0;
  218. $allPages = 0;
  219. $allTugPerPgs = 0;
  220.  
  221. foreach ($company->getDepartments() as $department) {
  222.  
  223. echo padRight($department->getNameOfDept(), $col1) .
  224. padLeft($department->getNumOfEmployees(), $col2) .
  225. padLeft($department->getSalaryOfEmployees(), $col3) .
  226. padLeft($department->getDrunkCoffee(), $col4) .
  227. padLeft($department->getPagesOfDocs(), $col5) .
  228. padLeft($department->getTugricsPerPage(), $col6) . "\n";
  229.  
  230. $allEmployees += $department->getNumOfEmployees();
  231. $allSalary += $department->getSalaryOfEmployees();
  232. $allCoffee += $department->getDrunkCoffee();
  233. $allPages += $department->getPagesOfDocs();
  234. $allTugPerPgs += $department->getTugricsPerPage();
  235. }
  236.  
  237. $numOfDepartments = count($company->getDepartments());
  238.  
  239. echo padRight("Среднее", $col1) .
  240. padLeft(round(($allEmployees / $numOfDepartments),1), $col2) .
  241. padLeft(round(($allSalary / $numOfDepartments), 1), $col3) .
  242. padLeft(round(($allCoffee / $numOfDepartments), 1), $col4) .
  243. padLeft(round(($allPages / $numOfDepartments), 1), $col5) .
  244. padLeft(round(($allTugPerPgs / $numOfDepartments), 1), $col6) . "\n";
  245.  
  246. echo padRight("Всего", $col1) .
  247. padLeft($allEmployees, $col2) .
  248. padLeft($allSalary, $col3) .
  249. padLeft($allCoffee, $col4) .
  250. padLeft($allPages, $col5) .
  251. padLeft($allTugPerPgs, $col6) . "\n";
  252.  
Success #stdin #stdout 0.02s 24476KB
stdin
Standard input is empty
stdout
Департамент         Сотр.     Тугр.      Кофе      Стр.  Тугр./стр.

Закупок                17    9612.5       350      3100         3.1
Продаж                 24     13550       610      3325         4.1
Рекламы                36     16300       575      5450           3
Логистики              24     11375       425      3850           3
Среднее              25.3   12709.4       490    3931.3         3.3
Всего                 101   50837.5      1960     15725        13.2