fork download
  1. <?php
  2.  
  3. /* Сотрудник */
  4. abstract class Employee
  5. {
  6. private $rate;//начальный рейт
  7. private $rateWithRank;//рейт расчитанный с рангом
  8. private $litresOfCoffee;
  9. private $pgsOfDocs;
  10. private $rank;
  11. private $boss;
  12. private $litresOfCoffeeWR;//аналогично для кофе
  13. private $pgsOfDocsWR;//аналогично для доков
  14.  
  15. public function __construct(int $rate, int $litresOfCoffee, int $pgsOfDocs, int $rank, bool $boss = false){
  16. $this->rate = $rate;
  17. $this->litresOfCoffee = $litresOfCoffee;
  18. $this->pgsOfDocs = $pgsOfDocs;
  19. $this->rank = $rank;
  20. $this->boss = $boss;
  21. $this->litresOfCoffeeWR = $this->litresOfCoffee;
  22. $this->pgsOfDocsWR = $this->pgsOfDocs;
  23. $this->setRateWithRank();
  24. if ($this->boss) {
  25. $this->setBossPrivelege();
  26. }
  27. }
  28. /*получить начальные свойства сотрудника*/
  29. public function getAllProperties(){
  30. return [$this->rate, $this->litresOfCoffee, $this->pgsOfDocs, $this->rank, $this->boss];
  31. }
  32. /*сетеры и гетеры для всех свойств*/
  33. public function getRate(){
  34. return $this->rateWithRank;
  35. }
  36.  
  37. public function setRate(int $rate){
  38. $this->rate = $rate;
  39. $this->setRateWithRank();
  40. if ($this->boss) {
  41. $this->setBossPrivelege();
  42. }
  43. }
  44.  
  45. public function getCoffee(){
  46. return $this->litresOfCoffeeWR;
  47. }
  48.  
  49. public function setCoffee(int $litresOfCoffee){
  50. $this->litresOfCoffee = $litresOfCoffee;
  51. if ($this->boss) {
  52. $this->litresOfCoffeeWR = $this->litresOfCoffee * 2;
  53. } else {
  54. $this->litresOfCoffeeWR = $this->litresOfCoffee;
  55. }
  56. }
  57.  
  58. public function getRank(){
  59. return $this->rank;
  60. }
  61.  
  62. public function setRank(int $rank){
  63. $this->rank = $rank;
  64. $this->setRateWithRank();
  65. if ($this->boss) {
  66. $this->setBossPrivelege();
  67. }
  68. }
  69.  
  70. public function getPages(){
  71. return $this->pgsOfDocsWR;
  72. }
  73.  
  74. public function setPages(int $pagesOfDocs){
  75. $this->pgsOfDocs = $pagesOfDocs;
  76. }
  77.  
  78. public function isBoss(){
  79. return $this->boss;
  80. }
  81.  
  82. public function setBossStatus(bool $bossStatus){
  83. $this->boss = $bossStatus;
  84. if ($this->boss) {
  85. $this->setBossPrivelege();
  86. } else {
  87. $this->setRateWithRank();
  88. $this->litresOfCoffeeWR = $this->litresOfCoffee;
  89. $this->pgsOfDocsWR = $this->pgsOfDocs;
  90. }
  91. }
  92.  
  93. private function setRateWithRank(){
  94. switch ($this->rank) {
  95. case 1:
  96. $this->rateWithRank = $this->rate;
  97. break;
  98. case 2:
  99. $this->rateWithRank = $this->rate * 1.25;
  100. break;
  101. case 3:
  102. $this->rateWithRank = $this->rate * 1.50;
  103. break;
  104. }
  105. }
  106.  
  107. private function setBossPrivelege(){
  108. $this->rateWithRank = $this->rateWithRank * 1.50;
  109. $this->litresOfCoffeeWR = $this->litresOfCoffee * 2;
  110. $this->pgsOfDocsWR = 0;
  111. }
  112. }
  113. /* Группа сотрудников хранит уникального сотр-ка в N кол-ве*/
  114. class EmployeeGroup
  115. {
  116. private $numOfEmployees;
  117. private $employeeType;
  118.  
  119. public function __construct(int $numOfEmployees, Employee $employeeType){
  120. $this->numOfEmployees = $numOfEmployees;
  121. $this->employeeType = $employeeType;
  122. }
  123.  
  124. public function getEmployee(){
  125. return [$this->numOfEmployees, $this->employeeType];
  126. }
  127.  
  128. public function addEmployee($num = 1){
  129. $this->numOfEmployees += $num;
  130. }
  131.  
  132. public function removeEmployee(){
  133. if ($this->numOfEmployees > 0) {
  134. $this->numOfEmployees--;
  135. }
  136. }
  137.  
  138. }
  139. /* Штат департамента хранит группы сотрудников*/
  140. class DepartmentStaff
  141. {
  142. private $listOfEmployeeTypes;
  143.  
  144. public function __construct(EmployeeGroup ...$listOfEmployeeTypes){
  145. $this->listOfEmployeeTypes = $listOfEmployeeTypes;
  146. }
  147.  
  148. public function getEmployeeTypes(){
  149. return $this->listOfEmployeeTypes;
  150. }
  151.  
  152. public function addEmployeeType(EmployeeGroup $addedEmployee){
  153. $this->listOfEmployeeTypes[] = $addedEmployee;
  154. }
  155.  
  156. public function removeEmployeeType(EmployeeGroup $deletedEmployeeType){
  157. foreach ($this->listOfEmployeeTypes as $key => $employeeType) {
  158. if ($deletedEmployeeType == $employeeType) {
  159. unset($this->listOfEmployeeTypes[$key]);
  160. }
  161. }
  162. }
  163. }
  164.  
  165. class Manager extends Employee
  166. {}
  167. class Marketer extends Employee
  168. {}
  169. class Engineer extends Employee
  170. {}
  171. class Analyst extends Employee
  172. {}
  173. /* Департамент хранит штат и считает всякие штуки */
  174. class Department
  175. {
  176. private $name;
  177. private $employees;
  178.  
  179. public function __construct(string $name, DepartmentStaff $employees){
  180. $this->name = $name;
  181. $this->employees = $employees;
  182. }
  183.  
  184. public function getDepartmentStaff(){
  185. return $this->employees;
  186. }
  187.  
  188. public function getNumOfEmployees(){
  189. $numOfEmployees = 0;
  190. $employees = $this->employees->getEmployeeTypes();
  191. foreach ($employees as $employee) {
  192. list($num, $position) = $employee->getEmployee();
  193. $numOfEmployees += $num;
  194. }
  195. return $numOfEmployees;
  196. }
  197.  
  198. public function getSalaryOfEmployees(){
  199. $salaryOfEmployees = 0;
  200. $employees = $this->employees->getEmployeeTypes();
  201. foreach ($employees as $employee) {
  202. list($num, $position) = $employee->getEmployee();
  203. $salaryOfEmployees += $position->getRate() * $num;
  204. }
  205. return $salaryOfEmployees;
  206. }
  207. /* Удаляет сотрудника из штата - одного из группы, или всех(группу разом)*/
  208. public function fireEmployee(Employee $deletedPosition, $all = false){
  209. $employees = $this->employees->getEmployeeTypes();
  210. foreach ($employees as $employee) {
  211. list($num, $position) = $employee->getEmployee();
  212. if ($position == $deletedPosition) {
  213. if ($all) {
  214. $this->employees->removeEmployeeType($employee);
  215. } else {
  216. $employee->removeEmployee();
  217. list($num, $position) = $employee->getEmployee();
  218. if ($num == 0) {
  219. $this->employees->removeEmployeeType($employee);
  220. }
  221. }
  222. }
  223. }
  224. }
  225. /* Добавляет сотрудника(группу в штат)*/
  226. public function addEmployee(int $num, Employee $position){
  227. $this->employees->addEmployeeType(new EmployeeGroup($num, $position));
  228. }
  229.  
  230. public function getDrunkCoffee(){
  231. $drunkCoffee = 0;
  232. $employees = $this->employees->getEmployeeTypes();
  233. foreach ($employees as $employee) {
  234. list($num, $position) = $employee->getEmployee();
  235. $drunkCoffee += $position->getCoffee() * $num;
  236. }
  237. return $drunkCoffee;
  238. }
  239.  
  240. public function getPagesOfDocs(){
  241. $pagesOfDocs = 0;
  242. $employees = $this->employees->getEmployeeTypes();
  243. foreach ($employees as $employee) {
  244. list($num, $position) = $employee->getEmployee();
  245. $pagesOfDocs += $position->getPages() * $num;
  246. }
  247. return $pagesOfDocs;
  248. }
  249.  
  250. public function getTugricsPerPage(){
  251. return round(($this->getSalaryOfEmployees() / $this->getPagesOfDocs()), 1);
  252. }
  253.  
  254. public function getNameOfDept(){
  255. return $this->name;
  256. }
  257.  
  258. }
  259.  
  260. class Company
  261. {
  262. private $departments;
  263. private $name;
  264.  
  265. public function __construct(string $name, Department ...$departments)
  266. {
  267. $this->name = $name;
  268. $this->departments = $departments;
  269. }
  270.  
  271. public function getNameOfCompany(){
  272. return $this->name;
  273. }
  274. public function getDepartments(){
  275. return $this->departments;
  276. }
  277. }
  278.  
  279. function padRight($string, $widthOfCol){
  280. $lengthOfString = mb_strlen($string);
  281. if ($lengthOfString < $widthOfCol) {
  282. $formattedString = $string . str_repeat(" ", $widthOfCol - $lengthOfString);
  283. return $formattedString;
  284. }
  285. }
  286.  
  287. function padLeft($string, $widthOfCol){
  288. $lengthOfString = mb_strlen($string);
  289. if ($lengthOfString < $widthOfCol) {
  290. $formattedString = str_repeat(" ", $widthOfCol - $lengthOfString) . $string;
  291. return $formattedString;
  292. }
  293. }
  294. //существующие виды сотрудников в компании
  295. $manager1 = new Manager(500, 20, 200, 1);
  296. $manager2 = new Manager(500, 20, 200, 2);
  297. $manager2boss = new Manager(500, 20, 200, 2, true);
  298. $manager3 = new Manager(500, 20, 200, 3);
  299. $marketer1 = new Marketer(400, 15, 150, 1);
  300. $analyst1 = new Analyst(800, 50, 5, 1);
  301. $analyst2 = new Analyst(800, 50, 5, 2);
  302. $marketer2boss = new Marketer(400, 15, 150, 2, true);
  303. $marketer2 = new Marketer(400, 15, 150, 2);
  304. $engineer1 = new Engineer(200, 5, 50, 1);
  305. $marketer3boss = new Marketer(400, 15, 150, 3, true);
  306. $manager1boss = new Manager(500, 21, 200, 1, true);
  307.  
  308. //Группы сотрудников одного вида по департаментам
  309. $procurementGroup1 = new EmployeeGroup(9, $manager1);
  310. $procurementGroup2 = new EmployeeGroup(3, $manager2);
  311. $procurementGroup3 = new EmployeeGroup(2, $manager3);
  312. $procurementGroup4 = new EmployeeGroup(2, $marketer1);
  313. $procurementGroup5 = new EmployeeGroup(1, $manager2boss);
  314.  
  315. $salesGroup1 = new EmployeeGroup(12, $manager1);
  316. $salesGroup2 = new EmployeeGroup(6, $marketer1);
  317. $salesGroup3 = new EmployeeGroup(3, $analyst1);
  318. $salesGroup4 = new EmployeeGroup(2, $analyst2);
  319. $salesGroup5 = new EmployeeGroup(1, $marketer2boss);
  320.  
  321. $advGroup1 = new EmployeeGroup(15, $marketer1);
  322. $advGroup2 = new EmployeeGroup(10, $marketer2);
  323. $advGroup3 = new EmployeeGroup(8, $manager1);
  324. $advGroup4 = new EmployeeGroup(2, $engineer1);
  325. $advGroup5 = new EmployeeGroup(1, $marketer3boss);
  326.  
  327. $logstcGroup1 = new EmployeeGroup(13, $manager1);
  328. $logstcGroup2 = new EmployeeGroup(5, $manager2);
  329. $logstcGroup3 = new EmployeeGroup(5, $engineer1);
  330. $logstcGroup4 = new EmployeeGroup(1, $manager1boss);
  331.  
  332. //Штаты сотрудников по департаментам
  333. $procurementStaff = new DepartmentStaff($procurementGroup1, $procurementGroup2, $procurementGroup3, $procurementGroup4, $procurementGroup5);
  334. $salesStaff = new DepartmentStaff($salesGroup1, $salesGroup2, $salesGroup3, $salesGroup4, $salesGroup5);
  335. $advStaff = new DepartmentStaff($advGroup1, $advGroup2, $advGroup3, $advGroup4, $advGroup5);
  336. $logstcStaff = new DepartmentStaff($logstcGroup1, $logstcGroup2, $logstcGroup3, $logstcGroup4);
  337.  
  338. //Департаменты
  339. $procurementDep = new Department("Закупок", $procurementStaff);
  340. $salesDep = new Department("Продаж", $salesStaff);
  341. $advDep = new Department("Рекламы", $advStaff);
  342. $logstcDep = new Department("Логистики", $logstcStaff);
  343.  
  344. //Компания
  345. $company = new Company("Вектор", $procurementDep, $salesDep, $advDep, $logstcDep);
  346.  
  347. //Вывод отчета
  348. function displayReport(Company $company){
  349.  
  350. $col1 = 15;
  351. $col2 = 10;
  352. $col3 = 10;
  353. $col4 = 10;
  354. $col5 = 10;
  355. $col6 = 12;
  356.  
  357. echo padRight("Департамент", $col1) .
  358. padLeft("Сотр.", $col2) .
  359. padLeft("Тугр.", $col3) .
  360. padLeft("Кофе", $col4) .
  361. padLeft("Стр.", $col5) .
  362. padLeft("Тугр./стр.", $col6) . "\n\n";
  363.  
  364. $allEmployees = 0;
  365. $allSalary = 0;
  366. $allCoffee = 0;
  367. $allPages = 0;
  368. $allTugPerPgs = 0;
  369.  
  370. foreach ($company->getDepartments() as $department) {
  371.  
  372. echo padRight($department->getNameOfDept(), $col1) .
  373. padLeft($department->getNumOfEmployees(), $col2) .
  374. padLeft($department->getSalaryOfEmployees(), $col3) .
  375. padLeft($department->getDrunkCoffee(), $col4) .
  376. padLeft($department->getPagesOfDocs(), $col5) .
  377. padLeft($department->getTugricsPerPage(), $col6) . "\n";
  378.  
  379. $allEmployees += $department->getNumOfEmployees();
  380. $allSalary += $department->getSalaryOfEmployees();
  381. $allCoffee += $department->getDrunkCoffee();
  382. $allPages += $department->getPagesOfDocs();
  383. $allTugPerPgs += $department->getTugricsPerPage();
  384. }
  385.  
  386. $numOfDepartments = count($company->getDepartments());
  387.  
  388. echo padRight("Среднее", $col1) .
  389. padLeft(round(($allEmployees / $numOfDepartments),1), $col2) .
  390. padLeft(round(($allSalary / $numOfDepartments), 1), $col3) .
  391. padLeft(round(($allCoffee / $numOfDepartments), 1), $col4) .
  392. padLeft(round(($allPages / $numOfDepartments), 1), $col5) .
  393. padLeft(round(($allTugPerPgs / $numOfDepartments), 1), $col6) . "\n";
  394.  
  395. echo padRight("Всего", $col1) .
  396. padLeft($allEmployees, $col2) .
  397. padLeft($allSalary, $col3) .
  398. padLeft($allCoffee, $col4) .
  399. padLeft($allPages, $col5) .
  400. padLeft($allTugPerPgs, $col6) . "\n\n";
  401. }
  402.  
  403. //До введения мер
  404.  
  405. echo "До введения мер:\n";
  406. displayReport($company);
  407.  
  408. //План 1
  409.  
  410. foreach ($company->getDepartments() as $department) {
  411. $sortedEngs = [];
  412. $numOfEng = 0;
  413. $staff = $department->getDepartmentStaff();
  414. $groups = $staff->getEmployeeTypes();
  415. foreach ($groups as $group) { /*считаем и сохраняем инженеров*/
  416. list($num, $position) = $group->getEmployee();
  417. if (is_a($position, "Engineer") and !($position->isBoss())) {
  418. $numOfEng += $num;
  419. $sortedEngs[$position->getRank()] = $group;
  420. }
  421. }
  422. $numOfFiredEng = round($numOfEng * 0.4);
  423. ksort($sortedEngs); /*отсортируем по рангу*/
  424. if ($numOfFiredEng > 0) { /*увольняем сколько нужно*/
  425. while (true) {
  426. foreach ($sortedEngs as $group) {
  427. list($num, $position) = $group->getEmployee();
  428. if (!($position->isBoss())) {
  429. $department->fireEmployee($position);
  430. $numOfFiredEng--;
  431. if ($numOfFiredEng == 0) {
  432. break 2;
  433. }
  434. }
  435. }
  436. }
  437. }
  438. }
  439.  
  440. echo "План 1:\n";
  441. displayReport($company);
  442.  
  443. //Вернем начальные значения
  444. $advGroup4->addEmployee();
  445. $logstcGroup3->addEmployee(2);
  446.  
  447. //План 2
  448.  
  449. foreach ($company->getDepartments() as $department) {
  450. $staff = $department->getDepartmentStaff();
  451. $groups = $staff->getEmployeeTypes();
  452. foreach ($groups as $key=>$group) { /*Меняем зп и литры кофе аналитикам*/
  453. list($num, $position) = $group->getEmployee();
  454. if (is_a($position, "Analyst")) {
  455. $position->setRate(1100);
  456. $position->setCoffee(75);
  457. }
  458. }
  459. }
  460.  
  461. $analystBoss = null;
  462. foreach ($company->getDepartments() as $department) {
  463. $analysts = [];
  464. $analystWasFinded = false;
  465. $staff = $department->getDepartmentStaff();
  466. $groups = $staff->getEmployeeTypes();
  467. foreach ($groups as $key=>$group) { /*Сохраняем аналитиков*/
  468. list($num, $position) = $group->getEmployee();
  469. if (is_a($position, "Analyst")) {
  470. $analysts[$position->getRank()] = [$position, $group];
  471. $analystWasFinded = true;
  472. }
  473. }
  474. if ($analystWasFinded){ /*Если анал-ки были текущего босса делаем не боссом*/
  475. foreach ($groups as $group) {
  476. list($num, $position) = $group->getEmployee();
  477. if ($position->isBoss()) {
  478. $position->setBossStatus(false);
  479. }
  480. }
  481. krsort($analysts);/*сортируем анал-ов по рангу*/
  482. list($position, $group) = current($analysts);
  483. $department->fireEmployee($position);/*увольняем высшего и снова нанимаем уже как босса*/
  484. list($rate, $litresOfCoffee, $pgsOfDocs, $rank) = $position->getAllProperties();
  485. $analystBoss = new Analyst($rate, $litresOfCoffee, $pgsOfDocs, $rank, true);
  486. $department->addEmployee(1, $analystBoss);
  487. }
  488. }
  489.  
  490. echo "План 2:\n";
  491. displayReport($company);
  492.  
  493. //вернем начальные значения
  494. $salesDep->fireEmployee($analystBoss);
  495. $marketer2boss->setBossStatus(true);
  496. $analyst1->setRate(800);
  497. $analyst1->setCoffee(50);
  498. $analyst2->setRate(800);
  499. $analyst2->setCoffee(50);
  500. $salesGroup4->addEmployee();
  501.  
  502. //План 3
  503. $addedEmplGroups = [];
  504. foreach ($company->getDepartments() as $department) {
  505. $elevatedEmployees = [];
  506. $numOfMan = 0;
  507. $objectsWasCopied = false;
  508. $staff = $department->getDepartmentStaff();
  509. $groups = $staff->getEmployeeTypes();
  510. foreach ($groups as $key=>$group) { /*Считаем мен-ов 1 2 ранга*/
  511. list($num, $position) = $group->getEmployee();
  512. if (is_a($position, "Manager")) {
  513. if ($position->getRank() == 1 or $position->getRank() == 2) {
  514. $numOfMan += $num;
  515. }
  516. }
  517. }
  518. $numOfFiredMan = round($numOfMan * 0.5);
  519. $numOfNewMan = $numOfFiredMan;
  520. $key = $numOfNewMan;
  521. $addedEmplTypes = [];
  522. if ($numOfMan > 0) {
  523. while (true) { /*Уволим мен-ов 1 2 ранга и скопируем эти позиции*/
  524. foreach ($groups as $group) {
  525. list($num, $position) = $group->getEmployee();
  526. if (is_a($position, "Manager")) {
  527. if ($position->getRank() == 1 or $position->getRank() == 2) {
  528. if ($num == 0) {
  529. continue;
  530. }
  531. if(!$objectsWasCopied){
  532. $elevatedEmployees[] = new EmployeeGroup(0, $position);
  533. }
  534. $group->removeEmployee();
  535. $numOfFiredMan--;
  536. if ($numOfFiredMan == 0) {
  537. break 2;
  538. }
  539. }
  540. }
  541. }
  542. $objectsWasCopied = true;
  543. }
  544. /*скопированным группам добавим число сотрудников(уволенные = нанятые снова)*/
  545. while (true) {
  546. foreach ($elevatedEmployees as $employee) {
  547. list($num, $position) = $employee->getEmployee();
  548. if ($position->isBoss() and $num == 1) {
  549. continue;
  550. } else {
  551. $employee->addEmployee();
  552. $numOfNewMan--;
  553. }
  554. if ($numOfNewMan == 0) {
  555. break 2;
  556. }
  557. }
  558. }
  559. /*Добавим в департамент эти группы увеличив им ранг*/
  560. foreach ($elevatedEmployees as $employee) {
  561. list($num, $position) = $employee->getEmployee();
  562. list($rate, $litresOfCoffee, $pgsOfDocs, $rank, $boss) = $position->getAllProperties();
  563. $position = new Manager($rate, $litresOfCoffee, $pgsOfDocs, ++$rank, $boss);
  564. $addedEmplTypes[] = new EmployeeGroup($num, $position);
  565. $department->addEmployee($num, $position);
  566. }
  567. }
  568. $addedEmplGroups[$key] = $addedEmplTypes;
  569. }
  570.  
  571. echo "План 3:\n";
  572. displayReport($company);
  573.  
  574. //вернем обратно
  575. $departments = $company->getDepartments();
  576.  
  577. foreach ($addedEmplGroups as $numOfAddedEmpls=>$addedGroups) {
  578. if ($numOfAddedEmpls == 0) {
  579. continue;
  580. } else {
  581. $department = current($departments);
  582. $staff = $department->getDepartmentStaff();
  583. foreach ($addedGroups as $group) {
  584. $staff->removeEmployeeType($group);
  585. }
  586. $groups = $staff->getEmployeeTypes();
  587. while (true) {
  588. foreach ($groups as $group) {
  589. list($num, $position) = $group->getEmployee();
  590. if (is_a($position, "Manager")) {
  591. if ($position->getRank() == 1 or $position->getRank() == 2) {
  592. if ($position->isBoss() and $num == 1) {
  593. continue;
  594. } else {
  595. $group->addEmployee();
  596. $numOfAddedEmpls--;
  597. }
  598. if ($numOfAddedEmpls == 0) {
  599. break 2;
  600. }
  601. }
  602. }
  603. }
  604. }
  605. $department = next($departments);
  606. }
  607. }
  608.  
  609. //displayReport($company);
