src/Controller/DefaultController.php line 38

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\Routing\Annotation\Route;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Knp\Component\Pager\PaginatorInterface;
  7. use Knp\Snappy\GeneratorInterface;
  8. use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\HttpFoundation\JsonResponse;
  11. use Knp\Snappy\Pdf;
  12. use App\Entity\Meeting;
  13. use Symfony\Component\Serializer\Encoder\CsvEncoder;
  14. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  15. use Symfony\Component\Serializer\Serializer;
  16. use Symfony\Component\Serializer\SerializerInterface;
  17. use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
  18. use Doctrine\Persistence\ManagerRegistry;
  19. use Qipsius\TCPDFBundle\Controller\TCPDFController;
  20. use App\Entity\Joiner;
  21. class DefaultController extends AbstractController
  22. {
  23. protected $managerRegistry;
  24. protected $tcpdf;
  25. public function __construct(ManagerRegistry $managerRegistry, TCPDFController $tcpdf) {
  26. $this->managerRegistry = $managerRegistry;
  27. $this->tcpdf = $tcpdf;
  28. }
  29. /**
  30. * @Route("/default", name="default")
  31. */
  32. public function index(PaginatorInterface $paginator, Request $request)
  33. {
  34. $start = $request->query->get('dateStart');
  35. $end = $request->query->get('dateEnd');
  36. $filterField = $request->query->get('filterField');
  37. $filterValue = $request->query->get('filterValue');
  38. $em = $this->managerRegistry->getManager();
  39. if((!is_null($start) && !is_null($end)) && ($start <= $end)) {
  40. $meetings = $em->getRepository('App\Entity\Meeting')->filterByDate(
  41. new \DateTime($start.' 00:00:00'),
  42. new \DateTime($end.' 23:59:59'),
  43. // is_null($request->query->get('filterValue'))?FALSE:TRUE,
  44. FALSE,
  45. [$filterField => $filterValue]
  46. );
  47. } else {
  48. $meetings = $em->getRepository('App\Entity\Meeting')->findBy([],array(
  49. 'start' => 'DESC'
  50. ));
  51. }
  52. $meetingsPage = $paginator->paginate(
  53. $meetings,
  54. $request->query->getInt('page',1) /*page number*/,
  55. $request->query->getInt('limit',10) /*limit per page*/
  56. );
  57. return $this->render('default/index.html.twig', [
  58. 'meetings' => $meetingsPage,
  59. 'dateStart' => $request->query->get('dateStart'),
  60. 'dateEnd' => $request->query->get('dateEnd')
  61. ]);
  62. }
  63. public function print (Request $request, Pdf $pdf) {
  64. $em = $this->managerRegistry->getManager();
  65. $start = $request->request->get('dateStart');
  66. $end = $request->request->get('dateEnd');
  67. $filterField = $request->request->get('filterField');
  68. $filterValue = $request->request->get('filterValue');
  69. // dd($request->request->get('filterField'));
  70. if((!empty($start) && !empty($end)) AND ($start <= $end)) {
  71. $meetings = $em->getRepository('App\Entity\Meeting')->filterByDate(
  72. new \DateTime($start.' 00:00:00'),
  73. new \DateTime($end.' 23:59:59'),
  74. FALSE,
  75. [$filterField => $filterValue]
  76. );
  77. } else {
  78. $meetings = $em->getRepository('App\Entity\Meeting')->findAll();
  79. }
  80. $html = $this->renderView(
  81. 'default/print.html.twig',
  82. array(
  83. 'meetings' => $meetings
  84. )
  85. );
  86. return new PdfResponse(
  87. $pdf->getOutputFromHtml($html),
  88. 'file.pdf'
  89. );
  90. }
  91. /**
  92. * @Route("/export/{filename}", name="export_users")
  93. */
  94. public function userExport(string $filename)
  95. {
  96. $em = $this->managerRegistry->getManager();
  97. $meeting = $em->getRepository('App\Entity\Meeting')->findOneBy(['filename'=>$filename]);
  98. $joiners = $em->getRepository('App\Entity\Joiner')->findBy(['meeting'=>$meeting]);
  99. $encoders = [new CsvEncoder()];
  100. $normalizers = [new DateTimeNormalizer(['datetime_format'=>'H:i:s','datetime_timezone'=>'Europe/Paris']), new ObjectNormalizer()];
  101. $serializer = new Serializer($normalizers, $encoders);
  102. $csvContent = implode(';',[
  103. $meeting->getName(),
  104. $meeting->getStart()->format('d-m-Y')
  105. ]
  106. ).chr(10);
  107. $csvContent .= $serializer->serialize($joiners, 'csv', [
  108. 'csv_delimiter'=>';',
  109. 'attributes' => ['name','role','jointime','lefttime'],
  110. // 'circular_reference_handler' => function ($object) {
  111. // return $object->getId();
  112. // }
  113. ]);
  114. $response = new Response($csvContent);
  115. $response->headers->set('Content-Encoding', 'UTF-8');
  116. $response->headers->set('Content-Type', 'text/csv; charset=UTF-8');
  117. $response->headers->set('Content-Disposition', 'attachment; filename=participants.csv');
  118. return $response;
  119. }
  120. /**
  121. * @Route("/presences", name="presences")
  122. */
  123. function getPresences(){
  124. $em = $this->managerRegistry->getManager();
  125. $joiners = $em->getRepository('App\Entity\Joiner')->getListJoiners();
  126. return $this->render('default/presences.html.twig',
  127. [
  128. 'joiners'=>$joiners
  129. ]);
  130. }
  131. /**
  132. * @Route("/printpresences", name="printpresences", options={"expose"=true}, methods={"POST"})
  133. * @param Request $request
  134. */
  135. public function printPresenceJoiners(Request $request) : Response {
  136. if (!$this->getUser()) {
  137. return $this->redirectToRoute('default');
  138. }
  139. $joiners = $request->request->get('joiners');
  140. $dateStart = date_create($request->request->get('start'))->setTime(00, 00, 00);
  141. $dateEnd = date_create($request->request->get('end'))->setTime(23, 59, 59);
  142. $em = $this->managerRegistry->getManager();
  143. $filename = $this->genPDFJoiners($joiners, $dateStart, $dateEnd);
  144. $responce = new Response();
  145. $responce->setContent($filename);
  146. return $responce;
  147. }
  148. private function genPDFJoiners($joiners, $dateStart, $dateEnd) {
  149. $em = $this->managerRegistry->getManager();
  150. $pdf = $this->tcpdf->create('vertical', PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
  151. // $pdf->SetAuthor($this->getParameter('plateforme_name'));
  152. $pdf->SetTitle(('Feuille de présences par participant '));
  153. $pdf->SetSubject('Présences individuelles');
  154. $pdf->setFontSubsetting(true);
  155. $pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
  156. $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
  157. $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
  158. $upload = $this->getParameter('kernel.project_dir').'/public/uploads';
  159. $pdf->SetHeaderData('',
  160. 10,
  161. 'bbb-analytics'
  162. );
  163. $pdf->setFooterData(array(0,64,0), array(0,64,128));
  164. $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
  165. $pdf->SetFont('helvetica', '', 11, '', true);
  166. $filename = 'Feuille_presences_eleves-'. uniqid().'.pdf';
  167. $presencesJoiners = $em->getRepository('App\Entity\Joiner')->getPresencesByJoiner($joiners, $dateStart, $dateEnd);
  168. $activeJoiner = "";
  169. foreach($presencesJoiners as $presence) {
  170. if(empty($activeJoiner) || $activeJoiner != $presence->getExternalId() ) {
  171. if(!empty($activeJoiner)) {
  172. $pdf->writeHTMLCell($w = 150, 0, '', '', 'Total heures ', 1, 0, 0, true, 'R', true);
  173. $pdf->writeHTMLCell($w = 40, 0, 160, '', $totalHeuresOri->diff($totalHeures)->h + ($totalHeuresOri->diff($totalHeures)->days * 24).'H '. $totalHeuresOri->diff($totalHeures)->i, 1, 1, 0, true, 'C', true);
  174. }
  175. $activeJoiner = $presence->getExternalId();
  176. $totalHeuresOri = new \DateTime('00:00');
  177. $totalHeures = clone $totalHeuresOri;
  178. $pdf->AddPage();
  179. }
  180. if(($pdf->getY() <= 11)||($pdf->getY() >= 267)){
  181. $pdf->writeHTMLCell(0, 0, '', '', $presence->getName(), 1, 1,0, true, 'C', true);
  182. $pdf->writeHTMLCell($w = 30, 0, '', '', 'Date', 1, 0, 0, true, '', true);
  183. $pdf->writeHTMLCell($w = 120, 0,40, '', 'Formation', 1, 0, 0, true, '', true);
  184. $pdf->writeHTMLCell($w = 20, 0, 160, '', 'Arrivée', 1, 0, 0, true, 'C', true);
  185. $pdf->writeHTMLCell($w = 20, 0, 180, '', 'Départ', 1, 1, 0, true, 'C', true);
  186. }
  187. if(is_null($presence->getJoinTime())) {
  188. $dateD = 'ABS';
  189. $dateF = 'ABS';
  190. } else {
  191. $dateD = $presence->getJoinTime()->format('H:i');
  192. if(is_null($presence->getLeftTime())) {
  193. $dateF = "####-##-##";
  194. } else {
  195. $dateF = $presence->getLeftTime()->format('H:i');
  196. $totalHeures->add(date_diff($presence->getJoinTime(), $presence->getLeftTime()));
  197. }
  198. }
  199. // Rajouter la date sur chaque ligne
  200. // $w, $h, $txt, $border=0, $align='J', $fill=false, $ln=1, $x='', $y='', $reseth=true, $stretch=0, $ishtml=false, $autopadding=true, $maxh=0, $valign='T', $fitcell=false
  201. $coursName = $presence->getMeeting()->getName();
  202. if(strlen($coursName) > 50) {
  203. $coursName = substr($coursName, 0,50).' ...';
  204. }
  205. $pdf->writeHTMLCell($w = 30, 0, '', '', $presence->getMeeting()->getStart()->format('d/m/Y'), 1, 0, 0, true, '', true);
  206. $pdf->writeHTMLCell($w = 120, 0,40, '', $coursName, 1, 0, 0, true, '', true);
  207. $pdf->writeHTMLCell($w = 20, 0, 160, '', $dateD, 1, 0, 0, true, 'C', true);
  208. $pdf->writeHTMLCell($w = 20, 0, 180, '', $dateF, 1, 1, 0, true, 'C', true);
  209. }
  210. $pdf->writeHTMLCell($w = 150, 0, '', '', 'Total heures ', 1, 0, 0, true, 'R', true);
  211. $pdf->writeHTMLCell($w = 40, 0, 160, '', $totalHeuresOri->diff($totalHeures)->h + ($totalHeuresOri->diff($totalHeures)->days * 24).'H '. $totalHeuresOri->diff($totalHeures)->i, 1, 1, 0, true, 'C', true);
  212. // }
  213. // }
  214. $pdf->Output( $upload.'/'.$filename,'F'); // This will output the PDF as a response direc
  215. return $filename;
  216. }
  217. #[Route('/api/presences/date/{date}', name:'api_date_presences', methods:['GET'])]
  218. public function getPresencesDateApi($date, SerializerInterface $serializer): JsonResponse {
  219. $em = $this->managerRegistry->getManager();
  220. $dateStart = date_create($date)->setTime(00, 00, 00);
  221. $dateEnd = date_create($date)->setTime(23, 59, 59);
  222. $result = [];
  223. $meetings = $em->getRepository(Meeting::class)->filterByDate($dateStart,$dateEnd);
  224. foreach ($meetings as $meeting) {
  225. $id = $meeting->getId();
  226. $result[$id]['externalid'] = $meeting->getExternalid();
  227. $result[$id]['name'] = $meeting->getName();
  228. $result[$id]['start'] = $meeting->getStart();
  229. $result[$id]['end'] = $meeting->getStart();
  230. $result[$id]['presences'] = $em->getRepository(Joiner::class)->getPresencesByMeetingApi($id);
  231. }
  232. return new JsonResponse([
  233. 'meetings' => $result,
  234. Response::HTTP_OK,
  235. ['accept' => 'json'],
  236. true
  237. ]);
  238. }
  239. #[Route('/api/presences/meeting/{meetingid}', name:'api_date_presences', methods:['GET'])]
  240. public function getPresencesMeetingApi($meetingid, SerializerInterface $serializer): JsonResponse {
  241. $em = $this->managerRegistry->getManager();
  242. $result = [];
  243. $meeting = $em->getRepository(Meeting::class)->findOneBy([
  244. 'externalid'=>$meetingid
  245. //ou utiliser le filename en fonction de ce qu'ils ont dans moodle
  246. ]) ;
  247. foreach ($meetings as $meeting) {
  248. $id = $meeting->getId();
  249. $result[$id]['externalid'] = $meeting->getExternalid();
  250. $result[$id]['name'] = $meeting->getName();
  251. $result[$id]['meetingid'] = $meeting->getFilename();
  252. $result[$id]['start'] = $meeting->getStart();
  253. $result[$id]['end'] = $meeting->getStart();
  254. $result[$id]['presences'] = $em->getRepository(Joiner::class)->getPresencesByMeetingApi($id);
  255. }
  256. return new JsonResponse([
  257. 'meetings' => $result,
  258. Response::HTTP_OK,
  259. ['accept' => 'json'],
  260. true
  261. ]);
  262. }
  263. }