src/Controller/EventController.php line 35

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Event;
  4. use App\Form\EventType;
  5. use App\Repository\BillRepository;
  6. use App\Repository\EventRepository;
  7. use App\Repository\ItemRepository;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Dompdf\Dompdf;
  10. use Dompdf\Options;
  11. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  12. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  17. use Symfony\Component\Mailer\MailerInterface;
  18. use Symfony\Component\Mime\Email;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use Symfony\Component\HttpFoundation\RequestStack;
  21. use Symfony\Component\Security\Core\Security;
  22. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  23. use Symfony\Component\Mime\NamedAddress;
  24. use Symfony\Component\Mime\Address;
  25. /**
  26.  * @IsGranted("IS_AUTHENTICATED_FULLY")
  27.  */
  28. #[Route('/event')]
  29. class EventController extends AbstractController
  30. {
  31.     #[Route('/'name'event_index'methods: ['GET'])]
  32.     public function index(EventRepository $eventRepositoryBillRepository $billRepositoryItemRepository $itemRepositorySecurity $security): Response
  33.     {
  34.         if ($security->getUser()->getRoles()[0] == 'ROLE_ADMIN') {
  35.             $events $eventRepository->findAllEvents();
  36.         } else {
  37.             $events $eventRepository->findActive();
  38.         }
  39.         $additionalInformation = [];
  40.         foreach ($events as $event) {
  41.             $additionalInformation[$event->getId()] = $this->getEventInfo($event$billRepository$itemRepository);
  42.         }
  43.         return $this->render('event/index.html.twig', [
  44.             'events' => $events,
  45.             'eventInfo' => $additionalInformation,
  46.         ]);
  47.     }
  48.     protected function getEventInfo($eventBillRepository $billRepositoryItemRepository $itemRepository)
  49.     {
  50.         $return = [];
  51.         $allQuery $billRepository->createQueryBuilder('b')
  52.             ->select('count(b.id)')
  53.             ->innerJoin('b.event''e')
  54.             ->where('e.id = :eventid')
  55.             ->setParameter('eventid'$event->getId())
  56.             ->getQuery();
  57.         $return['countBills'] = $allQuery->getSingleScalarResult();
  58.         $allQuery $billRepository->createQueryBuilder('b')
  59.             ->select('SUM(b.result)')
  60.             ->innerJoin('b.event''e')
  61.             ->where('e.id = :eventid')
  62.             ->setParameter('eventid'$event->getId())
  63.             ->getQuery();
  64.         $return['countUmsatz'] = $allQuery->getSingleScalarResult();
  65.         $qb $itemRepository->createQueryBuilder('i');
  66.         $allQuery $qb
  67.             ->select($qb->expr()->countDistinct('i.seller'))
  68.             ->innerJoin('i.bill''b')
  69.             ->innerJoin('b.event''e')
  70.             ->where('e.id = :eventid')
  71.             ->setParameter('eventid'$event->getId())
  72.             ->getQuery();
  73.         $return['countSeller'] = $allQuery->getSingleScalarResult();
  74.         $qb $itemRepository->createQueryBuilder('i');
  75.         $allQuery $qb
  76.             ->select($qb->expr()->countDistinct('i.id'))
  77.             ->innerJoin('i.bill''b')
  78.             ->innerJoin('b.event''e')
  79.             ->where('e.id = :eventid')
  80.             ->setParameter('eventid'$event->getId())
  81.             ->getQuery();
  82.         $return['countArtikel'] = $allQuery->getSingleScalarResult();
  83.         return $return;
  84.     }
  85.     #[Route('/new'name'event_new'methods: ['GET''POST'])]
  86.     public function new(Request $requestEntityManagerInterface $entityManager): Response
  87.     {
  88.         $event = new Event();
  89.         $form $this->createForm(EventType::class, $event);
  90.         $form->handleRequest($request);
  91.         if ($form->isSubmitted() && $form->isValid()) {
  92.             $event->setUserCreated($this->getUser());
  93.             $event->setCreateDate(new \DateTime ('now'));
  94.             $entityManager->persist($event);
  95.             $entityManager->flush();
  96.             return $this->redirectToRoute('event_index', [], Response::HTTP_SEE_OTHER);
  97.         }
  98.         return $this->renderForm('event/new.html.twig', [
  99.             'event' => $event,
  100.             'form' => $form,
  101.         ]);
  102.     }
  103.     #[Route('/{id}'name'event_show'methods: ['GET'])]
  104.     public function show(Event $eventRequestStack $requestStackBillRepository $billRepositoryItemRepository $itemRepository): Response
  105.     {
  106.         // stores an attribute in the session for later reuse
  107.         $session $requestStack->getSession();
  108.         $session->set('CURRENT_EVENT'$event->getId());
  109.         $eventInfo $this->getEventInfo($event$billRepository$itemRepository);
  110.         return $this->render('event/show.html.twig', [
  111.             'event' => $event,
  112.             'eventInfo' => $eventInfo,
  113.         ]);
  114.     }
  115.     #[Route('/{id}/edit'name'event_edit'methods: ['GET''POST'])]
  116.     public function edit(Request $requestEvent $eventEntityManagerInterface $entityManager): Response
  117.     {
  118.         $form $this->createForm(EventType::class, $event);
  119.         $form->handleRequest($request);
  120.         if ($form->isSubmitted() && $form->isValid()) {
  121.             $entityManager->flush();
  122.             return $this->redirectToRoute('event_index', [], Response::HTTP_SEE_OTHER);
  123.         }
  124.         return $this->renderForm('event/edit.html.twig', [
  125.             'event' => $event,
  126.             'form' => $form,
  127.         ]);
  128.     }
  129.     #[Route('/{id}'name'event_delete'methods: ['POST'])]
  130.     public function delete(Request $requestEvent $eventEntityManagerInterface $entityManager): Response
  131.     {
  132.         if ($this->isCsrfTokenValid('delete' $event->getId(), $request->request->get('_token'))) {
  133.             $entityManager->remove($event);
  134.             $entityManager->flush();
  135.         }
  136.         return $this->redirectToRoute('event_index', [], Response::HTTP_SEE_OTHER);
  137.     }
  138.     #[Route('/{id}/export_pdf'name'event_pdf'methods: ['GET''POST'])]
  139.     public function exportPdf(Event $eventRequest $requestEntityManagerInterface $entityManagerItemRepository $itemRepository,  MailerInterface $mailer): Response
  140.     {
  141.         // Configure Dompdf according to your needs
  142.         $pdfOptions = new Options();
  143.         $pdfOptions->set('defaultFont''Helvetica');
  144.         // Instantiate Dompdf with our options
  145.         $dompdf = new Dompdf($pdfOptions);
  146.         $allQuery $itemRepository->createQueryBuilder('i')
  147.             ->select('i.seller, SUM(i.price) AS result')
  148.             ->innerJoin('i.bill''b')
  149.             ->innerJoin('b.event''e')
  150.             ->where('e.id = :eventid')
  151.             ->setParameter('eventid'$event->getId())
  152.             ->groupBy('i.seller')
  153.             ->getQuery();
  154.         $data $allQuery->getResult();
  155.         $sellers = [];
  156.         $etti $prozent 0;
  157.         foreach ($data as $seller){
  158.             if ($seller['seller'] > && $seller['seller'] <= 15) {
  159.                 $prozent 5;
  160.             }
  161.             if ($seller['seller'] > 15 && $seller['seller'] < 200){
  162.                 $prozent 10;
  163.                 $etti 3;
  164.             }
  165.             if ($seller['seller'] >= 200 ){
  166.                 $prozent 20;
  167.                 $etti 3;
  168.             }
  169.             $allQuery $itemRepository->createQueryBuilder('i')
  170.                 ->select('i')
  171.                 ->innerJoin('i.bill''b')
  172.                 ->innerJoin('b.event''e')
  173.                 ->where('e.id = :eventid')
  174.                 ->andWhere('i.seller = :sellerid')
  175.                 ->setParameter('eventid'$event->getId())
  176.                 ->setParameter('sellerid'$seller['seller'])
  177.                 ->getQuery();
  178.             $items $allQuery->getResult();
  179.             $sellers[$seller['seller']] = [
  180.                 'id' => $seller['seller'],
  181.                 'etti' => $etti,
  182.                 'prozent' => $prozent,
  183.                 'positionen' => $items,
  184.             ];
  185.         }
  186.         // Retrieve the HTML generated in our twig file
  187.         $html $this->renderView('event/rechnungen.html.twig', [
  188.             'title' => 'Rechnung ',
  189.             'sellers' => $sellers,
  190.             'event' => $event,
  191.         ]);
  192.         // Load HTML to Dompdf
  193.         $dompdf->loadHtml($html);
  194.         // (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
  195.         $dompdf->setPaper('A4''portrait');
  196.         // Render the HTML as PDF
  197.         $dompdf->render();
  198.         $output $dompdf->output();
  199.         $tmpfname tempnam("/tmp""FOO");
  200.         $tmpfname .= 'pdf';
  201.         file_put_contents($tmpfname$output);
  202.         $email = (new Email())
  203.             ->from(new Address('flohmarkt@jüngel.com''Flohmarkt-Team'))
  204.             ->to($this->getUser()->getEmail())
  205.             ->subject('PDF Export "' $event->getName() . '"')
  206.             ->attachFromPath$tmpfname'Abrechnung.pdf')
  207.             ->text('PDF')
  208.             ->html('<p>PDF</p>');
  209.         $mailer->send($email);
  210.         // Output the generated PDF to Browser (force download)
  211.         $dompdf->stream("Rechnung", [
  212.             "Attachment" => true
  213.         ]);
  214.     }
  215.     #[Route('/{id}/export'name'event_export'methods: ['GET''POST'])]
  216.     public function export(Event $eventRequest $requestEntityManagerInterface $entityManagerItemRepository $itemRepository,  MailerInterface $mailer): Response
  217.     {
  218.         $spreadsheet = new Spreadsheet();
  219.         $sheet $spreadsheet->getActiveSheet();
  220.         $sheet->setTitle($event->getName());
  221.         $allQuery $itemRepository->createQueryBuilder('i')
  222.             ->select('i.seller, SUM(i.price) AS result')
  223.             ->innerJoin('i.bill''b')
  224.             ->innerJoin('b.event''e')
  225.             ->where('e.id = :eventid')
  226.             ->setParameter('eventid'$event->getId())
  227.             ->groupBy('i.seller')
  228.             ->getQuery();
  229.         $data $allQuery->getResult();
  230.         $row 10;
  231.         $umsatz $gesamtProv $gesamtGuthaben 0;
  232.         $sheet->setCellValueByColumnAndRow(1$row'Verkäufer');
  233.         $sheet->setCellValueByColumnAndRow(2$row'Umsatz');
  234.         $sheet->setCellValueByColumnAndRow(3$row'Prozent');
  235.         $sheet->setCellValueByColumnAndRow(4$row'Etiketten');
  236.         $sheet->setCellValueByColumnAndRow(5$row'Provision');
  237.         $sheet->setCellValueByColumnAndRow(6$row'Guthaben');
  238.         foreach ($data as $item) {
  239.             $etti $prozent $provision 0;
  240.             $row++;
  241.             $umsatz += $item['result'];
  242.             $result $item['result'];
  243.             $sheet->setCellValueByColumnAndRow(1$row$item['seller']);
  244.             $sheet->setCellValueByColumnAndRow(2$row$item['result']);
  245.             if ($item['seller'] > && $item['seller'] <= 15) {
  246.                 $prozent 5;
  247.             }
  248.             if ($item['seller'] > 15 && $item['seller'] < 200){
  249.                 $prozent 10;
  250.                 $etti 3;
  251.             }
  252.             if ($item['seller'] >= 200 ){
  253.                 $prozent 20;
  254.                 $etti 3;
  255.             }
  256.            /* if (strlen($item['seller']) == 6) {
  257.                 $prozent = substr($item['seller'], 0, 2);
  258.                 $etti = substr($item['seller'], 2, 1);
  259.                 if (intval($etti) == 1) {
  260.                     $etti = 3.5;
  261.                 }
  262.                 $provision = $result * (intval($prozent) / 100);
  263.                 $gesamtProv += $provision;
  264.                 $gesamtProv += $etti;
  265.             }*/
  266.             $provision $result * (intval($prozent) / 100);
  267.             $gesamtProv += $provision;
  268.             $gesamtProv += $etti;
  269.             $result $result - ($provision $etti);
  270.             $sheet->setCellValueByColumnAndRow(3$row$prozent);
  271.             $sheet->setCellValueByColumnAndRow(4$row$etti);
  272.             $sheet->setCellValueByColumnAndRow(5$row$provision);
  273.             $sheet->setCellValueByColumnAndRow(6$row$result);
  274.         }
  275.         $row += 3;
  276.         $sheet->setCellValueByColumnAndRow(1$row'Umsatz');
  277.         $sheet->setCellValueByColumnAndRow(2$row$umsatz);
  278.         $row += 1;
  279.         $sheet->setCellValueByColumnAndRow(1$row'Gesamt-Provision');
  280.         $sheet->setCellValueByColumnAndRow(2$row$gesamtProv);
  281.         // Create your Office 2007 Excel (XLSX Format)
  282.         $writer = new Xlsx($spreadsheet);
  283.         // Create a Temporary file in the system
  284.         $fileName $event->getName() . '.xlsx';
  285.         $temp_file tempnam(sys_get_temp_dir(), $fileName);
  286.         // Create the excel file in the tmp directory of the system
  287.         $writer->save($temp_file);
  288.         /*$email = (new Email())
  289.             ->from(new Address('flohmarkt@jüngel.com', 'Flohmarkt-Team'))
  290.             ->to($this->getUser()->getEmail())
  291.             ->subject('XLS Export "' . $event->getName() . '"')
  292.             ->attachFromPath( $temp_file, 'Abrechnung.xls')
  293.             ->text('XLS')
  294.             ->html('<p>XLS</p>');
  295.         $mailer->send($email);*/
  296.         // Return the excel file as an attachment
  297.         return $this->file($temp_file$fileNameResponseHeaderBag::DISPOSITION_INLINE);
  298.     }
  299.     
  300.      #[Route('/{id}/export_position'name'event_position'methods: ['GET''POST'])]
  301.     public function exportPosition(Event $eventRequest $requestEntityManagerInterface $entityManagerItemRepository $itemRepository,  MailerInterface $mailer): Response
  302.     {
  303.     
  304.         $allQuery $itemRepository->createQueryBuilder('i')
  305.             ->select('i.seller, i.price')
  306.             ->innerJoin('i.bill''b')
  307.             ->innerJoin('b.event''e')
  308.             ->where('e.id = :eventid')
  309.             ->orderBy('i.seller')
  310.             ->setParameter('eventid'$event->getId())
  311.             ->getQuery();
  312.         $data $allQuery->getResult();
  313.         
  314.        
  315.         
  316.         $fileName $event->getName() . '.csv';
  317.         $temp_file tempnam(sys_get_temp_dir(), $fileName);
  318.     $file fopen($temp_file'w');
  319.     $pos $prozent $etti 0;
  320.     $seller $data[0]['seller'];
  321.         foreach ($data as $item) {
  322.             if ($seller != $item['seller']){
  323.                 $pos 0;
  324.                 $seller $item['seller'];
  325.             }
  326.             
  327.             if ($item['seller'] > && $item['seller'] <= 15) {
  328.                     $prozent 5;
  329.                 }
  330.                 if ($item['seller'] > 15 && $item['seller'] < 200){
  331.                     $prozent 10;
  332.                     $etti 3;
  333.                 }
  334.                 if ($item['seller'] >= 200 ){
  335.                     $prozent 20;
  336.                     $etti 3;
  337.                 }
  338.             
  339.             $provision $item['price'] * (intval($prozent) / 100);
  340.             
  341.                 $pos $pos 1;
  342.             fputcsv($file, [$item['seller'], $pos$prozent$item['price'], ($item['price']-$provision), $etti]);
  343.             
  344.         }
  345.     fclose($file);
  346.     
  347.         // Return the csv file as an attachment
  348.         return $this->file($temp_file$fileNameResponseHeaderBag::DISPOSITION_INLINE);
  349.     }
  350. }