Success #stdin #stdout 0.02s 24788KB
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       427      3850           3
Среднее              25.3   12709.4     490.5    3931.3         3.3
Всего                 101   50837.5      1962     15725        13.2

План 1:
Департамент         Сотр.     Тугр.      Кофе      Стр.  Тугр./стр.

Закупок                17    9612.5       350      3100         3.1
Продаж                 24     13550       610      3325         4.1
Рекламы                35     16100       570      5400           3
Логистики              22     10975       417      3750         2.9
Среднее              24.5   12559.4     486.8    3893.8         3.3
Всего                  98   50237.5      1947     15575        13.1

План 2:
Департамент         Сотр.     Тугр.      Кофе      Стр.  Тугр./стр.

Закупок                17    9612.5       350      3100         3.1
Продаж                 24   15637.5       795      3470         4.5
Рекламы                36     16300       575      5450           3
Логистики              24     11375       427      3850           3
Среднее              25.3   13231.3     536.8    3967.5         3.4
Всего                 101     52925      2147     15870        13.6

План 3:
Департамент         Сотр.     Тугр.      Кофе      Стр.  Тугр./стр.

Закупок                17     10550       350      3100         3.4
Продаж                 24     14300       610      3325         4.3
Рекламы                36     16800       575      5450         3.1
Логистики              24   12687.5       427      3850         3.3
Среднее              25.3   13584.4     490.5    3931.3         3.5
Всего                 101   54337.5      1962     15725        14.1