src/Controller/ListController.php line 17

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Doctrine\Persistence\ManagerRegistry;
  8. use Psr\Log\LoggerInterface;
  9. class ListController extends AbstractController
  10. {
  11. /**
  12. * @Route("/list", name="list")
  13. */
  14. public function index(Request $request, ManagerRegistry $doctrine, LoggerInterface $logger)
  15. {
  16. $query = "SELECT `name`, `ucode` from `user` WHERE `active` = 1";
  17. $data = self::queryToDb($doctrine, $query);
  18. return $this->render('list/index.html.twig', ['users' => $data]);
  19. }
  20. private function get_data($uid, $begin_date, $end_date, ManagerRegistry $doctrine, LoggerInterface $logger)
  21. {
  22. $result = [];
  23. $result['late'] = 0;
  24. $result['early_leave'] = 0;
  25. $result['grid_fact'] = [];
  26. $result['grid_work'] = [];
  27. // Вытащим введённые отработки и комментарии
  28. $query = "SELECT * from `work` WHERE `ucode` = '$uid' AND `dolg_date` BETWEEN '$begin_date' AND '$end_date' ORDER BY `dolg_date` ASC";
  29. $data = self::queryToDb($doctrine, $query);
  30. foreach ($data as $id => $el)
  31. {
  32. try
  33. {
  34. $row = [
  35. 'dbId' => $el['id'],
  36. 'dolgDate' => date('d.m.Y', strtotime($el['dolg_date'])),
  37. 'workDate' => ($el['work_date'] != '') ? date('d.m.Y', strtotime($el['work_date'])) : '',
  38. 'workTime' => ($el['work_time'] != '') ? date('H:i', strtotime($el['work_time'])) : '',
  39. 'type' => $el['type'],
  40. 'comment' => $el['comment']
  41. ];
  42. }
  43. catch (\Exception $e)
  44. {
  45. $logger->error($e->getMessage());
  46. return new JsonResponse([]);
  47. }
  48. $result['grid_work'][$id] = $row;
  49. $grid_work[$el['dolgDate']][] = $row;
  50. }
  51. $query = "
  52. SELECT * from `fact`
  53. WHERE `fact`.`ucode` = '$uid' AND
  54. `fact`.`date` BETWEEN '$begin_date' AND '$end_date'
  55. ORDER BY `fact`.`date` ASC";
  56. $data = self::queryToDb($doctrine, $query);
  57. $nullTime = strtotime('00:00:00');
  58. $query = "
  59. SELECT * from `work`
  60. WHERE `work`.`ucode` = '$uid' AND
  61. `work`.`work_date` BETWEEN '$begin_date' AND '$end_date'
  62. ORDER BY `work`.`work_date` ASC";
  63. $dbWork = self::queryToDb($doctrine, $query);
  64. $arWork = [];
  65. $arDolg = [];
  66. foreach ($dbWork as $row)
  67. {
  68. $workTime = strtotime($row['work_time']) - $nullTime;
  69. if (!isset($arWork[$row['work_date']]))
  70. {
  71. $arWork[$row['work_date']] = 0;
  72. }
  73. $arWork[$row['work_date']] += $workTime;
  74. if (!isset($arDolg[$row['dolg_date']])) {
  75. $arDolg[$row['dolg_date']] = ['type' => '', 'time' => 0];
  76. }
  77. $arDolg[$row['dolg_date']]['type'] = $row['type'];
  78. $arDolg[$row['dolg_date']]['time'] += $workTime;
  79. }
  80. // вытащим дни-исключения
  81. $query = "SELECT * FROM `exception_day` WHERE `date` BETWEEN '$begin_date' AND '$end_date'";
  82. $arrExceptionsDay = self::queryToDb($doctrine, $query);
  83. $dateCol = array_column($arrExceptionsDay, 'date');
  84. foreach ($data as $id => $el)
  85. {
  86. try
  87. {
  88. $indexExDate = array_search($el['date'], $dateCol);
  89. $type = 0;
  90. if ($indexExDate !== false)
  91. {
  92. $type = $arrExceptionsDay[$indexExDate]['type'];
  93. }
  94. elseif (date('N', strtotime($el['date'])) > 5)
  95. {
  96. $type = 1;
  97. }
  98. $in = (!is_null($el['entry_datetime'])) ? date('H:i', strtotime($el['entry_datetime'])) : '';
  99. $out = (!is_null($el['exit_datetime'])) ? date('H:i', strtotime($el['exit_datetime'])) : '';
  100. $norm = (!is_null($el['norma'])) ? date('H:i', strtotime($el['norma'])) : '';
  101. $raw = (!is_null($el['inside_time_raw'])) ? date('H:i', strtotime($el['inside_time_raw'])) : '';
  102. $fact = (!is_null($el['inside_time'])) ? date('H:i', strtotime($el['inside_time'])) : '';
  103. $miss = (!is_null($el['outside_time'])) ? date('H:i', strtotime($el['outside_time'])) : '';
  104. // Здесь должна быть магия с закрытием долга, если вдруг что-то было.
  105. $manualType = 0;
  106. if (isset($grid_work[$el['date']]) && is_array($grid_work[$el['date']])) {
  107. foreach ($grid_work[$el['date']] as $workData) {
  108. $manualType = $workData['type'];
  109. }
  110. }
  111. $rework = 0;
  112. $restTime = 0;
  113. $wType = 0;
  114. if (isset($arDolg[$el['date']])) {
  115. $wType = $arDolg[$el['date']]['type'];
  116. }
  117. if ($el['balance'] > 0)
  118. {
  119. $rework = $el['balance'];
  120. $restTime = $rework;
  121. if (isset($arWork[$el['date']])) {
  122. $restTime -= $arWork[$el['date']];
  123. }
  124. }
  125. $row = [
  126. 'dateType' => $type,
  127. 'date' => date('d.m.Y', strtotime($el['date'])),
  128. 'in' => ($in != '00:00') ? $in : '',
  129. 'out' => ($out != '00:00') ? $out : '',
  130. 'norm' => ($norm != '00:00') ? $norm : '',
  131. 'raw' => ($raw != '00:00') ? $raw : '',
  132. 'fact' => ($fact != '00:00') ? $fact : '',
  133. 'miss' => ($miss != '00:00') ? $miss : '',
  134. 'late' => ($el['late'] > 0 && $wType < 1) ? $el['late'] : '',
  135. 'leave' => ($el['early_leave'] > 0 && $wType < 1) ? $el['early_leave'] : '',
  136. 'dolg' => ($el['balance'] >= 0) ? '' : date('H:i', (-1) * $el['balance']),
  137. 'rework' => ($rework > 0) ? date('H:i', $rework) : '',
  138. 'manualType' => $manualType,
  139. 'restTime' => ($restTime > 0) ? date('H:i', $restTime) : '',
  140. ];
  141. }
  142. catch (\Exception $e)
  143. {
  144. $logger->error($e->getMessage());
  145. return new JsonResponse([]);
  146. }
  147. $result['late'] += $el['late'];
  148. $result['early_leave'] += $el['early_leave'];
  149. $result['grid_fact'][$id] = $row;
  150. }
  151. return $result;
  152. }
  153. /**
  154. * @Route("/list/ajax")
  155. * Основная отрисовка таблиц
  156. */
  157. public function ajaxAction(Request $request, ManagerRegistry $doctrine, LoggerInterface $logger) {
  158. if ($request->isXmlHttpRequest() || $request->query->get('showJson') == 1)
  159. {
  160. $uid = $request->request->get('uid');
  161. $begin_date = $request->request->get('begin_date');
  162. $end_date = $request->request->get('end_date');
  163. $result = $this->get_data($uid, $begin_date, $end_date, $doctrine, $logger);
  164. return new JsonResponse($result);
  165. }
  166. else
  167. {
  168. return $this->render('list/index.html.twig', []);
  169. }
  170. }
  171. /**
  172. * @Route("/list/context_ajax")
  173. * Отработка пункта контекстного меню
  174. */
  175. public function contextAction(Request $request, ManagerRegistry $doctrine, LoggerInterface $logger) {
  176. if ($request->isXmlHttpRequest() || $request->query->get('showJson') == 1)
  177. {
  178. $error = true;
  179. $result = [];
  180. $type = $request->request->get('type');
  181. $ucode = $request->request->get('ucode');
  182. $dolgDate = $request->request->get('dolgDate');
  183. $begin_date = $request->request->get('begin_date');
  184. $end_date = $request->request->get('end_date');
  185. if (!is_null($type) && !is_null($ucode) && !is_null($dolgDate) && !is_null($begin_date) && !is_null($end_date))
  186. {
  187. $dolgDate = date('Y-m-d', strtotime($dolgDate));
  188. $begin_date = date('Y-m-d', strtotime($begin_date));
  189. $end_date = date('Y-m-d', strtotime($end_date));
  190. $comment = $request->request->get('comment');
  191. switch ($type)
  192. {
  193. case '10':
  194. $dolgTime = $request->request->get('dolgTime');
  195. $workDate = $request->request->get('workDate');
  196. $workTime = $request->request->get('workTime');
  197. if (strlen($workDate) > 0 && strlen($workTime) > 0 && strlen($dolgTime) > 0)
  198. {
  199. $workDate = date('Y-m-d', strtotime($workDate));
  200. $workTime = strtotime($workTime);
  201. $dolgTime = strtotime($dolgTime);
  202. $restTime = $dolgTime - $workTime;
  203. $workTime = date('H:i:s', $workTime);
  204. $dolgTime = date('H:i:s', $dolgTime);
  205. $restTime = date('H:i:s', $restTime);
  206. $query = "INSERT INTO `work`
  207. (
  208. `ucode`,
  209. `dolgDate`,
  210. `workDate`,
  211. `workTime`,
  212. `type`,
  213. `comment`
  214. )
  215. VALUES
  216. (
  217. '". $ucode . "',
  218. '". $dolgDate . "',
  219. '". $workDate . "',
  220. '". $workTime . "',
  221. '". $type . "',
  222. '". $comment . "'
  223. );";
  224. $error = false;
  225. }
  226. break;
  227. case 'del_dolg':
  228. $query = "DELETE FROM `work` WHERE `work`.`ucode` = '" . $ucode . "' AND `work`.`dolgDate` = '" . $dolgDate . "';";
  229. $error = false;
  230. break;
  231. case 'del_id':
  232. $id = $request->request->get('id');
  233. if (intval($id) > 0)
  234. {
  235. $query = "DELETE FROM `work` WHERE `work`.`id` = '" . $id . "';";
  236. $error = false;
  237. }
  238. file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/LOG.LOG', print_r($query, true));
  239. break;
  240. default:
  241. $query = "INSERT INTO `work`
  242. (
  243. `ucode`,
  244. `dolgDate`,
  245. `type`,
  246. `comment`
  247. )
  248. VALUES
  249. (
  250. '". $ucode . "',
  251. '". $dolgDate . "',
  252. '". $type . "',
  253. '". $comment . "'
  254. );";
  255. $error = false;
  256. }
  257. if (!$error)
  258. {
  259. self::queryToDb($doctrine, $query);
  260. $result = $this->get_data($ucode, $begin_date, $end_date, $doctrine, $logger);
  261. }
  262. }
  263. }
  264. return new JsonResponse(['result' => $result, 'error' => $error]);
  265. }
  266. private static function queryToDb($doctrine, $query)
  267. {
  268. $result = [];
  269. $conn = $doctrine->getConnection();
  270. $stmt = $conn->prepare($query);
  271. $rs = $stmt->execute();
  272. $result = $rs->fetchAllAssociative();
  273. return $result;
  274. }
  275. }