src/Controller/DefaultController.php line 39

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\AssignedBadge;
  4. use App\Entity\Badge;
  5. use App\Entity\CompanyOrder;
  6. use App\Entity\ErrorStamped;
  7. use App\Entity\Operator;
  8. use App\Entity\Stamped;
  9. use App\Form\StampedInOutType;
  10. use App\Form\StampedMensaType;
  11. use App\Repository\StampedRepository;
  12. use App\Utils\DateTimeUtils;
  13. use Doctrine\Persistence\ManagerRegistry;
  14. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  15. use Symfony\Component\Config\Definition\Exception\Exception;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. class DefaultController extends AbstractController
  22. {
  23. private $doctrine;
  24. public function __construct(ManagerRegistry $doctrine)
  25. {
  26. $this->doctrine = $doctrine;
  27. }
  28. /**
  29. * @Route("/", name="home", methods={"GET","POST"})
  30. * @param StampedRepository $stampedRepository
  31. * @return Response
  32. * @throws \Exception
  33. */
  34. public function index(StampedRepository $stampedRepository): Response
  35. {
  36. if ($this->isGranted("ROLE_ADMIN_EMZA")) {
  37. return $this->redirectToRoute('stamped_index', ['page' => '1', 'companyOrderType' => CompanyOrder::TYPE_EMZA]);
  38. } elseif ($this->isGranted("ROLE_ADMIN")) {
  39. return $this->redirectToRoute('stamped_index', ['page' => '1', 'companyOrderType' => CompanyOrder::TYPE_CANTIERE]);
  40. }elseif ($this->isGranted("ROLE_ADMIN_MENSA")) {
  41. return $this->redirectToRoute('stamped_index', ['page' => '1', 'companyOrderType' => CompanyOrder::TYPE_MENSA]);
  42. }elseif ($this->isGranted("ROLE_ADMIN_CANTIERE")) {
  43. return $this->redirectToRoute('stamped_index', ['page' => '1', 'companyOrderType' => CompanyOrder::TYPE_CANTIERE]);
  44. } elseif ($this->isGranted("ROLE_MENSA")) {
  45. $form = $this->createForm(StampedMensaType::class);
  46. $userCompanyOrder = $this->get('security.token_storage')->getToken()->getUser()->getCompanyOrder();
  47. return $this->render('default/home-mensa.html.twig', [
  48. 'form' => $form->createView(),
  49. 'userCompany' => $userCompanyOrder,
  50. ]);
  51. } else {
  52. $form = $this->createForm(StampedInOutType::class);
  53. $userCompanyOrder = $this->get('security.token_storage')->getToken()->getUser()->getCompanyOrder();
  54. return $this->render('default/home.html.twig', [
  55. 'form' => $form->createView(),
  56. 'userCompany' => $userCompanyOrder,
  57. ]);
  58. }
  59. }
  60. /**
  61. * @Route("/ajax/timbra", name="timbra_ajax", methods={"POST"})
  62. * @param Request $request
  63. * @return Response
  64. * @throws \Exception
  65. */
  66. public function timbraAjax(Request $request): Response
  67. {
  68. $datas = $request->request->get('data');
  69. $result = new JsonResponse(['Inizializzo il result'], Response::HTTP_BAD_REQUEST);
  70. try {
  71. if (array_key_exists('type', $datas)) {
  72. $typeForm = StampedMensaType::class;
  73. $data = [
  74. 'stamped_in_out[Badge' => $datas['stamped_mensa[Badge'],
  75. 'stamped_in_out[InOut' => $datas['stamped_mensa[InOut'],
  76. 'stamped_in_out[date' => DateTimeUtils::getNow(),
  77. ];
  78. $result = $this->saveTimbrate($data, $typeForm, 'Mensa');
  79. } else {
  80. $typeForm = StampedInOutType::class;
  81. foreach ($datas as $data) {
  82. $result = $this->saveTimbrate($data, $typeForm, 'Cantiere');
  83. }
  84. }
  85. } catch (\Exception $ex) {
  86. $result = new JsonResponse(['Non ci sono dati da processare'], Response::HTTP_BAD_REQUEST);
  87. }
  88. return $result;
  89. }
  90. /**
  91. * @param $data
  92. * @param $typeForm
  93. * @param $t
  94. * @return JsonResponse
  95. * @throws \Exception
  96. */
  97. public function saveTimbrate($data, $typeForm, $t): JsonResponse
  98. {
  99. $form = $this->createForm($typeForm);
  100. $form->submit($data);
  101. if ($form->isSubmitted() && $form->isValid()) {
  102. $actionForm = $data['stamped_in_out[InOut'];
  103. $badgeForm = $data['stamped_in_out[Badge'];
  104. $entityManager = $this->doctrine->getManager();
  105. $userCompanyOrder = $this->get('security.token_storage')->getToken()->getUser()->getCompanyOrder();
  106. $assignedBadgeRepository = $entityManager->getRepository(AssignedBadge::class);
  107. $badgeRepository = $entityManager->getRepository(Badge::class);
  108. $stampedRepository = $entityManager->getRepository(Stamped::class);
  109. $errorStamped = new ErrorStamped();
  110. $errorStamped->setCompanyOrder($userCompanyOrder);
  111. $errorStamped->setCodBadge($badgeForm);
  112. $stamped = new Stamped();
  113. /** @var Badge $badge */
  114. $badge = $badgeRepository->findOneBy(['codBadge' => $badgeForm]);
  115. $dataIn = DateTimeUtils::getNow();
  116. $dataOut = DateTimeUtils::getNow();
  117. try {
  118. if ($data['stamped_in_out[date']) {
  119. if ($actionForm === 'in') {
  120. $dataIn = $t === 'Cantiere' ? new \DateTime($data['stamped_in_out[date']) : DateTimeUtils::getNow();
  121. } elseif ($actionForm === 'out') {
  122. $dataOut = $t === 'Cantiere' ? new \DateTime($data['stamped_in_out[date']) : DateTimeUtils::getNow();;
  123. }
  124. }
  125. } catch (Exception $e) {
  126. return new JsonResponse(['error' => 'Non ci sono settate le date di timbrata'], Response::HTTP_BAD_REQUEST);
  127. }
  128. if ($badge) {
  129. $idBadge = $badge->getId();
  130. /** @var AssignedBadge $assignedBadge */
  131. $assignedBadge = $assignedBadgeRepository->findOneBy(['badge' => $idBadge]);
  132. if ($assignedBadge) {
  133. $operatorBadge = $assignedBadge->getOperator()->getId();
  134. $operatorRepository = $entityManager->getRepository(Operator::class);
  135. /** @var Operator $op */
  136. $op = $operatorRepository->findOneBy(['id' => $operatorBadge]);
  137. if ($actionForm === 'out') {
  138. /** @var Stamped $stamped */
  139. $stamped = $stampedRepository->getStamped($userCompanyOrder, $operatorBadge);
  140. if ($stamped) {
  141. // Controllo duplicati nelle 4 ore precedenti
  142. $stampedRecent = $stampedRepository->getStampedWithinFourHoursRelease($userCompanyOrder, $operatorBadge);
  143. if (!$stampedRecent) {
  144. $stamped->setReleaseDate($dataOut);
  145. }
  146. // Non salviamo se esiste un duplicato, ma non bloccamo l'esecuzione
  147. } else {
  148. /** @var Stamped $stampedWithinFourHours */
  149. $stampedWithinFourHours = $stampedRepository->getStampedWithinFourHoursRelease($userCompanyOrder, $operatorBadge);
  150. if ($stampedWithinFourHours and $op->getIsMulti() === false and $this->isGranted("ROLE_MENSA")) {
  151. return new JsonResponse(['Non puoi mangiare in mensa piu volte nel giro di poco'], Response::HTTP_BAD_REQUEST);
  152. }
  153. // Crea una nuova timbrata se non esiste duplicato nelle 4 ore precedenti OPPURE se operatore è multi per mensa
  154. if (!$stampedWithinFourHours || ($op->getIsMulti() === true && $this->isGranted("ROLE_MENSA"))) {
  155. $stamped = new Stamped();
  156. $stamped->setCompanyOrder($userCompanyOrder);
  157. $stamped->setOperator($op);
  158. $stamped->setReleaseDate($dataOut);
  159. $stamped->setStatus(Stamped::STATUS_ERROR);
  160. } else {
  161. // Se esiste un duplicato e non è multi, non creiamo un nuovo record
  162. $stamped = null;
  163. }
  164. }
  165. } elseif ($actionForm === 'in') {
  166. /** @var Stamped $stampedWithinFourHours */
  167. $stampedWithinFourHours = $stampedRepository->getStampedWithinFourHoursEntry($userCompanyOrder, $operatorBadge);
  168. if ($stampedWithinFourHours and $op->getIsMulti() === false and $this->isGranted("ROLE_MENSA")) {
  169. return new JsonResponse(['Non puoi mangiare in mensa piu volte nel giro di poco'], Response::HTTP_BAD_REQUEST);
  170. }
  171. // Crea una timbrata se non esiste duplicato nelle 4 ore precedenti OPPURE se operatore è multi per mensa
  172. if (!$stampedWithinFourHours || ($op->getIsMulti() === true && $this->isGranted("ROLE_MENSA"))) {
  173. $stamped->setEntryDate($dataIn);
  174. $stamped->setCompanyOrder($userCompanyOrder);
  175. $stamped->setOperator($op);
  176. if ($this->isGranted("ROLE_MENSA")) {
  177. $stamped->setReleaseDate($dataIn);
  178. }
  179. } else {
  180. // Se esiste un duplicato e non è multi, non creiamo un nuovo record
  181. $stamped = null;
  182. }
  183. }
  184. // Salvo solo se stamped non è null (non è un duplicato)
  185. if ($stamped !== null) {
  186. $entityManager->persist($stamped);
  187. $entityManager->flush();
  188. }
  189. } else {
  190. $errorStamped->setNBadge($badge->getNBadge());
  191. if ($actionForm === 'out') {
  192. $errorStamped->setReleaseDate($dataOut);
  193. } elseif ($actionForm === 'in') {
  194. $errorStamped->setEntryDate($dataIn);
  195. if ($this->isGranted("ROLE_MENSA")) {
  196. return new JsonResponse(['Non sei registrato, richiedere al responsabile l inserimento a sistema'], Response::HTTP_BAD_REQUEST);
  197. }
  198. }
  199. $errorStamped->setType(ErrorStamped::TYPE_ERROR_ASSIGNED);
  200. $entityManager->persist($errorStamped);
  201. $entityManager->flush();
  202. }
  203. } else {
  204. if ($actionForm === 'out') {
  205. $errorStamped->setReleaseDate($dataOut);
  206. } elseif ($actionForm === 'in') {
  207. $errorStamped->setEntryDate($dataIn);
  208. if ($this->isGranted("ROLE_MENSA")) {
  209. return new JsonResponse(['Non sei registrato, richiedere al responsabile l inserimento a sistema'], Response::HTTP_BAD_REQUEST);
  210. }
  211. }
  212. $errorStamped->setType(ErrorStamped::TYPE_ERROR_ASSIGNED);
  213. $entityManager->persist($errorStamped);
  214. $entityManager->flush();
  215. }
  216. } else {
  217. return new JsonResponse(['Il form non è valido contattare l amministratore'], Response::HTTP_BAD_REQUEST);
  218. }
  219. if ($stamped && $badge && $this->isGranted("ROLE_MENSA") && $stamped->getId()) {
  220. return new JsonResponse([
  221. 'ok',
  222. 'stampedId' => $stamped->getId(),
  223. 'badgeStamped' => $badge->getNBadge(),
  224. 'codOperator' => $stamped->getOperator()->getId(),
  225. 'dataStamped' => $stamped->getCreatedAt()->format('d-m-Y H:i:s')
  226. ], Response::HTTP_OK);
  227. } else {
  228. return new JsonResponse(['ok'], Response::HTTP_OK);
  229. }
  230. }
  231. /**
  232. * @Route("/delete-multiple-ids", name="delete_multiple_ids", methods={"DELETE"})
  233. * @IsGranted ("ROLE_ADMIN")
  234. *
  235. * @param Request $request
  236. * @return Response
  237. */
  238. public function deleteAjax(Request $request): Response
  239. {
  240. if (!$request->request->get('type')) {
  241. return new JsonResponse(['Error, missing type parameter'], Response::HTTP_BAD_REQUEST);
  242. }
  243. $ids = $request->request->get('ids');
  244. if (!$ids || !is_array($request->request->get('ids'))) {
  245. return new JsonResponse(['Error ids not valid'], Response::HTTP_BAD_REQUEST);
  246. }
  247. switch ($request->request->get('type')) {
  248. case 'stamped':
  249. $result = $this->deleteMultipleIds($ids, Stamped::class);
  250. break;
  251. default:
  252. return new JsonResponse(['Error, this type is not registered'], Response::HTTP_BAD_REQUEST);
  253. }
  254. return $result ? new JsonResponse(['ok'], Response::HTTP_OK) : new JsonResponse(['Error while deleting records'], Response::HTTP_BAD_REQUEST);
  255. }
  256. private function deleteMultipleIds(array $ids, $className)
  257. {
  258. try {
  259. $qb = $this->doctrine->getManager()->createQueryBuilder();
  260. $qb->delete($className, 'e')
  261. ->andWhere('e.id IN (:id)')
  262. ->setParameter('id', $ids);
  263. return $qb->getQuery()->execute();
  264. } catch (Exception $e) {
  265. return false;
  266. }
  267. }
  268. }