src/Controller/EventOfferController.php line 82

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Business\EventOffer;
  4. use App\Business\Loader\EventStatusHelper;
  5. use App\Form\EventOfferType;
  6. use App\Services\DomainService;
  7. use App\Services\EventOfferService;
  8. use App\Services\EventService;
  9. use App\Services\UserService;
  10. use App\Services\S3Provider;
  11. use App\Extern\XrmService;
  12. use App\Utils\Helper;
  13. use Psr\Log\LoggerInterface;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\JsonResponse;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  21. use App\Business\ExcelImport\ExcelTransmissionsImporter;
  22. use App\Business\Export\ExcelTransmissionsExporter;
  23. use Throwable;
  24. class EventOfferController extends AbstractController
  25. {
  26.     /**
  27.      * @var EventOfferService $eventOfferService
  28.      */
  29.     protected $eventOfferService;
  30.     /** @var DomainService $domainService */
  31.     protected $domainService;
  32.     /** @var ExcelTransmissionsImporter $excelImporter */
  33.     protected $excelImporter;
  34.     /** @var S3Provider $s3Provider */
  35.     protected $s3Provider;
  36.     /** @var EventService $eventService */
  37.     protected $eventService;
  38.     /** @var UserService $userService */
  39.     protected $userService;
  40.     /** @var XrmService $xrmService */
  41.     protected $xrmService;
  42.     /** @var ExcelTransmissionsExporter $excelExporter */
  43.     protected $excelExporter;
  44.     public function __construct(
  45.         EventOfferService $programmeOfferService,
  46.         DomainService $domainService,
  47.         ExcelTransmissionsImporter $excelImporter,
  48.         ExcelTransmissionsExporter $excelExporter,
  49.         S3Provider $s3Provider,
  50.         EventService $eventService,
  51.         UserService $userService,
  52.         XrmService $xrmService
  53.     )
  54.     {
  55.         $this->eventOfferService $programmeOfferService;
  56.         $this->domainService $domainService;
  57.         $this->excelImporter $excelImporter;
  58.         $this->excelExporter $excelExporter;
  59.         $this->s3Provider $s3Provider;
  60.         $this->eventService $eventService;
  61.         $this->userService $userService;
  62.         $this->xrmService $xrmService;
  63.     }
  64.     /**
  65.      * @Route("/events/my-offers", name="event_my_offers", options={"expose" = true }, methods={"GET", "POST"})
  66.      * @Security("is_granted('ROLE_USER')")
  67.      * @param Request|null $request
  68.      * @return Response
  69.      */
  70.     public function myOffersAction(Request $request null)
  71.     {
  72.         return $this->render('event_offer/event_offer_overview.html.twig');
  73.     }
  74.     /**
  75.      * @Route("/intern/events/my-event-offers", name="event_my_event_offers", options={"expose" = true }, methods={"GET", "POST"})
  76.      * @Security("is_granted('ROLE_USER')")
  77.      * @return Response
  78.      */
  79.     public function displayMyOffersAction()
  80.     {
  81.         // Get events
  82.         $events $this->eventOfferService->getEventOffersForCurrentUser();
  83.         return $this->render(
  84.             'event_offer/event_offer_list.html.twig',
  85.             ['events' => $events]
  86.         );
  87.     }
  88.     /**
  89.      * @Route("/events/event-offer", name="event_event_offer", options={"expose" = true }, methods={"GET", "POST"})
  90.      * @Security("is_granted('ROLE_USER')")
  91.      * @param Request|null $request
  92.      * @return Response
  93.      */
  94.     public function eventOfferAction(Request $request null)
  95.     {
  96.         $codeOps $this->userService->getCurrentUserCodeOps();
  97.         if (empty($codeOps)) {
  98.             $parts explode('@'$this->getUser()->getEmail());
  99.             $domain array_pop($parts);
  100.             $organization $this->xrmService->getOrganizationsRelatedToSpecificEmailDomain($domain);
  101.             return $this->render('default/access_restriction_no_company.html.twig',  ['username' => $this->getUser(), "organizationMappingPossible" => count($organization) > 0]);
  102.         } elseif (!$this->domainService->isCompanyActive($codeOps)) {
  103.             return $this->render('default/access_restriction_no_company.html.twig', ['username' => $this->getUser(), "organizationMappingPossible" => true]);
  104.         }
  105.         $eventNo = ($request->query->has('eventNo')) ? $request->query->get('eventNo') : null;
  106.         $action = ($request->query->has('action')) ? $request->query->get('action') : null;
  107.         $isDuplicate 'duplicate' == $action;
  108.         if ($isDuplicate) {
  109.             $eventNo = ($request->query->has('fromEventNo')) ? $request->query->get('fromEventNo') : null;
  110.         }
  111.         $eventOffer = new EventOffer();
  112.         if ($eventNo != null) {
  113.             $eventOffer $this->eventOfferService->prefillEventOffer($eventNo$isDuplicate);
  114.             if (!EventStatusHelper::isEventOfferStatusEditable($eventOffer->status)) {
  115.                 return $this->redirectToRoute('event_my_offers', ['eventNotEditable' => $eventNo]);
  116.             }
  117.             if (EventStatusHelper::isEventOfferStatusEditableWithRules($eventOffer->status)) {
  118.                 if (!EventOffer::isEditable($eventOffer->startDate)) {
  119.                     return $this->redirectToRoute('event_my_offers', ['eventEditableByMail' => $eventNo]);
  120.                 }
  121.             }
  122.             if (empty($this->eventOfferService->getEventOffersForCurrentUser($eventNo))) {
  123.                 return $this->redirectToRoute('event_my_offers', ['eventNotEditable' => $eventNo]);
  124.             }
  125.         }
  126.         $form $this->createForm(EventOfferType::class, $eventOffer);
  127.         $form->handleRequest($request);
  128.         return $this->render(
  129.             'event_offer/event_offer_form.html.twig',
  130.             [
  131.                 'form' => $form->createView(),
  132.                 'isDuplicate' => $isDuplicate,
  133.                 'event' => $eventOffer,
  134.                 'videoData' => json_encode($this->domainService->getVideoDataForEventOffer())
  135.             ]
  136.         );
  137.     }
  138.     /**
  139.      * @Security("is_granted('ROLE_USER')")
  140.      * @Route("/intern/events/event-offer/submit", name="event_offer_submit", options={"expose" = true})
  141.      * @param Request $request
  142.      * @param LoggerInterface $logger
  143.      * @return Response
  144.      */
  145.     public function submitEventOfferAction(Request $requestLoggerInterface $logger)
  146.     {
  147.         try {
  148.             $eventOffer = new EventOffer();
  149.             $eventOfferForm $this->createForm(EventOfferType::class, $eventOffer);
  150.             $eventOfferForm->handleRequest($request);
  151.             //not valid...
  152.             if (!$eventOfferForm->isValid()) {
  153.                 $jsonResponse $this->buildJsonResponseForOfferNotValid($eventOfferForm);
  154.                 return $jsonResponse;
  155.             }
  156.             $eventToCompare null;
  157.             if (!empty($eventOffer->eventNo)) {
  158.                 $eventToCompare $this->eventOfferService->prefillEventOffer($eventOffer->eventNofalse);
  159.             }
  160.             $ccForConfirmedOrPublished $this->getParameter('booking_mail');
  161.             $result $this->eventOfferService->createOrEditEventOffer($eventOffer$eventToCompare$ccForConfirmedOrPublished);
  162.             if ($result->isError()) {
  163.                 $errorToDisplay $this->render('event_offer/offer_error.html.twig', ["operationResult" => $result])->getContent();
  164.                 return $this->json($errorToDisplayJsonResponse::HTTP_INTERNAL_SERVER_ERROR);
  165.             }
  166.             //we return the eventNo
  167.             return $this->json($result->getData()['eventNo']);
  168.         } catch (Throwable $ex) {
  169.             $logger->alert("error in submit booking" $ex->getMessage(), ["exception" => $ex]);
  170.             return $this->json($ex->getMessage(), JsonResponse::HTTP_INTERNAL_SERVER_ERROR);
  171.         }
  172.     }
  173.     /**
  174.      * @param $eventOfferForm
  175.      * @param array|null $otherData
  176.      * @return JsonResponse
  177.      */
  178.     private function buildJsonResponseForOfferNotValid($eventOfferForm, array $otherData null): JsonResponse
  179.     {
  180.         $data = [];
  181.         $errors Helper::getErrorMessagesFlat($eventOfferFormtrue);
  182.         $data['message'] = "Please, check errors in the offer";
  183.         $data['errors'] = $errors;
  184.         if ($otherData != null) {
  185.             $data array_merge($data$otherData);
  186.         }
  187.         //warn: the javascript is waiting for this response in case of unvalide data
  188.         //our javascript use the code to differentiate validation errors to internal errors.
  189.         $jsonResponse $this->json($dataJsonResponse::HTTP_BAD_REQUEST);
  190.         return $jsonResponse;
  191.     }
  192.     /**
  193.      * @Route("/intern/test/excel/parsing", name="event_offer_import_transmission", options={"expose" = true})
  194.      */
  195.     public function testExcelParsingJsonAction(Request $request null)
  196.     {
  197.         if (empty($request->query->get('folder')) || empty($request->query->get('filename'))) {
  198.             return null;
  199.         }
  200.         $s3Url $this->s3Provider->getS3Url($request->query->get('folder'), $request->query->get('filename'));
  201. //        $transmissions = $this->excelImporter->readExcelFile($s3Url);
  202. //        return JsonResponseHelper::buildSuccessJsonData($transmissions);
  203.         return null;
  204.     }
  205.     /**
  206.      * @Security("is_granted('ROLE_USER')")
  207.      * @Route("/intern/get/eventOffer/attachments/{eventNo}/{status}", name="get_event_offer_attachments", options={"expose" = true})
  208.      * @param string $eventNo
  209.      * @param string $status
  210.      * @return Response
  211.      */
  212.     public function getEventOfferAttachmentsAction(string $eventNostring $status)
  213.     {
  214.         $oldAttachments $this->eventService->getEventAttachments($eventNo);
  215.         return $this->render(
  216.             'event_offer/event_offer_attachments.html.twig', [
  217.                 'oldAttachments' => $oldAttachments,
  218.                 'eventNo' => $eventNo,
  219.                 'status' => $status
  220.             ]
  221.         );
  222.     }
  223.     /**
  224.      * @Security("is_granted('ROLE_USER')")
  225.      * @Route("/intern/get/attachment/file/{eventNo}/{attachmentId}", name="getAttachmentFile", options={"expose" = true})
  226.      * @param string $eventNo
  227.      * @param string $attachmentId
  228.      * @return Response
  229.      */
  230.     public function getAttachmentFileAction(string $eventNostring $attachmentId)
  231.     {
  232.         $attachment json_decode($this->eventService->getEventAttachmentContent($eventNo$attachmentId));
  233.         $filename $attachment->title;
  234.         $file base64_decode($attachment->inputFile);
  235.         $f finfo_open();
  236.         $mime_type finfo_buffer($f$fileFILEINFO_MIME_TYPE);
  237.         $response = new Response();
  238.         $response->headers->set('Cache-Control''private');
  239.         $response->headers->set('Content-type'$mime_type);
  240.         $response->headers->set('Content-Disposition''attachment; filename="' $filename "." strtolower($attachment->fileFormat) . '";');
  241.         $response->setContent($file);
  242.         return $response;
  243.     }
  244.     /**
  245.      * @Security("is_granted('ROLE_USER')")
  246.      * @Route("/intern/delete/attachment/file/{eventNo}/{attachmentId}", name="deleteAttachmentFile", options={"expose" = true})
  247.      * @param string $eventNo
  248.      * @param string $attachmentId
  249.      * @return JsonResponse
  250.      */
  251.     public function deleteAttachmentFile(string $eventNostring $attachmentId)
  252.     {
  253.         $res $this->eventService->deleteEventAttachment($eventNo$attachmentId);
  254.         return new JsonResponse([
  255.             'message' => $res->getMessage(),
  256.             'status' => $res->getStatus(),
  257.             'data' => $res->getData(),
  258.         ]);
  259.     }
  260.     /**
  261.      * @Security("is_granted('ROLE_USER')")
  262.      * @Route("/intern/events/event-offer/{eventNo}/report", name="event_offer_report", options={"expose" = true})
  263.      * @param string $eventNo
  264.      * @return Response
  265.      */
  266.     public function eventOfferReportAction(string $eventNo)
  267.     {
  268.         $participations $this->eventService->getEventParticipations($eventNo);
  269.         $event $this->eventService->getEventByNo($eventNo);
  270.         $spreadsheet $this->excelExporter->createExcelParticipationsObject($participations->getData(), $event$this->getUser(), 10);
  271.         // create the writer
  272.         $writer $this->excelExporter->createWriter($spreadsheet);
  273.         // create the response
  274.         $response $this->excelExporter->createStreamedResponse($writer);
  275.         // adding headers
  276.         $filename sprintf(
  277.             $eventNo '-event-offer-participation-report-on-%s.xlsx',
  278.             date('Y-m-d')
  279.         );
  280.         $s3Path 'media_public/event_offer/' $filename;
  281.         $localPath '/tmp/' $filename;
  282.         // Save file in local
  283.         $writer->save($localPath);
  284.         $response $this->s3Provider->setFile($s3Path$localPath);
  285.         if (isset($response['status']) && $response['status'] != "success") {
  286.             return $this->json('Error during the generation of the report'JsonResponse::HTTP_BAD_REQUEST);
  287.         } else {
  288.             return $this->json($s3PathJsonResponse::HTTP_OK);
  289.         }
  290.     }
  291. }