src/Controller/ExpressComplaintController.php line 599

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Repository\InsuranceRepository;
  4. use Exception;
  5. use Dompdf\Dompdf;
  6. use App\Security\EmailVerifier;
  7. use App\Email\DefaultTemplatedEmail;
  8. use App\Service\YouSign\YousignService;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Doctrine\Common\Collections\ArrayCollection;
  12. use App\Repository\UserRepository;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  15. use Symfony\Component\HttpFoundation\{RedirectResponseRequestResponseStreamedResponse};
  16. use Symfony\Component\Mailer\{Exception\TransportExceptionInterfaceMailerInterface};
  17. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  18. use App\Entity\{ComplaintXInsuranceInsuranceCompanyItemPaymentMethodUser};
  19. use App\Form\{ComplaintXApprovalTypeComplaintXTypeIdentityCardTypeRegistrationFormType};
  20. use App\Service\{ComplaintXServicePaymentServiceStripePaymentService};
  21. use App\Service\YouSign\Exception\{SignatureRequestCreationErrorExceptionSignatureRequestErrorException};
  22. use Psr\Log\LoggerInterface;
  23. use App\Entity\Address;
  24. class ExpressComplaintController extends AbstractController
  25. {
  26.     #[Route("/express/plainte-contre-x-presentation"name"express_complaint_x_presentation")]
  27.     public function complaintXPresentationAction(Request $request): Response
  28.     {
  29.         $complaintXApprovalForm $this->createForm(ComplaintXApprovalType::class);
  30.         $complaintXApprovalForm->handleRequest($request);
  31.         foreach ($request->getSession()->all() as $key => $value) {
  32.             if (str_starts_with($key'expressComplaint')) {
  33.                 $request->getSession()->remove($key);
  34.             }
  35.         };
  36.         if ($complaintXApprovalForm->isSubmitted() && $complaintXApprovalForm->isValid()) {
  37.             $session                $request->getSession();
  38.             foreach ($request->getSession()->all() as $key => $value) {
  39.                 if (str_starts_with($key'expressComplaint')) {
  40.                     $request->getSession()->remove($key);
  41.                 }
  42.             };
  43.             $formData $complaintXApprovalForm->getData();
  44.             $session->set('removeIdentityFiles'false);
  45.             $session->set('expressComplaintYouHasVictim'$formData['youHasVictim']);
  46.             $session->set('expressComplaintYourChildrenHasVictim'$formData['yourChildrenHasVictim']);
  47.             $session->set('expressComplaintNoWeaponsUsage'true);
  48.             $session->set('expressComplaintNoDocumentStolen'true);
  49.             $session->set('expressComplaintNoTargetDescription'true);
  50.             $session->set('expressComplaintFrenchPhone'true);
  51.             $session->set('expressComplaintPresentation'true);
  52.             return $this->redirectToRoute('express_complaint_x_params');
  53.         }
  54.         return $this->render('Complaint/complaintXPresentation.html.twig', [
  55.             'complaintXApprovalForm' => $complaintXApprovalForm->createView()
  56.         ]);
  57.     }
  58.     #[Route("/express/plainte-contre-x-insuranceCheck/{isInsured?}"name"express_complaint_x_insurance_check")]
  59.     public function insuranceCheckAction(Request $request$isInsured null): Response
  60.     {
  61.         $session            $request->getSession();
  62.         $complaintType      $session->get('expressComplaintType');
  63.         $complaintCategory  $session->get('expressComplaintCategory');
  64.         if (!$complaintType) {
  65.             return $this->redirectToRoute('express_complaint_x_params');
  66.         }
  67.         if (!$complaintCategory) {
  68.             return $this->redirectToRoute('express_complaint_x_params', ["type" => $complaintType]);
  69.         }
  70.         $backUrl            "";
  71.         switch ($complaintType) {
  72.             case "address":
  73.                 if ($complaintCategory == "itemDegradation") {
  74.                     $backUrl    $this->generateUrl('express_complaint_x_resident_type');
  75.                 } else {
  76.                     $backUrl    $this->generateUrl('express_complaint_x_steal_breaking');
  77.                 }
  78.                 break;
  79.             case 'vehicle':
  80.                 $backUrl        $this->generateUrl(
  81.                     'express_complaint_x_params',
  82.                     [
  83.                         "type"      => $complaintType
  84.                     ]
  85.                 );
  86.                 break;
  87.             default:
  88.                 $backUrl        $this->generateUrl('express_complaint_x_params');
  89.                 break;
  90.         }
  91.         if ($session->get('expressComplaintType') === 'address') {
  92.             if ($session->get('expressComplaintCategory') === 'itemDegradation') {
  93.                 $category "Dégradation d'un bien immobilier";
  94.             } elseif (
  95.                 $session->get('expressComplaintIsBreakingsFound'false)
  96.                 && $session->get('expressComplaintStealVictim'false)
  97.             ) {
  98.                 $category 'Vol avec effractions';
  99.             } elseif ($session->get('expressComplaintStealVictim'false)) {
  100.                 $category 'Vol sans effraction';
  101.             } else {
  102.                 $category 'Tentative de vol avec effraction';
  103.             }
  104.         } else {
  105.             $categories             ComplaintX::getCategoriesByFilter([
  106.                 'breaking'          => false,
  107.                 'stealing'          => false,
  108.                 'type'              => $session->get("expressComplaintCategory"),
  109.             ]);
  110.             $category array_search($session->get('expressComplaintCategory'), $categories);
  111.         }
  112.         $session->set('expressComplaintCategoryName'$category);
  113.         if (
  114.             $isInsured === null
  115.             && !in_array($session->get('expressComplaintVehicleOwner'), ['loan''rent''work''service'])
  116.         ) {
  117.             return $this->render(
  118.                 'ExpressComplaint/insuranceCheck.html.twig',
  119.                 [
  120.                     "returnUrl"   => $backUrl
  121.                 ]
  122.             );
  123.         }
  124.         $session->set('expressComplaintInsurance'true);
  125.         if (
  126.             $isInsured === 'yes'
  127.             && !in_array($session->get('expressComplaintVehicleOwner'), ['loan''rent''work''service'])
  128.         ) {
  129.             $session->set('expressComplaintIsInsured'true);
  130.             return $this->redirectToRoute('express_complaint_x_want_sinister_declaration');
  131.         } else {
  132.             $session->set('expressComplaintIsInsured'false);
  133.             $session->set('expressComplaintWantSinisterDeclaration'false);
  134.             return $this->redirectToRoute('express_complaint_x_prices');
  135.         }
  136.     }
  137.     #[Route(
  138.         "/express/plainte-contre-x-want-sinister-declaration/{wantSinisterDeclaration?}",
  139.         name"express_complaint_x_want_sinister_declaration"
  140.     )]
  141.     public function wantSinisterDeclarationAction(Request $request$wantSinisterDeclaration null): Response
  142.     {
  143.         $session            $request->getSession();
  144.         if (is_null($session->get("expressComplaintIsInsured"))) {
  145.             return $this->redirectToRoute('express_complaint_x_insurance_check');
  146.         }
  147.         if ($wantSinisterDeclaration === null) {
  148.             return $this->render(
  149.                 'ExpressComplaint/wantSinisterDeclaration.html.twig',
  150.                 [
  151.                     "returnUrl"   => $this->generateUrl("express_complaint_x_insurance_check")
  152.                 ]
  153.             );
  154.         }
  155.         if ($wantSinisterDeclaration === 'yes') {
  156.             $session->set('expressComplaintWantSinisterDeclaration'true);
  157.         } else {
  158.             $session->set('expressComplaintWantSinisterDeclaration'false);
  159.         }
  160.         return $this->redirectToRoute('express_complaint_x_prices');
  161.     }
  162.     #[Route("/express/plainte-contre-x-prices/{price?}"name"express_complaint_x_prices")]
  163.     public function complaintXPriceAction(
  164.         Request $request,
  165.         ComplaintXService $complaintXService,
  166.         $price null
  167.     ): Response {
  168.         $session                                $request->getSession();
  169.         $isInsured                              $session->get('expressComplaintIsInsured');
  170.         if (is_null($isInsured)) {
  171.             return $this->redirectToRoute('express_complaint_x_insurance_check');
  172.         }
  173.         $offersCatalog                          $complaintXService->getOffersCatalog();
  174.         $offers                                 = [];
  175.         if ($session->get('expressComplaintCategory') == 'vehicleTheftTotal') {
  176.             if (
  177.                 $session->get('expressComplaintIsInsured')
  178.                 && $session->get('expressComplaintWantSinisterDeclaration')
  179.             ) {
  180.                 $pageTitle "Sélectionnez la seule formule disponible pour garantir l'horodatage de votre plainte 
  181.                         pour vol de véhicule et de la déclaration de sinistre, avant transmission au procureur de la 
  182.                         république et à la compagnie d'assurance";
  183.                 $offers["priceSerenityPlus"] = $offersCatalog["priceSerenityPlusVehicle"];
  184.             } else {
  185.                 $pageTitle "Sélectionnez la seule formule disponible pour garantir l'horodatage de votre plainte 
  186.                         pour vol de véhicule et sa transmission au procureur de la république";
  187.                 $offers["priceTranquilityPlus"] = $offersCatalog["priceTranquilityPlusVehicle"];
  188.             }
  189.         } else {
  190.             if ($session->get('expressComplaintIsInsured')) {
  191.                 if ($session->get('expressComplaintWantSinisterDeclaration')) {
  192.                     $pageTitle "Cliquez sur l'une de ces formules pour choisir le mode de signature et de 
  193.                             transmission de votre plainte et de la déclaration de sinistre";
  194.                     $offers["priceSerenity"] = $offersCatalog["priceSerenity"];
  195.                     $offers["priceSerenityPlus"] = $offersCatalog["priceSerenityPlus"];
  196.                 } else {
  197.                     $pageTitle "Cliquez sur l'une de ces formules pour choisir le mode de signature et de 
  198.                             transmission de votre plainte";
  199.                     $offers["priceTranquility"] = $offersCatalog["priceTranquility"];
  200.                     $offers["priceTranquilityPlus"] = $offersCatalog["priceTranquilityPlus"];
  201.                 }
  202.             } else {
  203.                 $pageTitle "Cliquez sur l'une de ces formules pour choisir le mode de signature et de transmission 
  204.                         de votre plainte";
  205.                 $offers["priceTranquility"] = $offersCatalog["priceTranquility"];
  206.                 $offers["priceTranquilityPlus"] = $offersCatalog["priceTranquilityPlus"];
  207.             }
  208.         }
  209.         if ($price === null) {
  210.             if (
  211.                 $session->get('expressComplaintType') == 'vehicle'
  212.                 && in_array($session->get('expressComplaintVehicleOwner'), ['loan''rent''work''service'])
  213.             ) {
  214.                 $returnUrl        $this->generateUrl(
  215.                     'express_complaint_x_params',
  216.                     [
  217.                         "type"      => 'vehicle'
  218.                     ]
  219.                 );
  220.             } else {
  221.                 $returnUrl          $this->generateUrl("express_complaint_x_insurance_check");
  222.             }
  223.             return $this->render(
  224.                 'ExpressComplaint/prices.html.twig',
  225.                 [
  226.                     "pageTitle"         => $pageTitle,
  227.                     "offers"            => $offers,
  228.                     "returnUrl"         => $returnUrl
  229.                 ]
  230.             );
  231.         }
  232.         if (!array_key_exists($price$offers)) {
  233.             return $this->redirectToRoute('express_complaint_x_prices');
  234.         }
  235.         $session->set('expressComplaintPriceAmount'$offers[$price]["price"]);
  236.         $session->set('expressComplaintPriceImg'$offers[$price]["price"]);
  237.         $session->set('expressComplaintPrice'$price);
  238.         if ($request->get('accept''yes') === 'no') {
  239.             return $this->render('ExpressComplaint/rightsAndObligations.html.twig'compact('price'));
  240.         }
  241.         return $this->render(
  242.             'ExpressComplaint/summary.html.twig',
  243.             [
  244.                 "hasDigitalSignature" => !in_array($session->get('expressComplaintCategory'), ['priceSerenity''priceTranquility']),
  245.                 "returnUrl"     => $this->generateUrl("express_complaint_x_prices")
  246.             ]
  247.         );
  248.     }
  249.     #[Route(
  250.         '/express/plainte-contre-x-prices-validation-avant-paiement/{id}',
  251.         name'express_complaint_x_final_summary'
  252.     )]
  253.     public function finalSummaryAction(
  254.         Request $request,
  255.         ComplaintXService $complaintXService,
  256.         EntityManagerInterface $em,
  257.         ComplaintX $complaintX,
  258.     ): Response {
  259.         $offer $complaintXService->getOfferCatalog($complaintX->getOfferName() ?? 'priceSerenity');
  260.         $returnUrl $this->generateUrl('express_complaint_x_facts', ['id' => $complaintX->getId()]);
  261.         if (
  262.             $request->getSession()->get('expressComplaintWantSinisterDeclaration') === true &&
  263.             $request->getSession()->get('expressComplaintIsInsured') === true
  264.         ) {
  265.             $returnUrl $this->generateUrl('express_complaint_x_insurance', ['id' => $complaintX->getId()]);
  266.         } else {
  267.             $returnUrl $this->generateUrl('express_complaint_x_prejudice', ['id' => $complaintX->getId()]);
  268.         }
  269.         /** @var User $user */
  270.         $user $this->getUser();
  271.         $originalPhotos = new ArrayCollection();
  272.         if ($user->getIdentityCardPhotos()) {
  273.             foreach ($user->getIdentityCardPhotos() as $photo) {
  274.                 $originalPhotos->add($photo);
  275.             }
  276.         }
  277.         $identityCardForm $this->createForm(IdentityCardType::class, $user, [
  278.             'picture_url' => $this->generateUrl(
  279.                 'asset_display',
  280.                 ['name' => 'identity-card-photo''property' => 'photo''id' => '_id_']
  281.             ),
  282.             'remove_identity_card_photos' => $request->getSession()->get('removeIdentityFiles') === true,
  283.         ]);
  284.         $identityCardForm->handleRequest($request);
  285.         if ($identityCardForm->isSubmitted() && $identityCardForm->isValid()) {
  286.             foreach ($identityCardForm['identityCardPhotos']->getData() as $identityCardPhoto) {
  287.                 $identityCardPhoto->setUser($user);
  288.             }
  289.             foreach ($originalPhotos as $photo) {
  290.                 if (false === $user->getIdentityCardPhotos()->contains($photo)) {
  291.                     $user->getIdentityCardPhotos()->removeElement($photo);
  292.                     $em->remove($photo);
  293.                 }
  294.             }
  295.             $em->flush();
  296.             $request->getSession()->remove('removeIdentityFiles');
  297.             return $this->redirectToRoute(
  298.                 'express_complaint_x_payment',
  299.                 ['id' => $complaintX->getId()]
  300.             );
  301.         }
  302.         return $this->render('ExpressComplaint/finalSummary.html.twig', [
  303.             'breadcrumbComplaintExpress' => 'paiement',
  304.             'progressValue' => 95,
  305.             'navbarTitle' => $request->getSession()->get('expressComplaintCategoryName'),
  306.             'offer' => $offer,
  307.             'returnUrl' => $returnUrl,
  308.             'identityCardForm' => $identityCardForm->createView(),
  309.             'complaintX' => $complaintX,
  310.         ]);
  311.     }
  312.     #[Route("/express/plainte-contre-x-resident-type/{type?}"name"express_complaint_x_resident_type")]
  313.     public function residentTypeAction(Request $request$type null): Response
  314.     {
  315.         $session        $request->getSession();
  316.         if (!$session->get("expressComplaintParams")) {
  317.             return $this->redirectToRoute('express_complaint_x_params');
  318.         }
  319.         if ($type === null) {
  320.             return $this->render(
  321.                 'ExpressComplaint/residentType.html.twig',
  322.                 [
  323.                     'returnUrl' => $this->generateUrl("express_complaint_x_params", ['type' => 'address']),
  324.                 ]
  325.             );
  326.         }
  327.         $session->set('expressComplaintResidentType'$type);
  328.         return $this->redirectToRoute('express_complaint_x_insurance_check');
  329.     }
  330.     #[Route(
  331.         "/express/plainte-contre-x-steal-breaking/{isBreakingsFound?}/{stealVictim?}",
  332.         name"express_complaint_x_steal_breaking"
  333.     )]
  334.     public function stealBreakingAction(Request $request$isBreakingsFound null$stealVictim null): Response
  335.     {
  336.         $session                $request->getSession();
  337.         if (!$session->get('expressComplaintParams')) {
  338.             return $this->redirectToRoute('express_complaint_x_params');
  339.         }
  340.         if ($isBreakingsFound === null || $stealVictim === null) {
  341.             return $this->render(
  342.                 'ExpressComplaint/addressBreakingFound.html.twig',
  343.                 [
  344.                     'returnUrl' => $this->generateUrl("express_complaint_x_params", ['type' => 'address']),
  345.                 ]
  346.             );
  347.         }
  348.         $session->set('expressComplaintIsBreakingsFound'$isBreakingsFound === 'yes');
  349.         $session->set('expressComplaintStealVictim'$stealVictim === 'yes');
  350.         return $this->redirectToRoute('express_complaint_x_insurance_check');
  351.     }
  352.     #[Route("/express/plainte-contre-x-params/{type?}/{category?}"name"express_complaint_x_params")]
  353.     public function paramsAction(Request $request$type null$category null): Response
  354.     {
  355.         $session        $request->getSession();
  356.         if (!$session->get("expressComplaintPresentation")) {
  357.             return $this->redirectToRoute("express_complaint_x_presentation");
  358.         }
  359.         if ($type === null) {
  360.             return $this->render(
  361.                 'ExpressComplaint/params.html.twig',
  362.                 [
  363.                     'returnUrl'                     => $this->generateUrl("express_complaint_x_presentation"),
  364.                 ]
  365.             );
  366.         }
  367.         if ($category === null) {
  368.             $session->set('expressComplaintType'$type);
  369.             if ($type === 'simpleTheft' || $type === 'bikeTheft' || $type === 'phoneTheft') {
  370.                 $session->set('expressComplaintCategory'$type);
  371.                 $session->set('expressComplaintParams'true);
  372.                 return $this->redirectToRoute('express_complaint_x_insurance_check');
  373.             }
  374.             if ($type === 'address') {
  375.                 return $this->render(
  376.                     'ExpressComplaint/addressCategory.html.twig',
  377.                     [
  378.                         'returnUrl' => $this->generateUrl("express_complaint_x_params"),
  379.                     ]
  380.                 );
  381.             } elseif ($type === 'vehicle') {
  382.                 return $this->render(
  383.                     'ExpressComplaint/vehicleOwner.html.twig',
  384.                     [
  385.                         'returnUrl' => $this->generateUrl("express_complaint_x_params"),
  386.                     ]
  387.                 );
  388.             }
  389.             return $this->render(
  390.                 'ExpressComplaint/params.html.twig',
  391.                 [
  392.                     'returnUrl' => $this->generateUrl("express_complaint_x_presentation"),
  393.                 ]
  394.             );
  395.         }
  396.         if ($type === 'vehicle') {
  397.             if (
  398.                 in_array($category, ['mine''partner''loan''rent''work''service''loancomp'])
  399.                 && $request->get('insurance'null) === null
  400.             ) {
  401.                 $session->set('expressComplaintVehicleOwner'$category);
  402.                 return $this->render(
  403.                     'ExpressComplaint/vehicleCategory.html.twig',
  404.                     [
  405.                         'returnUrl' => $this->generateUrl("express_complaint_x_params", ['type' => 'vehicle']),
  406.                     ]
  407.                 );
  408.             } elseif ($request->get('insurance') !== null) {
  409.                 return $this->render('ExpressComplaint/insuranceInfos.html.twig'compact('category''type'));
  410.             } else {
  411.                 $session->set('expressComplaintCategory'$category);
  412.                 $session->set('expressComplaintParams'true);
  413.                 return $this->redirectToRoute('express_complaint_x_insurance_check');
  414.             }
  415.         }
  416.         if ($type === 'address') {
  417.             $session->set('expressComplaintCategory'$category);
  418.             $session->set('expressComplaintParams'true);
  419.             if ($category === 'itemDegradation') {
  420.                 return $this->redirectToRoute('express_complaint_x_resident_type');
  421.             } else {
  422.                 return $this->redirectToRoute('express_complaint_x_steal_breaking');
  423.             }
  424.         }
  425.     }
  426.     #[Route("/express/complaint/register"name"express_complaint_register")]
  427.     public function register(
  428.         Request $request,
  429.         UserRepository $repoUser,
  430.         EmailVerifier $emailVerifier,
  431.         UserPasswordHasherInterface $passwordHasher,
  432.         EntityManagerInterface $entityManager,
  433.     ): Response {
  434.         $session                    $request->getSession();
  435.         if (!$session->get("expressComplaintPrice")) {
  436.             return $this->redirectToRoute("express_complaint_x_prices");
  437.         }
  438.         if ($this->getUser()) {
  439.             return $this->redirectToRoute('express_complaint_x_identity');
  440.         }
  441.         $email                      $session->get("login_register_email");
  442.         if (!$email) {
  443.             return $this->redirectToRoute('login_register');
  444.         }
  445.         if ($repoUser->findByEmail($email)) {
  446.             return $this->redirectToRoute('login');
  447.         }
  448.         $breadcrumbExpress 'express_complaint_login';
  449.         $progressValue 10;
  450.         // Otherwise, get the form to create a new account
  451.         $user = new User();
  452.         $user->setEmail($email);
  453.         $form $this->createForm(RegistrationFormType::class, $user);
  454.         $form->handleRequest($request);
  455.         if ($form->isSubmitted() && $form->isValid()) {
  456.             // encode the plain password
  457.             $user->setPassword(
  458.                 $passwordHasher->hashPassword(
  459.                     $user,
  460.                     $form->get('plainPassword')->getData()
  461.                 )
  462.             );
  463.             $entityManager->persist($user);
  464.             $entityManager->flush();
  465.             // generate a signed url and email it to the user
  466.             $emailVerifier->sendEmailConfirmation(
  467.                 'verify_email',
  468.                 $user,
  469.                 (new DefaultTemplatedEmail())
  470.                     ->to($user->getEmail())
  471.                     ->subject('Veuillez confirmer votre e-mail')
  472.                     ->htmlTemplate('Mail/welcome.html.twig')
  473.             );
  474.             $session->set('expressUser'$user->getId());
  475.             $session->set('self_validating_authentication_options', [
  476.                 'redirect_to' => 'express_complaint_x_identity',
  477.                 'user_id' => $user->getId()
  478.             ]);
  479.             return $this->redirectToRoute('self_validating_authentication');
  480.         }
  481.         $session->set("userType""insc");
  482.         return $this->render('ExpressComplaint/register.html.twig', [
  483.             'form' => $form->createView(),
  484.             'breadcrumbComplaintExpress'    => $breadcrumbExpress,
  485.             'navbarTitle'                   => $session->get('expressComplaintCategoryName'),
  486.             'progressValue'                 => $progressValue,
  487.             'userType'                      => "insc",
  488.         ]);
  489.     }
  490.     #[Route("/express/plainte-contre-x-prejudice/{id}"name"express_complaint_x_prejudice")]
  491.     public function prejudiceAction(Request $requestEntityManagerInterface $emComplaintX $complaintX): Response
  492.     {
  493.         $user $this->getUser();
  494.         if (is_null($user) || is_null($request->getSession()->get('expressComplaintNoTargetDescription'))) {
  495.             return $this->redirectToRoute('express_complaint_x_presentation');
  496.         }
  497.         $progressValue 70;
  498.         $complaintX->expressStep 'prejudice';
  499.         $breadcrumbExpress 'prejudice';
  500.         $complaintXForm $this->createForm(ComplaintXType::class, $complaintX);
  501.         $complaintXForm->handleRequest($request);
  502.         if ($complaintXForm->isSubmitted() && $complaintXForm->isValid()) {
  503.             $em->persist($complaintX);
  504.             $complaintX->setStep(10);
  505.             $em->flush();
  506.             if (
  507.                 $request->getSession()->get('expressComplaintWantSinisterDeclaration') === true &&
  508.                 $request->getSession()->get('expressComplaintIsInsured') === true
  509.             ) {
  510.                 return $this->redirectToRoute('express_complaint_x_insurance', [
  511.                     'id' => $complaintX->getId()
  512.                 ]);
  513.             } elseif ($complaintX->getOfferName() === 'priceSerenityPlus') {
  514.                 return $this->redirectToRoute('express_complaint_x_final_summary', [
  515.                     'id' => $complaintX->getId()
  516.                 ]);
  517.             } else {
  518.                 return $this->redirectToRoute('express_complaint_x_payment', [
  519.                     'id' => $complaintX->getId()
  520.                 ]);
  521.             }
  522.         }
  523.         return $this->render('ExpressComplaint/prejudice.html.twig', [
  524.             'banqueNames' => PaymentMethod::getBanks(),
  525.             'itemCategories' => Item::getCategories(),
  526.             'breadcrumbComplaintExpress' => $breadcrumbExpress,
  527.             'progressValue' => $progressValue,
  528.             'navbarTitle' => $request->getSession()->get('expressComplaintCategoryName'),
  529.             'complaintXForm' => $complaintXForm->createView(),
  530.             "complaintX" => $complaintX,
  531.             'hasInsurance' => $request->getSession()->get('expressComplaintWantSinisterDeclaration') === true &&
  532.                 $request->getSession()->get('expressComplaintIsInsured') === true,
  533.         ]);
  534.     }
  535.     #[Route('/express/plainte-contre-x-assurance/{id}'name'express_complaint_x_insurance')]
  536.     public function insuranceAction(InsuranceRepository $repoInsuranceRequest $requestEntityManagerInterface $emComplaintX $complaintX): Response
  537.     {
  538.         /** @var User $user */
  539.         $user $this->getUser();
  540.         if (is_null($user) || is_null($request->getSession()->get('expressComplaintNoTargetDescription'))) {
  541.             return $this->redirectToRoute('express_complaint_x_presentation');
  542.         }
  543.         $data = [];
  544.         $breadcrumbExpress 'assurance';
  545.         $progressValue 85;
  546.         $insuranceId $request->getSession()->get('expressComplaintInsuranceId');
  547.         $insurance = new Insurance();
  548.         if ($insuranceId) {
  549.             $repoInsurance $em->getRepository('App\Entity\Insurance');
  550.             $insurance $repoInsurance->findOneBy(['id' => $insuranceId]);
  551.         }
  552.         $insurance->setUser($user);
  553.         $em->persist($insurance);
  554.         $repoAddr $em->getRepository('App\Entity\Address');
  555.         $insuranceType      0;
  556.         if (!is_null($insurance->getId()) && is_null($insurance->getInsuranceCompany())) {
  557.             if ($insurance->getCategory() === "multiriskMainHouse") {
  558.                 $insuranceType  = -1;
  559.             } else {
  560.                 $insuranceType  = -2;
  561.             }
  562.         }
  563.         if ($request->getSession()->get('expressComplaintResidentType') === 'main') {
  564.             $insurance->setCategory('multiriskMainHouse');
  565.             $insurance->setAddressInsurance($user->getMainAddress());
  566.         } elseif ($request->getSession()->get('expressComplaintResidentType') === 'second') {
  567.             $insurance->setCategory('multiriskSecondHouse');
  568.             $address $repoAddr->findOneBy(['id' => $request->getSession()->get('expressComplaintSecondAddressId')]);
  569.             $insurance->setAddressInsurance($address);
  570.         } elseif ($request->getSession()->get('expressComplaintResidentType') === 'room') {
  571.             $insurance->setCategory('multiriskOtherLocal');
  572.             $address $repoAddr->findOneBy(['id' => $request->getSession()->get('expressComplaintRoomAddressId')]);
  573.             $insurance->setAddressInsurance($address);
  574.         } elseif ($request->getSession()->get('expressComplaintType') === 'vehicle') {
  575.             $insurance->setCategory('vehicle');
  576.             $repoVehicle $em->getRepository('App\Entity\Vehicle');
  577.             $vehicle $repoVehicle->findOneBy(['id' => $request->getSession()->get('expressComplaintVehicleId')]);
  578.             $insurance->setVehicle($vehicle);
  579.         } else {
  580.             $insurance->setCategory('otherContract');
  581.         }
  582.         $multiriskMainHouseInsurance    null;
  583.         if ($complaintX->getCategory() === "vacancyResidenceBurglary") {
  584.             $multiriskMainHouseInsurance    $repoInsurance->getMultiriskMainHouseInsurance($user);
  585.         }
  586.         $complaintX->expressStep 'insurance';
  587.         $complaintX->setInsurance($insurance);
  588.         $complaintXForm $this->createForm(ComplaintXType::class, $complaintX, [
  589.             'photos_picture_url' => $this->generateUrl(
  590.                 'asset_display',
  591.                 ['name' => 'complaint-x-photo''property' => 'picture''id' => '_id_']
  592.             ),
  593.             'documents_picture_url' => $this->generateUrl(
  594.                 'asset_display',
  595.                 ['name' => 'complaint-x-document''property' => 'document''id' => '_id_']
  596.             )
  597.         ]);
  598.         $complaintXForm->handleRequest($request);
  599.         if ($complaintXForm->isSubmitted()) {
  600.             if ((int)$request->get("cpId") === -1) {
  601.                 if (is_null($multiriskMainHouseInsurance)) {
  602.                     throw new \RuntimeException("Assurance domicile principal introuvable");
  603.                 }
  604.                 $insurance->setCompanyName($multiriskMainHouseInsurance->getCompanyName());
  605.                 $insurance->setCompanyEmail($multiriskMainHouseInsurance->getCompanyEmail());
  606.                 $insurance->setInsuranceCompany($multiriskMainHouseInsurance->getInsuranceCompany());
  607.                 $insurance->setCategory('multiriskMainHouse');
  608.             }
  609.             if ($complaintXForm->isValid()) {
  610.                 $em->persist($complaintX);
  611.                 $complaintX->setStep(11);
  612.                 $em->flush();
  613.                 $request->getSession()->set('expressComplaintInsuranceId'$complaintX->getInsurance()->getId());
  614.                 if ($complaintX->getOfferName() === 'priceSerenityPlus') {
  615.                     return $this->redirectToRoute('express_complaint_x_final_summary', [
  616.                         'id' => $complaintX->getId()
  617.                     ]);
  618.                 } else {
  619.                     return $this->redirectToRoute('express_complaint_x_payment', [
  620.                         'id' => $complaintX->getId()
  621.                     ]);
  622.                 }
  623.             }
  624.         }
  625.         $data['complaintXForm'] = $complaintXForm->createView();
  626.         return $this->render(
  627.             'ExpressComplaint/insurance.html.twig',
  628.             array_merge($data, [
  629.                 'breadcrumbComplaintExpress'        => $breadcrumbExpress,
  630.                 'progressValue'                     => $progressValue,
  631.                 'user'                              => $user,
  632.                 'complaintX'                        => $complaintX,
  633.                 'hasMultiriskMainHouseInsurance'    => !is_null($multiriskMainHouseInsurance),
  634.                 'companies'                         => $em->getRepository(InsuranceCompany::class)
  635.                     ->findBy(['isDeleted' => false]),
  636.                 "insuranceType"                     => $insuranceType,
  637.                 'navbarTitle'                       => $request->getSession()->get('expressComplaintCategoryName'),
  638.             ])
  639.         );
  640.     }
  641.     #[Route('/express/plainte-contre-x-paiement/{id}'name'express_complaint_x_payment')]
  642.     public function paymentAction(
  643.         Request $request,
  644.         StripePaymentService $stripe,
  645.         EntityManagerInterface $entityManager,
  646.         PaymentService $srvPayment,
  647.         ComplaintX $complaintX,
  648.         ComplaintXService $complaintXService,
  649.     ): Response {
  650.         /** @var User $user */
  651.         $user               $this->getUser();
  652.         if (is_null($user) || is_null($request->getSession()->get('expressComplaintNoTargetDescription'))) {
  653.             return $this->redirectToRoute('express_complaint_x_presentation');
  654.         }
  655.         $complaintX->setStep(12);
  656.         $entityManager->persist($complaintX);
  657.         $entityManager->flush();
  658.         if ($complaintX->hasStatus(ComplaintX::STATUS_PAID)) {
  659.             if ($complaintX->hasStatus(ComplaintX::STATUS_DOCUMENT_CHECKED)) {
  660.                 if ($complaintX->hasStatus(ComplaintX::STATUS_SIGNED) || !$complaintX->isHasDigitalSignature()) {
  661.                     return $this->redirectToRoute("user_complaint_x_detail", ["id" => $complaintX->getId()]);
  662.                 }
  663.                 //todo Redirect signature
  664.             }
  665.             //todo Redirect verif document
  666.         }
  667.         $offer $complaintXService->getOfferCatalog($complaintX->getOfferName() ?? 'priceSerenity');
  668.         $amount             $offer['price'] * 100;
  669.         $paymentIntent      $srvPayment->createUpdatePaymentIntent($amount$complaintX);
  670.         //Si paiement accepté, page confirmation paiement accepté
  671.         if ($complaintX->hasStatus(ComplaintX::STATUS_PAYMENT_ACCEPTED)) {
  672.             return $this->redirectToRoute('express_complaint_x_validation', ['id' => $complaintX->getId()]);
  673.         }
  674.         //Si paiement en cours, page en cours
  675.         if (
  676.             $complaintX->hasStatus(ComplaintX::STATUS_PAYMENT_PROCESSING)
  677.             && $complaintX->getPaymentIntentStatus() !== "requires_action"
  678.         ) {
  679.             $processing     true;
  680.             $methods        null;
  681.         } else {
  682.             $processing     false;
  683.             $methods        $stripe->getCards($user->getStripeCustomerId());
  684.         }
  685.         // Sinon affichage formulaire paiement
  686.         $breadcrumbExpress  'paiement';
  687.         $progressValue      95;
  688.         $returnUrl $this->generateUrl('express_complaint_x_prejudice', ['id' => $complaintX->getId()]);
  689.         if ($complaintX->getOfferName() === 'priceSerenityPlus') {
  690.             $returnUrl $this->generateUrl('express_complaint_x_final_summary', ['id' => $complaintX->getId()]);
  691.         }
  692.         if ($complaintX->getIsInsured()) {
  693.             $returnUrl $this->generateUrl('express_complaint_x_insurance', ['id' => $complaintX->getId()]);
  694.         }
  695.         return $this->render('ExpressComplaint/payment.html.twig', [
  696.             "processing"                    => $processing,
  697.             "methods"                       => $methods,
  698.             'breadcrumbComplaintExpress'    => $breadcrumbExpress,
  699.             'progressValue'                 => $progressValue,
  700.             'user'                          => $user,
  701.             'stripePublicKey'               => $stripe->getPublicKey(),
  702.             'stripePaymentIntent'           => $paymentIntent,
  703.             'navbarTitle'                   => $request->getSession()->get('expressComplaintCategoryName'),
  704.             'complaintX'                    => $complaintX,
  705.             'offer'                         => $offer,
  706.             'returnUrl'                     => $returnUrl,
  707.         ]);
  708.     }
  709.     #[Route("/express/plainte-contre-x-validation/{id}"name"express_complaint_x_validation")]
  710.     public function validationAction(
  711.         EntityManagerInterface $entityManager,
  712.         Request $request,
  713.         EntityManagerInterface $em,
  714.         MailerInterface $mailer,
  715.         ComplaintXService $complaintXService,
  716.         ComplaintX $complaintX,
  717.         string $generatedDir
  718.     ): RedirectResponse {
  719.         /** @var User $user */
  720.         $user $this->getUser();
  721.         if (is_null($user)) {
  722.             return $this->redirectToRoute('express_complaint_x_presentation');
  723.         }
  724.         $complaintX->setStep(13);
  725.         $entityManager->persist($complaintX);
  726.         $entityManager->flush();
  727.         if (!$complaintX->hasStatus(ComplaintX::STATUS_PAYMENT_ACCEPTED)) {
  728.             return $this->redirectToRoute("user_complaint_x_detail", ["id" => $complaintX->getId()]);
  729.         }
  730.         $ref $group '';
  731.         $data = [
  732.             "complaintX" => $complaintX,
  733.         ];
  734.         if ($complaintX->getFactsAddress()) {
  735.             $repoAddress $em->getRepository(Address::class);
  736.             $data['address'] = $repoAddress->find($complaintX->getFactsAddress());
  737.         }
  738.         switch ($complaintX->getCategory()) {
  739.             case 'principalResidenceBurglary':
  740.                 $data['target']                 = "dans mon domicile principal";
  741.                 $data['refTarget']              = "de mon domicile principal";
  742.                 $group                          "residence";
  743.                 break;
  744.             case 'secondResidenceBurglary':
  745.                 $data['target']                 = "dans mon domicile secondaire";
  746.                 $data['refTarget']              = "de mon domicile secondaire";
  747.                 $group                          "residence";
  748.                 break;
  749.             case 'otherPlaceBurglary':
  750.                 $data['target']                 = "dans le local mentionné ci-contre";
  751.                 $data['refTarget']              = "de mon local";
  752.                 $group                          "residence";
  753.                 break;
  754.             case 'vacancyResidenceBurglary':
  755.                 $data['target']                 = "ce lieux que j’occupe temporairement comme " $data['address']->getResidentTypeLabel();
  756.                 if ($data['address'] && $data['address']->getArrivalDate()) {
  757.                     $data['target']             .= ' pour la période du ' $data['address']->getArrivalDate()->format('d/m/Y');
  758.                 }
  759.                 if ($data['address'] && $data['address']->getDepartureDate()) {
  760.                     $data['target']             .= ' au '  $data['address']->getDepartureDate()->format('d/m/Y');
  761.                 }
  762.                 $data['refTarget']              = "de mon lieux de résidence de vacances de type";
  763.                 $group                          "residence";
  764.                 break;
  765.             case 'hotelRoomBurglary':
  766.                 $data['target']                 = "de ma chambre d’hôtel";
  767.                 $data['refTarget']              = "de ma chambre d’hôtel";
  768.                 $group                          "residence";
  769.                 break;
  770.             case 'insideVehicleTheft':
  771.                 $ref                            "Vol dans un véhicule";
  772.                 // if (
  773.                 //     $complaintX->getStealVictim()
  774.                 //     && (!empty($complaintX->getItems()) || !empty($complaintX->getNonSavedItem()))
  775.                 // ) {
  776.                 //     $ref = "Vol dans un véhicule";
  777.                 // } else {
  778.                 //     $ref = "Tentative de vol dans un véhicule";
  779.                 // }
  780.                 // if (
  781.                 //     $complaintX->getBreakingsDegradationsFound()
  782.                 //     && $complaintX->getCategory() != "vehicleDegradation"
  783.                 // ) {
  784.                 //     $ref .= " - Dégradation de véhicule";
  785.                 // }
  786.                 break;
  787.             case 'insideVehicleAttempt':
  788.                 $ref                            "Tentative de vol dans un véhicule";
  789.                 break;
  790.             case 'vehicleTheft':
  791.             case 'vehicleDegradation':
  792.             case 'accessoryVehicleTheft':
  793.             case 'vehicleTheftTotal':
  794.                 $ref array_flip($complaintX->getCategories())[$complaintX->getCategory()];
  795.                 // if (
  796.                 //     $complaintX->getStealVictim()
  797.                 //     && (!empty($complaintX->getItems()) || !empty($complaintX->getNonSavedItem()))
  798.                 // ) {
  799.                 //     $ref .= " - Vol dans un véhicule";
  800.                 // }
  801.                 // if (
  802.                 //     $complaintX->getBreakingsDegradationsFound()
  803.                 //     && $complaintX->getCategory() != "vehicleDegradation"
  804.                 // ) {
  805.                 //     $ref .= " - Dégradation de véhicule";
  806.                 // }
  807.                 break;
  808.             case 'simpleTheft':
  809.                 $ref                            'Vol simple';
  810.                 break;
  811.             case 'bikeTheft':
  812.             case 'itemDegradation':
  813.             case 'additionalComplaint':
  814.                 $ref                            array_flip($complaintX->getCategories())[$complaintX->getCategory()];
  815.                 break;
  816.         }
  817.         if ($group === "residence") {
  818.             if ($complaintX->getIsBreakingsFound() && $complaintX->getStealVictim()) {
  819.                 $ref                            .= "Vol avec effraction";
  820.             } elseif ($complaintX->getStealVictim()) {
  821.                 $ref                            .= "Vol sans effraction";
  822.             } else {
  823.                 $ref                            .= "Tentative de vol avec effraction";
  824.             }
  825.         }
  826.         $data['ref'] = $ref;
  827.         $complaintXService->buildTgiData($complaintX);
  828.         $view       null;
  829.         switch ($complaintX->getCategory())
  830.         {
  831.             case "bikeTheft":
  832.             case "hotelRoomBurglary":
  833.             case "itemDegradation":
  834.             case "phoneTheft":
  835.             case "simpleTheft":
  836.             case "vacancyResidenceBurglary":
  837.                 $view   "complaintXPdf_" $complaintX->getCategory();
  838.                 break;
  839.             case "accessoryVehicleTheft":
  840.             case "insideVehicleAttempt":
  841.             case "insideVehicleTheft":
  842.             case "vehicleDegradation":
  843.             case "vehicleTheft":
  844.             case "vehicleTheftTotal":
  845.                 $view   "complaintXPdf_category_vehicle";
  846.                 break;
  847.             case "otherPlaceBurglary":
  848.             case "principalResidenceBurglary":
  849.             case "secondResidenceBurglary":
  850.                 $view   "complaintXPdf_residenceBurglaryContent";
  851.         }
  852.         /**
  853.          * Complaint doc
  854.          */
  855.         $pdfHtmlComplaint $this->render(
  856.             'Complaint/pdf/' $view '.html.twig',
  857.             $data
  858.         );
  859.         $dompdf = new Dompdf();
  860.         $dompdf->loadHtml($pdfHtmlComplaint->getContent());
  861.         $dompdf->setPaper('A4');
  862.         $dompdf->render();
  863.         $canvas $dompdf->getCanvas();
  864.         $canvas->page_text(290820"{PAGE_NUM} / {PAGE_COUNT}"null10, array(000));
  865.         $directory     $generatedDir '/complaintX';
  866.         if (!file_exists($directory) && !mkdir($directory0777true) && !is_dir($directory)) {
  867.             throw new \RuntimeException(sprintf('Directory "%s" was not created'$directory));
  868.         }
  869.         
  870.         file_put_contents($directory '/' $complaintX->getId() . '.pdf'$dompdf->output());
  871.         if ($request->getSession()->get('expressComplaintWantSinisterDeclaration')) {
  872.             $pdfHtmlDisasterDeclaration $this->render('Complaint/complaintXPdfDisasterDeclaration.html.twig'$data);
  873.             $dompdfDisaster = new Dompdf();
  874.             $dompdfDisaster->loadHtml($pdfHtmlDisasterDeclaration->getContent());
  875.             $dompdfDisaster->setPaper('A4');
  876.             $dompdfDisaster->render();
  877.             $canvas $dompdfDisaster->getCanvas();
  878.             $canvas->page_text(290820"{PAGE_NUM} / {PAGE_COUNT}"null10, array(000));
  879.             $directory     $generatedDir '/complaintXDisasterDeclaration';
  880.             if (!file_exists($directory) && !mkdir($directory0777true) && !is_dir($directory)) {
  881.                 throw new \RuntimeException(sprintf('Directory "%s" was not created'$directory));
  882.             }
  883.             file_put_contents(
  884.                 $directory '/' $complaintX->getId() . '.pdf',
  885.                 $dompdfDisaster->output()
  886.             );
  887.         }
  888.         $messageMail = (new DefaultTemplatedEmail())
  889.             ->to($user->getEmail())
  890.             ->context([
  891.                 'price' => $request->getSession()->get('expressComplaintPrice'),
  892.             ])
  893.             ->attach($dompdf->output(), 'lettre-de-plainte.pdf''application/pdf');
  894.         // Send a mail with a validation link generated w/ a token
  895.         if ($request->getSession()->get('expressComplaintWantSinisterDeclaration')) {
  896.             $messageMail
  897.                 ->subject("Dépôt de plainte et déclaration de sinistre #" $complaintX->getId())
  898.                 ->htmlTemplate('Mail/complaintDisasterDeclaration.html.twig')
  899.                 ->attach($dompdfDisaster->output(), 'declaration-de-sinistre.pdf''application/pdf');
  900.         } else {
  901.             $messageMail
  902.                 ->subject("Dépôt de plainte #" $complaintX->getId())
  903.                 ->htmlTemplate('Mail/complaint.html.twig');
  904.         }
  905.         try {
  906.             $mailer->send($messageMail);
  907.         } catch (TransportExceptionInterface $e) {
  908.             error_log('$mailer->send($messageMail) Error : ' $e->getMessage());
  909.             $this->addFlash(
  910.                 'danger',
  911.                 'Un problème est survenu (PDF_MAIL_ERROR), merci de contacter le service client.'
  912.             );
  913.             return $this->redirectToRoute('express_complaint_x_presentation');
  914.         }
  915.         return $this->redirectToRoute('express_complaint_x_completed', ['id' => $complaintX->getId()]);
  916.     }
  917.     #[Route("/express/plainte-contre-x-completed/{id}"name"express_complaint_x_completed")]
  918.     public function completedAction(
  919.         Request $request,
  920.         TokenStorageInterface $tokenStorage,
  921.         ComplaintX $complaintX
  922.     ): Response {
  923.         $expressComplaintSinisterDeclaration false;
  924.         $files = [
  925.             'complaint' => '/upload/complaintX/' $complaintX->getId() . '.pdf',
  926.         ];
  927.         $publicPath $this->getParameter('kernel.project_dir') . '/public';
  928.         if (\file_exists($publicPath '/upload/complaintDisasterDeclaration/' $complaintX->getId() . '.pdf')) {
  929.             $files['disasterDeclaration'] = '/upload/complaintDisasterDeclaration/' $complaintX->getId() . '.pdf';
  930.             $expressComplaintSinisterDeclaration true;
  931.         }
  932. dump($files);
  933.         return $this->render('ExpressComplaint/completed.html.twig', [
  934.             'expressComplaintWantSinisterDeclaration' => $expressComplaintSinisterDeclaration,
  935.             'complaintX' => $complaintX,
  936.             'files' => $files,
  937.         ]);
  938.     }
  939.     #[Route('/express/plainte-contre-x-send/{id}'name'express_complaint_x_send')]
  940.     public function signSendAction(
  941.         ComplaintXService $complaintService,
  942.         EntityManagerInterface $entityManager,
  943.         LoggerInterface $logger,
  944.         ComplaintX $complaintX,
  945.     ): RedirectResponse {
  946.         if (is_null($this->getUser()) || is_null($complaintX)) {
  947.             return $this->redirectToRoute('express_complaint_x_presentation');
  948.         }
  949.         $complaintX->addStatus(ComplaintX::STATUS_SIGN_PENDING);
  950.         try {
  951.             $signatureRequest $complaintService->attachSignature($complaintX);
  952.             $complaintX->setSignatureRequestId($signatureRequest->id);
  953.         } catch (SignatureRequestErrorException $e) {
  954.             $logger->error('SignatureRequestErrorException: ' $e->getMessage());
  955.             return $this->redirectToRoute(
  956.                 'user_complaints',
  957.                 ['alert' => 'warning''complaint' => $complaintX->getId(), 'type' => 'signature_process']
  958.             );
  959.         } catch (SignatureRequestCreationErrorException Exception $e) {
  960.             $logger->error('SignatureRequestCreationErrorException: ' $e->getMessage());
  961.             return $this->redirectToRoute(
  962.                 'user_complaints',
  963.                 ['alert' => 'warning''complaint' => $complaintX->getId(), 'type' => 'signature_creation']
  964.             );
  965.         }
  966.         $entityManager->persist($complaintX);
  967.         $entityManager->flush();
  968.         return $this->redirect($signatureRequest->signers[0]['signature_link']);
  969.     }
  970.     /**
  971.      * @throws Exception
  972.      */
  973.     #[Route('/express/plainte-contre-x-signature/success/{id}'name'express_complaint_x_signature_success')]
  974.     public function signSuccess(
  975.         ComplaintX $complaintX,
  976.         ComplaintXService $complaintService,
  977.         YousignService $yousignService,
  978.     ): RedirectResponse {
  979.         if (!$complaintX->hasStatus(ComplaintX::STATUS_SIGN_PENDING)) {
  980.             return $this->redirectToRoute('user_homepage');
  981.         }
  982.         $signatureRequest $yousignService->getSignatureRequest($complaintX->getSignatureRequestId());
  983.         $complaintService->downloadSignatureDocuments($complaintX$signatureRequest);
  984.         return $this->redirectToRoute('user_complaints', ['alert' => 'success']);
  985.     }
  986.     #[Route('/express/plainte-contre-x-signature/error/{id}'name'express_complaint_x_signature_error')]
  987.     public function signError(
  988.         ComplaintX $complaintX,
  989.     ): RedirectResponse {
  990.         return $this->redirectToRoute('user_complaints', [
  991.             'alert' => 'warning',
  992.             'complaint' => $complaintX->getId(),
  993.             'type' => 'external_error'
  994.         ]);
  995.     }
  996.     #[Route('/express/plainte-contre-x-signature/file/{id}/{type}'name'express_complaint_x_download_file')]
  997.     public function downloadFile(
  998.         ComplaintX $complaintX,
  999.         string $type,
  1000.     ): StreamedResponse {
  1001.         $user $this->getUser();
  1002.         if(is_null($user) || $complaintX->getUser()->getId() !== $user->getId()) {
  1003.             return new StreamedResponse(
  1004.                 function () {
  1005.                     echo 'File not found';
  1006.                 },
  1007.                 403,
  1008.                 [
  1009.                     'Content-Type' => 'text/plain',
  1010.                 ]
  1011.             );
  1012.         }
  1013.         $file = match ($type) {
  1014.             'complaint' => '/upload/complaintX/' $complaintX->getId() . '.pdf',
  1015.             'disasterDeclaration' => '/upload/complaintDisasterDeclaration/' $complaintX->getId() . '.pdf',
  1016.             default => null,
  1017.         };
  1018.         $publicPath $this->getParameter('kernel.project_dir') . '/public';
  1019.         if (\file_exists($publicPath $file)) {
  1020.             $filePath $publicPath $file;
  1021.             return new StreamedResponse(
  1022.                 function () use ($filePath) {
  1023.                     $fileStream fopen($filePath'r');
  1024.                     while (!feof($fileStream)) {
  1025.                         echo fread($fileStream1024); // Adjust chunk size as needed
  1026.                         flush();
  1027.                     }
  1028.                     fclose($fileStream);
  1029.                 },
  1030.                 200,
  1031.                 [
  1032.                     'Content-Type' => 'application/pdf',
  1033.                 ]
  1034.             );
  1035.         }
  1036.         return new StreamedResponse(
  1037.             function () {
  1038.                 echo 'File not found';
  1039.             },
  1040.             404,
  1041.             [
  1042.                 'Content-Type' => 'text/plain',
  1043.             ]
  1044.         );
  1045.     }
  1046. }