<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Doctrine\Persistence\ManagerRegistry;
use Psr\Log\LoggerInterface;
class ListController extends AbstractController
{
/**
* @Route("/list", name="list")
*/
public function index(Request $request, ManagerRegistry $doctrine, LoggerInterface $logger)
{
$query = "SELECT `name`, `ucode` from `user` WHERE `active` = 1";
$data = self::queryToDb($doctrine, $query);
return $this->render('list/index.html.twig', ['users' => $data]);
}
private function get_data($uid, $begin_date, $end_date, ManagerRegistry $doctrine, LoggerInterface $logger)
{
$result = [];
$result['late'] = 0;
$result['early_leave'] = 0;
$result['grid_fact'] = [];
$result['grid_work'] = [];
// Вытащим введённые отработки и комментарии
$query = "SELECT * from `work` WHERE `ucode` = '$uid' AND `dolg_date` BETWEEN '$begin_date' AND '$end_date' ORDER BY `dolg_date` ASC";
$data = self::queryToDb($doctrine, $query);
foreach ($data as $id => $el)
{
try
{
$row = [
'dbId' => $el['id'],
'dolgDate' => date('d.m.Y', strtotime($el['dolg_date'])),
'workDate' => ($el['work_date'] != '') ? date('d.m.Y', strtotime($el['work_date'])) : '',
'workTime' => ($el['work_time'] != '') ? date('H:i', strtotime($el['work_time'])) : '',
'type' => $el['type'],
'comment' => $el['comment']
];
}
catch (\Exception $e)
{
$logger->error($e->getMessage());
return new JsonResponse([]);
}
$result['grid_work'][$id] = $row;
$grid_work[$el['dolgDate']][] = $row;
}
$query = "
SELECT * from `fact`
WHERE `fact`.`ucode` = '$uid' AND
`fact`.`date` BETWEEN '$begin_date' AND '$end_date'
ORDER BY `fact`.`date` ASC";
$data = self::queryToDb($doctrine, $query);
$nullTime = strtotime('00:00:00');
$query = "
SELECT * from `work`
WHERE `work`.`ucode` = '$uid' AND
`work`.`work_date` BETWEEN '$begin_date' AND '$end_date'
ORDER BY `work`.`work_date` ASC";
$dbWork = self::queryToDb($doctrine, $query);
$arWork = [];
$arDolg = [];
foreach ($dbWork as $row)
{
$workTime = strtotime($row['work_time']) - $nullTime;
if (!isset($arWork[$row['work_date']]))
{
$arWork[$row['work_date']] = 0;
}
$arWork[$row['work_date']] += $workTime;
if (!isset($arDolg[$row['dolg_date']])) {
$arDolg[$row['dolg_date']] = ['type' => '', 'time' => 0];
}
$arDolg[$row['dolg_date']]['type'] = $row['type'];
$arDolg[$row['dolg_date']]['time'] += $workTime;
}
// вытащим дни-исключения
$query = "SELECT * FROM `exception_day` WHERE `date` BETWEEN '$begin_date' AND '$end_date'";
$arrExceptionsDay = self::queryToDb($doctrine, $query);
$dateCol = array_column($arrExceptionsDay, 'date');
foreach ($data as $id => $el)
{
try
{
$indexExDate = array_search($el['date'], $dateCol);
$type = 0;
if ($indexExDate !== false)
{
$type = $arrExceptionsDay[$indexExDate]['type'];
}
elseif (date('N', strtotime($el['date'])) > 5)
{
$type = 1;
}
$in = (!is_null($el['entry_datetime'])) ? date('H:i', strtotime($el['entry_datetime'])) : '';
$out = (!is_null($el['exit_datetime'])) ? date('H:i', strtotime($el['exit_datetime'])) : '';
$norm = (!is_null($el['norma'])) ? date('H:i', strtotime($el['norma'])) : '';
$raw = (!is_null($el['inside_time_raw'])) ? date('H:i', strtotime($el['inside_time_raw'])) : '';
$fact = (!is_null($el['inside_time'])) ? date('H:i', strtotime($el['inside_time'])) : '';
$miss = (!is_null($el['outside_time'])) ? date('H:i', strtotime($el['outside_time'])) : '';
// Здесь должна быть магия с закрытием долга, если вдруг что-то было.
$manualType = 0;
if (isset($grid_work[$el['date']]) && is_array($grid_work[$el['date']])) {
foreach ($grid_work[$el['date']] as $workData) {
$manualType = $workData['type'];
}
}
$rework = 0;
$restTime = 0;
$wType = 0;
if (isset($arDolg[$el['date']])) {
$wType = $arDolg[$el['date']]['type'];
}
if ($el['balance'] > 0)
{
$rework = $el['balance'];
$restTime = $rework;
if (isset($arWork[$el['date']])) {
$restTime -= $arWork[$el['date']];
}
}
$row = [
'dateType' => $type,
'date' => date('d.m.Y', strtotime($el['date'])),
'in' => ($in != '00:00') ? $in : '',
'out' => ($out != '00:00') ? $out : '',
'norm' => ($norm != '00:00') ? $norm : '',
'raw' => ($raw != '00:00') ? $raw : '',
'fact' => ($fact != '00:00') ? $fact : '',
'miss' => ($miss != '00:00') ? $miss : '',
'late' => ($el['late'] > 0 && $wType < 1) ? $el['late'] : '',
'leave' => ($el['early_leave'] > 0 && $wType < 1) ? $el['early_leave'] : '',
'dolg' => ($el['balance'] >= 0) ? '' : date('H:i', (-1) * $el['balance']),
'rework' => ($rework > 0) ? date('H:i', $rework) : '',
'manualType' => $manualType,
'restTime' => ($restTime > 0) ? date('H:i', $restTime) : '',
];
}
catch (\Exception $e)
{
$logger->error($e->getMessage());
return new JsonResponse([]);
}
$result['late'] += $el['late'];
$result['early_leave'] += $el['early_leave'];
$result['grid_fact'][$id] = $row;
}
return $result;
}
/**
* @Route("/list/ajax")
* Основная отрисовка таблиц
*/
public function ajaxAction(Request $request, ManagerRegistry $doctrine, LoggerInterface $logger) {
if ($request->isXmlHttpRequest() || $request->query->get('showJson') == 1)
{
$uid = $request->request->get('uid');
$begin_date = $request->request->get('begin_date');
$end_date = $request->request->get('end_date');
$result = $this->get_data($uid, $begin_date, $end_date, $doctrine, $logger);
return new JsonResponse($result);
}
else
{
return $this->render('list/index.html.twig', []);
}
}
/**
* @Route("/list/context_ajax")
* Отработка пункта контекстного меню
*/
public function contextAction(Request $request, ManagerRegistry $doctrine, LoggerInterface $logger) {
if ($request->isXmlHttpRequest() || $request->query->get('showJson') == 1)
{
$error = true;
$result = [];
$type = $request->request->get('type');
$ucode = $request->request->get('ucode');
$dolgDate = $request->request->get('dolgDate');
$begin_date = $request->request->get('begin_date');
$end_date = $request->request->get('end_date');
if (!is_null($type) && !is_null($ucode) && !is_null($dolgDate) && !is_null($begin_date) && !is_null($end_date))
{
$dolgDate = date('Y-m-d', strtotime($dolgDate));
$begin_date = date('Y-m-d', strtotime($begin_date));
$end_date = date('Y-m-d', strtotime($end_date));
$comment = $request->request->get('comment');
switch ($type)
{
case '10':
$dolgTime = $request->request->get('dolgTime');
$workDate = $request->request->get('workDate');
$workTime = $request->request->get('workTime');
if (strlen($workDate) > 0 && strlen($workTime) > 0 && strlen($dolgTime) > 0)
{
$workDate = date('Y-m-d', strtotime($workDate));
$workTime = strtotime($workTime);
$dolgTime = strtotime($dolgTime);
$restTime = $dolgTime - $workTime;
$workTime = date('H:i:s', $workTime);
$dolgTime = date('H:i:s', $dolgTime);
$restTime = date('H:i:s', $restTime);
$query = "INSERT INTO `work`
(
`ucode`,
`dolgDate`,
`workDate`,
`workTime`,
`type`,
`comment`
)
VALUES
(
'". $ucode . "',
'". $dolgDate . "',
'". $workDate . "',
'". $workTime . "',
'". $type . "',
'". $comment . "'
);";
$error = false;
}
break;
case 'del_dolg':
$query = "DELETE FROM `work` WHERE `work`.`ucode` = '" . $ucode . "' AND `work`.`dolgDate` = '" . $dolgDate . "';";
$error = false;
break;
case 'del_id':
$id = $request->request->get('id');
if (intval($id) > 0)
{
$query = "DELETE FROM `work` WHERE `work`.`id` = '" . $id . "';";
$error = false;
}
file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/LOG.LOG', print_r($query, true));
break;
default:
$query = "INSERT INTO `work`
(
`ucode`,
`dolgDate`,
`type`,
`comment`
)
VALUES
(
'". $ucode . "',
'". $dolgDate . "',
'". $type . "',
'". $comment . "'
);";
$error = false;
}
if (!$error)
{
self::queryToDb($doctrine, $query);
$result = $this->get_data($ucode, $begin_date, $end_date, $doctrine, $logger);
}
}
}
return new JsonResponse(['result' => $result, 'error' => $error]);
}
private static function queryToDb($doctrine, $query)
{
$result = [];
$conn = $doctrine->getConnection();
$stmt = $conn->prepare($query);
$rs = $stmt->execute();
$result = $rs->fetchAllAssociative();
return $result;
}
}