src/Controller/DefaultController.php line 226

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Form\AskRegistrationType;
  4. use App\Form\ContextNotificationType;
  5. use App\Form\UrlRegistrationType;
  6. use App\Model\AskRegistration;
  7. use App\Model\ContextNotification;
  8. use App\Model\UrlRegistration;
  9. use App\Service\Gouv\Api\SireneV3;
  10. use Oz\ApiNvl\Model\User;
  11. use App\Service\Chart\Tickets\DeltaMonth;
  12. use App\Service\Chart\Tickets\DeltaTrimester;
  13. use App\Service\Chart\Tickets\Deltayear;
  14. use App\Service\Chart\Tickets\TicketsNature;
  15. use App\Service\Chart\Tickets\TicketsNote;
  16. use App\Service\Chart\Tickets\TicketsUrgence;
  17. use App\Service\Context\ContextHelper;
  18. use App\Service\Dashboard\ChartProvider;
  19. use App\Service\Document\DatasourcetoPdf;
  20. use App\Service\Mail\AccessRequest;
  21. use App\Service\Mail\Support;
  22. use App\Service\News\NewsHelper;
  23. use App\Service\Provider\ContextProvider;
  24. use App\Service\Provider\InterlocutorProvider;
  25. use App\Service\User\NotificationsHelper;
  26. use DateTime;
  27. use Doctrine\ORM\NonUniqueResultException;
  28. use Doctrine\ORM\NoResultException;
  29. use Exception;
  30. use Oz\ApiNvl\Form\Company\AskContextType;
  31. use Oz\ApiNvl\Form\Company\AskCustomerType;
  32. use Oz\ApiNvl\Form\Ticket\TicketCreateType;
  33. use Oz\ApiNvl\Form\User\UserEditType;
  34. use Oz\ApiNvl\Form\User\UserPasswordChangeType;
  35. use Oz\ApiNvl\Form\User\UserTicketNotificationType;
  36. use Oz\ApiNvl\Model\AskContext;
  37. use Oz\ApiNvl\Model\AskCustomer;
  38. use Oz\ApiNvl\Model\Ticket\TicketCreate;
  39. use Oz\ApiNvl\Model\User\UserEdit;
  40. use Oz\ApiNvl\Model\User\UserPasswordChange;
  41. use Oz\ApiNvl\Model\User\UserTicketNotification;
  42. use Oz\ApiNvl\Provider\ContextProvider as ContextProviderApiNvl;
  43. use Oz\ApiNvl\Provider\NewsProvider;
  44. use Oz\ApiNvl\Provider\SuiviTicketProvider;
  45. use Oz\ApiNvl\Provider\TicketProvider;
  46. use Oz\ApiNvl\Provider\UserProvider;
  47. use Oz\NvlPortalDisplayer\Model\Datasource\Datasource;
  48. use Oz\NvlPortalDisplayer\Model\Request\Filter;
  49. use Oz\NvlPortalDisplayer\Model\Request\OrderBy;
  50. use Oz\NvlPortalDisplayer\Model\Request\Pager;
  51. use Oz\NvlPortalDisplayer\Model\Request\Select;
  52. use Oz\NvlPortalDisplayer\Model\RequestFactory;
  53. use Oz\NvlPortalDisplayer\Provider\DatasourceFactory;
  54. use Oz\NvlPortalDisplayer\Service\Helper\DatasourceHelper;
  55. use Oz\NvlPortalDisplayer\Service\Preferences\PreferencesHelper;
  56. use Oz\NvlPortalDisplayer\Service\Provider\ApiUrlProvider;
  57. use Oz\Toolboxe\Form\Type\RecaptchaType;
  58. use Oz\Toolboxe\Model\AjaxNotification;
  59. use Oz\Toolboxe\Model\Breadcrumb;
  60. use Oz\Toolboxe\Model\BreadcrumbStep;
  61. use Psr\Cache\InvalidArgumentException;
  62. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  63. use Symfony\Component\Cache\Adapter\FilesystemAdapter;
  64. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  65. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  66. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  67. use Symfony\Component\Form\Extension\Core\Type\TextType;
  68. use Symfony\Component\HttpFoundation\Request;
  69. use Symfony\Component\HttpFoundation\Response;
  70. use Symfony\Component\Routing\Annotation\Route;
  71. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  72. use Symfony\Component\Security\Core\Exception\UserNotFoundException;
  73. use Symfony\Component\Security\Core\Security;
  74. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security as SecurityGranted;
  75. use Symfony\Component\Validator\Constraints\Email;
  76. use Symfony\Component\Validator\Constraints\Length;
  77. use Symfony\Component\Validator\Constraints\NotBlank;
  78. use Symfony\Contracts\Cache\ItemInterface;
  79. use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
  80. use Symfony\Contracts\HttpClient\Exception\DecodingExceptionInterface;
  81. use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
  82. use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
  83. use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  84. use Symfony\Contracts\HttpClient\HttpClientInterface;
  85. use Twig\Error\LoaderError;
  86. use Twig\Error\RuntimeError;
  87. use Twig\Error\SyntaxError;
  88. /**
  89.  *
  90.  */
  91. class DefaultController extends AbstractController
  92. {
  93.     public const PAGE_NAME 'pageName';
  94.     // /**
  95.     //  * @var HttpClientInterface
  96.     //  */
  97.     // protected $api_ededoc;
  98.     /**
  99.      * @var DatasourceHelper
  100.      */
  101.     protected $datasourceHelper;
  102.     /**
  103.      * @var PreferencesHelper
  104.      */
  105.     protected $preferencesHelper;
  106.     /**
  107.      * @var HttpClientInterface
  108.      */
  109.     protected $api_nvl;
  110.     /**
  111.      * @var DatasourceFactory
  112.      */
  113.     private $datasourceFactory;
  114.     /**
  115.      * @var NewsProvider
  116.      */
  117.     private $newsProvider;
  118.     /**
  119.      * @var UserProvider
  120.      */
  121.     private $userProvider;
  122.     /**
  123.      * @var SuiviTicketProvider
  124.      */
  125.     private $suiviTicketProvider;
  126.     /**
  127.      * @var Security
  128.      */
  129.     private $security;
  130.     /**
  131.      * @param HttpClientInterface $api_nvl
  132.      * @param DatasourceHelper $datasourceHelper
  133.      * @param PreferencesHelper $preferencesHelper
  134.      * @param DatasourceFactory $datasourceFactory
  135.      * @param NewsProvider $newsProvider
  136.      * @param UserProvider $userProvider
  137.      * @param SuiviTicketProvider $suiviTicketProvider
  138.      * @param Security $security
  139.      */
  140.     public function __construct(
  141.         // HttpClientInterface $api_ededoc,
  142.         HttpClientInterface $api_nvl,
  143.         DatasourceHelper    $datasourceHelper,
  144.         PreferencesHelper   $preferencesHelper,
  145.         DatasourceFactory   $datasourceFactory,
  146.         NewsProvider        $newsProvider,
  147.         UserProvider        $userProvider,
  148.         SuiviTicketProvider $suiviTicketProvider,
  149.         Security            $security
  150.     )
  151.     {
  152.         // $this->api_ededoc = $api_ededoc;
  153.         $this->datasourceHelper $datasourceHelper;
  154.         $this->preferencesHelper $preferencesHelper;
  155.         $this->api_nvl $api_nvl;
  156.         $this->datasourceFactory $datasourceFactory;
  157.         $this->newsProvider $newsProvider;
  158.         $this->userProvider $userProvider;
  159.         $this->suiviTicketProvider $suiviTicketProvider;
  160.         $this->security $security;
  161.     }
  162.     /**
  163.      * @Route("/ask-register", name="ASK_REGISTER", methods={"GET","POST"})
  164.      * @param Request $request
  165.      * @param AccessRequest $accessRequest
  166.      * @param SireneV3 $sireneV3
  167.      * @return Response
  168.      * @throws ClientExceptionInterface
  169.      * @throws DecodingExceptionInterface
  170.      * @throws RedirectionExceptionInterface
  171.      * @throws ServerExceptionInterface
  172.      * @throws TransportExceptionInterface
  173.      * @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
  174.      */
  175.     public function askRegister(Request $requestAccessRequest $accessRequestSireneV3 $sireneV3): Response
  176.     {
  177.         if ($this->isGranted('ROLE_SERVICE_DESK_NOVENCI') && !$this->isGranted('ROLE_SERVICE_PORTAIL_NVL')) {
  178.             throw $this->createAccessDeniedException();
  179.         }
  180.         $askregistration = new AskRegistration();
  181.         $form $this->createForm(AskRegistrationType::class, $askregistration);
  182.         $form->handleRequest($request);
  183.         if ($form->isSubmitted() && $form->isValid()) {
  184.             $address $sireneV3->getAddressFromSiret($askregistration->getSiret());
  185.             $askregistration->setAdresse($address);
  186.             $accessRequest->sendmail($askregistration);
  187.             $this->addFlash('success'"La demande d'inscription a bien été envoyée.");
  188.             return $this->redirectToRoute('APP_LOGIN');
  189.         }
  190.         return $this->render('default/ask-register.html.twig', [
  191.             'form' => $form->createView(),
  192.         ]);
  193.     }
  194.     /**
  195.      * @SecurityGranted("is_granted('IS_AUTHENTICATED_FULLY')")
  196.      * @Route("/", name="HOMEPAGE", methods={"GET"})
  197.      * @return Response
  198.      * @throws ClientExceptionInterface
  199.      * @throws DecodingExceptionInterface
  200.      * @throws InvalidArgumentException
  201.      * @throws NoResultException
  202.      * @throws NonUniqueResultException
  203.      * @throws RedirectionExceptionInterface
  204.      * @throws ServerExceptionInterface
  205.      * @throws TransportExceptionInterface
  206.      */
  207.     public function homepage(): Response
  208.     {
  209.         if ($this->isGranted('ROLE_SERVICE_DESK_NOVENCI') && !$this->isGranted('ROLE_SERVICE_PORTAIL_NVL')) {
  210.             return $this->redirectToRoute('APP_DESK_NOVENCI');
  211.         }
  212.         // $testMail->sendmail();
  213.         $cache = new FilesystemAdapter();
  214.         /** @var User $user */
  215.         $user $this->getUser();
  216.         if (!$user instanceof User) {
  217.             throw new UserNotFoundException('Utilisateur inconnu');
  218.         }
  219.         if (!count($user->getContexts())) {
  220.             return $this->redirectToRoute('CONTEXT');
  221.         }
  222.         if (!count($user->getAvailableCustomers())) {
  223.             throw new AccessDeniedException('Impossible d\'utiliser le portail sans clients, veuillez contacter votre responsable.');
  224.         }
  225.         // Récupération des tickets
  226.         $datasourceId 'TICKETSV2';
  227.         $displayerName 'display_homepage_' $datasourceId;
  228.         $this->datasourceFactory->init($datasourceId$displayerNameApiUrlProvider::ENVIRONMENT_NVLDatasource::TYPE_MASTER_VOLET);
  229.         $ticketDatasourceConfig $this->datasourceFactory->getDataSourceConfig();
  230.         $ticketDatasourceConfig->setContexts($user->getAvailableContexts());
  231.         $requestFactory = (new RequestFactory($ticketDatasourceConfig))
  232.             ->addFilter(new Filter('Etat'Filter::EQUALS'En cours'))
  233.             ->setPager(new Pager(14))
  234.         ;
  235.         try {
  236.             $tickets $this->datasourceFactory->getData($requestFactory);
  237.         } catch (Exception $e) {
  238.             $tickets = [
  239.                 'pagination' => [
  240.                     'totalRecords' => 0,
  241.                 ],
  242.                 'data' => [],
  243.             ];
  244.         }
  245.         // Récupération des commandes
  246.         $datasourceId 'COMMANDES';
  247.         $displayerName 'display_homepage_' $datasourceId;
  248.         $this->datasourceFactory->init($datasourceId$displayerNameApiUrlProvider::ENVIRONMENT_NVLDatasource::TYPE_MASTER_VOLET);
  249.         $commandesDatasourceConfig $this->datasourceFactory->getDataSourceConfig();
  250.         $commandesDatasourceConfig->setContexts($user->getAvailableContexts());
  251.         $requestFactory = (new RequestFactory($commandesDatasourceConfig))
  252.             ->addFilter(new Filter('Statut'Filter::EQUALS'En cours'))
  253.             ->setPager(new Pager(14));
  254.         try {
  255.             $commandes $this->datasourceFactory->getData($requestFactory);
  256.         } catch (Exception $e) {
  257.             $commandes = [
  258.                 'pagination' => [
  259.                     'totalRecords' => 0,
  260.                 ],
  261.                 'data' => [],
  262.             ];
  263.         }
  264.         // Récupération des interventions
  265.         $datasourceId 'INTERVENTIONS';
  266.         $displayerName 'display_homepage_' $datasourceId;
  267.         // Date supérieure
  268.         $key md5($user->getEmail() . $displayerName) . 'nextDate';
  269.         $NextDate $cache->get($key, function (ItemInterface $item) use ($datasourceId$displayerName$user) {
  270.             $item->expiresAfter(300);
  271.             $this->datasourceFactory->init($datasourceId$displayerNameApiUrlProvider::ENVIRONMENT_NVLDatasource::TYPE_MASTER_VOLET);
  272.             $requestFactoryNextDate = (new RequestFactory($this->datasourceFactory->getDataSourceConfig()))
  273.                 ->setPager(new Pager(11))
  274.                 ->addSelect(new Select('DLSRHDEB'))
  275.                 ->addFilter(new Filter('DLSRHDEB'Filter::GREATER_THAN, (new DateTime('NOW'))->format(DATE_ATOM)))
  276.                 ->addOrderBy(new OrderBy('DLSRHDEB''0'))
  277.                 ->setForcedContexts($user->getAvailableContexts());
  278.             try {
  279.                 $NextDate $this->datasourceFactory->getData($requestFactoryNextDate)->getData();
  280.                 $NextDateString $NextDate[0]['DLSRHDEB'] ?? null;
  281.                 $NextDateObject $NextDateString ? new DateTime($NextDateString) : null;
  282.             } catch (Exception $e) {
  283.                 $NextDateObject null;
  284.             }
  285.             return $NextDateObject;
  286.         }, 1);
  287.         // Récupération des interventions
  288.         $displayerName 'display_homepage_planifier_' $datasourceId;
  289.         $this->datasourceFactory->init($datasourceId$displayerNameApiUrlProvider::ENVIRONMENT_NVLDatasource::TYPE_MASTER_VOLET);
  290.         $interventionsDatasourceConfig $this->datasourceFactory->getDataSourceConfig();
  291.         $interventionsDatasourceConfig->setContexts($user->getAvailableContexts());
  292.         $requestFactory = (new RequestFactory($interventionsDatasourceConfig))
  293.             ->setPager(new Pager(13))
  294.             ->addFilter(new Filter('Statut'Filter::EQUALS'Planifiée'))
  295.             ->addOrderBy(new OrderBy('DLSRHDEB''0'));
  296.         try {
  297.             $interventionsPlanifiers $this->datasourceFactory->getData($requestFactory);
  298.         } catch (Exception $e) {
  299.             $interventionsPlanifiers = [
  300.                 'pagination' => [
  301.                     'totalRecords' => 0,
  302.                 ],
  303.                 'data' => [],
  304.             ];
  305.         }
  306.         // Récupération des news
  307.         $myToken $user->getToken()->getToken();
  308.         $key md5($user->getEmail() . 'news_nvl');
  309.         try {
  310.             $newsList $cache->get($key, function (ItemInterface $item) use ($myToken) {
  311.                 $item->expiresAfter(30);
  312.                 $newsListresponse $this->newsProvider->getNewsList($myToken, [
  313.                     'pagination' => [
  314.                         'limit' => 4,
  315.                     ],
  316.                     'public' => true,
  317.                 ]);
  318.                 if (200 !== $newsListresponse->getStatusCode()) {
  319.                     throw new Exception('Impossible de récupérer les news');
  320.                 }
  321.                 $newsData $newsListresponse->toArray();
  322.                 return $newsData['news'] ?? [];
  323.             }, 1);
  324.         } catch (Exception $e) {
  325.             $newsList = [];
  326.         }
  327.         $this->datasourceFactory->init(
  328.             'INTERVENTIONS',
  329.             'display_static_INTERVENTIONS_homepage',
  330.             ApiUrlProvider::ENVIRONMENT_NVL,
  331.             Datasource::TYPE_MASTER_VOLET,
  332.             true);
  333.         $osDatasourceConfig $this->datasourceFactory->getDataSourceConfig();
  334.         $this->datasourceFactory->init(
  335.             'MARKETING',
  336.             'display_static_MARKETING_homepage',
  337.             ApiUrlProvider::ENVIRONMENT_NVL,
  338.             Datasource::TYPE_MASTER_VOLET,
  339.             true);
  340.         $marketingDatasourceConfig $this->datasourceFactory->getDataSourceConfig();
  341.         $defaultContexts ContextProvider::getContexts();
  342.         // if (ContextGedimat::isGedimatExist($user->getAvailableContexts())) {
  343.         //     // prise en charge de expert com gédimat
  344.         //     $defaultContexts[] = [
  345.         //         ContextProvider::ID          => 8,
  346.         //         ContextProvider::CODE        => ContextProvider::EXPERT_COM,
  347.         //         ContextProvider::LABEL       => 'Expert Com Gédimat',
  348.         //         ContextProvider::URL         => 'https://www.expert-com.com/',
  349.         //         ContextProvider::DESCRIPTION => 'Spécialiste en Gestion Télécom',
  350.         //     ];
  351.         //     // on supprime le expert com normal si il y a expert com gedimat
  352.         //     ContextGedimat::removeExpertComFromAppContextsIfGedimatIsHere($defaultContexts);
  353.         // }
  354.         return $this->render('default/index.html.twig', [
  355.             // TODO: À voir comment faire
  356.             // 'searchParams' => $requestFactory->getRequestParams(),
  357.             // 'searchParams' => $requestFactoryNextDate->getRequestParams(),
  358.             'newsList' => $newsList,
  359.             'ticketsDataFields' => $ticketDatasourceConfig->getFields()->toArray(),
  360.             'commandesDataFields' => $commandesDatasourceConfig->getFields()->toArray(),
  361.             'interventionsDataFields' => $interventionsDatasourceConfig->getFields()->toArray(),
  362.             'tickets' => $tickets,
  363.             'commandes' => $commandes,
  364.             'interventionsPlanifiers' => $interventionsPlanifiers,
  365.             'osDatasource' => $osDatasourceConfig,
  366.             'marketingDatasource' => $marketingDatasourceConfig,
  367.             'osCustom' => [
  368.                 'volet-view' => 'datasource/os/_detail-volet-os.html.twig',
  369.             ],
  370.             'marketingCustom' => [
  371.                 'volet-view' => 'datasource/os/_detail-volet-marketing.html.twig',
  372.             ],
  373.             'interventions_calendar' => [
  374.                 'nextDate' => $NextDate,
  375.             ],
  376.             'contexts' => $defaultContexts,
  377.         ]);
  378.     }
  379.     /**
  380.      * @SecurityGranted("is_granted('IS_AUTHENTICATED_FULLY') and is_granted('ROLE_SERVICE_PORTAIL_NVL')")
  381.      * @Route("/choose-context/{contextId}", name="CHOOSE_CONTEXT", methods={"GET"})
  382.      * @param int $contextId
  383.      * @return Response
  384.      */
  385.     public function chooseContext(int $contextId): Response
  386.     {
  387.         /** @var User $user */
  388.         $user $this->getUser();
  389.         if (!$context $user->getAvailableContextById($contextId)) {
  390.             return $this->redirectToRoute('HOMEPAGE');
  391.         }
  392.         $this->getUser()->clearContexts()
  393.             ->setContexts([$context]);
  394.         return $this->redirectToRoute('DASHBOARD');
  395.     }
  396.     /**
  397.      * @SecurityGranted("is_granted('IS_AUTHENTICATED_FULLY') and is_granted('ROLE_SERVICE_PORTAIL_NVL')")
  398.      * @Route("/dashboard", name="DASHBOARD", methods={"GET"})
  399.      * @param ChartProvider $chartProvider
  400.      * @param InterlocutorProvider $interlocutorProvider
  401.      * @param NewsHelper $newsHelper
  402.      * @return Response
  403.      * @throws ClientExceptionInterface
  404.      * @throws DecodingExceptionInterface
  405.      * @throws InvalidArgumentException
  406.      * @throws NoResultException
  407.      * @throws NonUniqueResultException
  408.      * @throws RedirectionExceptionInterface
  409.      * @throws ServerExceptionInterface
  410.      * @throws TransportExceptionInterface
  411.      */
  412.     public function dashboard(ChartProvider $chartProviderInterlocutorProvider $interlocutorProviderNewsHelper $newsHelper): Response
  413.     {
  414.         $breadcrumb = new Breadcrumb([
  415.             new BreadcrumbStep('Dashboard'),
  416.         ]);
  417.         /** @var User $user */
  418.         $user $this->getUser();
  419.         if (!$user->getContexts()) {
  420.             return $this->redirectToRoute('CONTEXT');
  421.         }
  422.         $chartProvider->init();
  423.         $this->datasourceFactory->init(
  424.             'IC_AFFECTES',
  425.             'display_dashboard_' 'IC_AFFECTES',
  426.             ApiUrlProvider::ENVIRONMENT_NVL,
  427.             Datasource::TYPE_MASTER_COLLAPSE
  428.         );
  429.         $isAffectesDataToFiltered $this->datasourceFactory->getData()->getData();
  430.         $isAffectesDataFiltered = [];
  431.         foreach ($isAffectesDataToFiltered as $item) {
  432.             $key trim($item['REP_NOM']) . trim($item['REP_MAIL']);
  433.             if (!array_key_exists($key$isAffectesDataFiltered)) {
  434.                 $isAffectesDataFiltered[$key] = [
  435.                     'item' => $item,
  436.                     'contexts' => [$item['CLI_RAISOC']],
  437.                 ];
  438.                 continue;
  439.             }
  440.             $isAffectesDataFiltered[$key]['contexts'][] = $item['CLI_RAISOC'];
  441.         }
  442.         $currentContext array_values($user->getContexts())[0];
  443.         // $cache         = new FilesystemAdapter();
  444.         // $categoryIds   = NewsHelper::getNewsCategoryByContext($user->getFirstContext()->getId());
  445.         // $key           = md5(implode('_', $categoryIds) . $user->getEmail() . 'important_news');
  446.         // $importantNews = $cache->get($key, function (ItemInterface $item) use ($user, $newsProvider, $categoryIds) {
  447.         //     $item->expiresAfter(60 * 20);
  448.         //     $responseImportantNews = $newsProvider->getPriorityNews($categoryIds, $this->getUser()->getToken()->getToken());
  449.         //
  450.         //     if (200 === $responseImportantNews->getStatusCode()) {
  451.         //         $news = $responseImportantNews->toArray()['news'];
  452.         //         if (count($news)) {
  453.         //             return $news[array_key_first($news)];
  454.         //         }
  455.         //         return null;
  456.         //     }
  457.         //     return null;
  458.         // }, 1);
  459.         return $this->render('default/dashboard.html.twig', [
  460.             'currentContext' => $currentContext,
  461.             'interlocutors' => $interlocutorProvider->getInterlocutorByContext($currentContext$user),
  462.             'breadcrumb' => $breadcrumb,
  463.             'isAffectesData' => $this->datasourceFactory->getData(),
  464.             'isAffectesDataFiltered' => $isAffectesDataFiltered,
  465.             'charts' => [
  466.                 'tickets' => [
  467.                     'DeltaYear' => $chartProvider->makeChart('TICKETSV2'Deltayear::class),
  468.                     'DeltaTrimester' => $chartProvider->makeChart('TICKETSV2'DeltaTrimester::class),
  469.                     'DeltaMonth' => $chartProvider->makeChart('TICKETSV2'DeltaMonth::class),
  470.                     'ByUrgence' => $chartProvider->makeChart('TICKETSV2'TicketsUrgence::class),
  471.                     'ByNature' => $chartProvider->makeChart('TICKETSV2'TicketsNature::class),
  472.                     'ByNote' => $chartProvider->makeChart('TICKETSV2'TicketsNote::class),
  473.                 ],
  474.             ],
  475.             'importantNews' => $newsHelper->getImportantNews(true),
  476.         ]);
  477.     }
  478.     /**
  479.      * TODO: Ancienne route, à supprimer ? La route active c'est /profil dans ProfileController
  480.      * @SecurityGranted("is_granted('IS_AUTHENTICATED_FULLY') and is_granted('ROLE_SERVICE_PORTAIL_NVL')")
  481.      * @Route("/mon-profil", name="PROFILE", methods={"GET","POST"}, options={"expose"=true})
  482.      * @param Request $request
  483.      * @param UserProvider $userProvider
  484.      * @param ContextProviderApiNvl $contextProvider
  485.      * @return Response
  486.      * @throws ClientExceptionInterface
  487.      * @throws DecodingExceptionInterface
  488.      * @throws RedirectionExceptionInterface
  489.      * @throws ServerExceptionInterface
  490.      * @throws TransportExceptionInterface
  491.      */
  492.     public function profile(Request $requestUserProvider $userProviderContextProviderApiNvl $contextProvider): Response
  493.     {
  494.         /** @var User $user */
  495.         $user $this->getUser();
  496.         $userEdit = (new UserEdit())
  497.             ->setPhone($user->getInfo()->getPhone())
  498.             ->setFonction($user->getInfo()->getFonction());
  499.         $userEditform $this->createForm(UserEditType::class, $userEdit);
  500.         // Informations
  501.         $userEditform->handleRequest($request);
  502.         if ($userEditform->isSubmitted() && $userEditform->isValid()) {
  503.             $user->getInfo()
  504.                 ->setPhone($userEdit->getPhone())
  505.                 ->setFonction($userEdit->getFonction());
  506.             $userProvider->changeInfo($userEdit);
  507.             $this->addFlash('success''Vos information ont été modifiées avec succès.');
  508.             return $this->redirectToRoute('PROFILE');
  509.         }
  510.         // Mot de passe
  511.         $userPasswordChange = (new UserPasswordChange())->setEmail($this->getUser()->getEmail());
  512.         $userEditPasswordform $this->createForm(UserPasswordChangeType::class, $userPasswordChange);
  513.         $userEditPasswordform->handleRequest($request);
  514.         if ($userEditPasswordform->isSubmitted() && $userEditPasswordform->isValid()) {
  515.             $userProvider->changePassword($userPasswordChange);
  516.             $this->addFlash('success''Mot de passe modifié avec succès.');
  517.             return $this->redirectToRoute('PROFILE');
  518.         }
  519.         // Notifications
  520.         $userTicketNotification = new UserTicketNotification();
  521.         $userTicketNotification->setTypeOfNotification($user->getInfo()->getTrackingTickets() ?? 1);
  522.         $userTicketNotificationForm $this->createForm(UserTicketNotificationType::class, $userTicketNotification, []);
  523.         $userTicketNotificationForm->handleRequest($request);
  524.         if ($userTicketNotificationForm->isSubmitted() && $userTicketNotificationForm->isValid()) {
  525.             $user->getInfo()->setTrackingTickets($userTicketNotification->getTypeOfNotification());
  526.             $this->suiviTicketProvider->updateContextNotifications([], $userTicketNotification->getTypeOfNotification());
  527.             $this->addFlash('success''Vos préférences de notifications ont été modifiées avec succès.');
  528.             return $this->redirectToRoute('PROFILE');
  529.         }
  530.         // Notifications par contextes
  531.         $userInfos $this->userProvider->getInfos()->toArray();
  532.         $contextNotification = new ContextNotification($user$userInfos);
  533.         $formContextNotification $this->createForm(ContextNotificationType::class, $contextNotification, [
  534.             'user' => $user,
  535.         ]);
  536.         $formContextNotification->handleRequest($request);
  537.         if ($formContextNotification->isSubmitted() && $formContextNotification->isValid()) {
  538.             // Faire la difference de ces valeurs après submit , et envoi vers API pour MAJ
  539.             $emailingSubscriptions NotificationsHelper::getResultToSend($contextNotification->getFormChoices(), $contextNotification->getFormAbonnements());
  540.             $this->suiviTicketProvider->updateContextNotifications($emailingSubscriptions$user->getInfo()->getTrackingTickets());
  541.             $context ContextHelper::getContextById($user$contextNotification->getContext());
  542.             $this->addFlash('success'sprintf('Les notifications pour la marque <strong>%s</strong> ont bien été modifiées'$context->getLabel()));
  543.             return $this->redirectToRoute('PROFILE');
  544.         }
  545.         // Ask context
  546.         $askContext = new AskContext();
  547.         $formAskContext $this->createForm(AskContextType::class, $askContext);
  548.         $formAskContext->handleRequest($request);
  549.         if ($formAskContext->isSubmitted() && $formAskContext->isValid()) {
  550.             if ($this->userProvider->askContext($askContext$user->getFirstContext()->getId())) {
  551.                 $this->addFlash('success''Demande de marques envoyées avec succès. Le traitement manuel sera fait dans les 3 jours.');
  552.             } else {
  553.                 $this->addFlash('error''Une erreur est survenue');
  554.             }
  555.             return $this->redirectToRoute('PROFILE');
  556.         }
  557.         // Ask customer
  558.         $askCustomer = new AskCustomer();
  559.         $formAskCustomer $this->createForm(AskCustomerType::class, $askCustomer);
  560.         $formAskCustomer->handleRequest($request);
  561.         if ($formAskCustomer->isSubmitted() && $formAskCustomer->isValid()) {
  562.             if ($this->userProvider->askCustomer($askCustomer$user->getFirstContext()->getId())) {
  563.                 $this->addFlash('success''Demande de client envoyée avec succès. Le traitement manuel sera fait dans les 3 jours.');
  564.             } else {
  565.                 $this->addFlash('error''Une erreur est survenue');
  566.             }
  567.             return $this->redirectToRoute('PROFILE');
  568.         }
  569.         return $this->render('default/profile.html.twig', [
  570.             'context' => $user->getFirstContext(),
  571.             'allContexts' => $contextProvider->getContexts(false),
  572.             'forms' => [
  573.                 'notifications' => $userTicketNotificationForm->createView(),
  574.                 'user' => $userEditform->createView(),
  575.                 'password' => $userEditPasswordform->createView(),
  576.                 'context' => $formAskContext->createView(),
  577.                 'customer' => $formAskCustomer->createView(),
  578.                 'formContext' => $formContextNotification->createView(),
  579.             ],
  580.         ]);
  581.     }
  582.     /**
  583.      * @Route("/pdf", name="PDF", methods={"POST"})
  584.      * @param Request $request
  585.      * @param DatasourcetoPdf $datasourcetoPdf
  586.      * @return Response
  587.      * @throws LoaderError
  588.      * @throws RuntimeError
  589.      * @throws SyntaxError
  590.      */
  591.     public function pdf(Request $requestDatasourcetoPdf $datasourcetoPdf): Response
  592.     {
  593.         $lineParam json_decode($request->get('lineParam'), true);
  594.         $childrenParam json_decode($request->get('childrenParam'), true);
  595.         $keyValues json_decode($request->get('keyValues'), true);
  596.         $view $request->get('view');
  597.         return $this->file($datasourcetoPdf->getPdf($view$lineParam$childrenParam$keyValues), 'file.pdf');
  598.     }
  599.     /**
  600.      * @Route("/test", name="TEST", methods={"GET","POST"})
  601.      */
  602.     public function test(HttpClientInterface $httpClient): Response
  603.     {
  604.         return $this->render('default/test.html.twig', []);
  605.     }
  606.     /**
  607.      * @Route("/test-form", name="TEST_FORM", methods={"GET","POST"}, options={"expose"=true})
  608.      * @param Request $request
  609.      * @param TicketProvider $ticketProvider
  610.      * @return Response
  611.      * @throws TransportExceptionInterface
  612.      */
  613.     public function testForm(Request $requestTicketProvider $ticketProvider): Response
  614.     {
  615.         $fullSubmit filter_var($request->request->get('fullSubmit'), FILTER_VALIDATE_BOOLEAN);
  616.         $ticketCreate = new TicketCreate();
  617.         $form $this->createForm(TicketCreateType::class, $ticketCreate, []);
  618.         $form->handleRequest($request);
  619.         if ($form->isSubmitted() && $form->isValid() && $fullSubmit) {
  620.             $response $ticketProvider->create($ticketCreate);
  621.             if (200 !== $response->getStatusCode()) {
  622.                 return $this->json([
  623.                     'status' => false,
  624.                     'close' => false,
  625.                     AjaxNotification::AJAX_INDEX => new AjaxNotification('error''Problème lors de la création du ticket.'),
  626.                 ]);
  627.             }
  628.             return $this->json([
  629.                 'status' => true,
  630.                 'close' => true,
  631.                 AjaxNotification::AJAX_INDEX => new AjaxNotification('success''Le ticket a bien été créé.'),
  632.             ]);
  633.         }
  634.         if (!$fullSubmit) {
  635.             $form->clearErrors(true);
  636.         }
  637.         return $this->json([
  638.             'status' => true,
  639.             'close' => false,
  640.             'html' => $this->renderView('default/create-ticket.html.twig', [
  641.                 'form' => $form->createView(),
  642.             ]),
  643.         ]);
  644.     }
  645.     /**
  646.      * @Route("/register/{email}/{hash}", name="URL_REGISTER", methods={"GET","POST"})
  647.      * @param Request $request
  648.      * @param string $email
  649.      * @param string $hash
  650.      * 123456azertYUIO!*
  651.      * @return Response
  652.      * @throws ClientExceptionInterface
  653.      * @throws DecodingExceptionInterface
  654.      * @throws RedirectionExceptionInterface
  655.      * @throws ServerExceptionInterface
  656.      * @throws TransportExceptionInterface
  657.      */
  658.     public function urlRegister(Request $requeststring $emailstring $hash): Response
  659.     {
  660.         $urlRegistration = new UrlRegistration();
  661.         $urlRegistration
  662.             ->setEmail($email)
  663.             ->setHash($hash);
  664.         $form $this->createForm(UrlRegistrationType::class, $urlRegistration);
  665.         $form->handleRequest($request);
  666.         if ($form->isSubmitted() && $form->isValid()) {
  667.             $response $this->userProvider->newAccountpassword($urlRegistration);
  668.             if (200 === $response->getStatusCode()) {
  669.                 $this->addFlash('success''La demande création du compte a bien été finalisée.');
  670.                 return $this->redirectToRoute('APP_LOGIN');
  671.             }
  672.             switch ($response->toArray(false)['message'] ?? null) {
  673.                 case'UserNotFound':
  674.                     $errorText 'L\'utilisateur demandé n\'est pas actif.';
  675.                     break;
  676.                 case'NoRequest':
  677.                     $errorText 'Il n\'y a pas de demande en cours pour cet utilisateur.';
  678.                     break;
  679.                 case'BadHash':
  680.                 case'RequestExpired':
  681.                     $errorText 'Ce lien n\'est plus valide ou à expiré.';
  682.                     break;
  683.                 default:
  684.                     $errorText 'La demande de création du compte a rencontré un problème.';
  685.             }
  686.             $this->addFlash('danger'$errorText);
  687.         }
  688.         return $this->render('default/url-register.html.twig', [
  689.             'form' => $form->createView(),
  690.         ]);
  691.     }
  692.     /**
  693.      * @Route("/support", name="SUPPORT", methods={"GET","POST"})
  694.      * @param Request $request
  695.      * @param Support $support
  696.      * @return Response
  697.      * @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
  698.      */
  699.     public function support(Request $requestSupport $support): Response
  700.     {
  701.         if ($this->isGranted('ROLE_SERVICE_DESK_NOVENCI') && !$this->isGranted('ROLE_SERVICE_PORTAIL_NVL')) {
  702.             return $this->redirectToRoute('APP_DESK_NOVENCI_SUPPORT');
  703.         }
  704.         /** @var User $user */
  705.         $user $this->getUser();
  706.         $context $user
  707.             $user->getFirstContext() ? $user->getFirstContext()->getId() : null
  708.             null;
  709.         $name $user
  710.             sprintf('%s %s'$user->getInfo()->getFirstname(), $user->getInfo()->getLastname())
  711.             : '';
  712.         $builder $this->createFormBuilder(
  713.             [
  714.                 'name' => $name,
  715.                 'message' => '',
  716.                 'context' => $context,
  717.             ]
  718.         )
  719.             ->add('name'TextType::class, [
  720.                 'label' => 'Votre Nom',
  721.                 'constraints' => [
  722.                     new NotBlank(),
  723.                     new Length(['min' => 5'max' => 80]),
  724.                 ],
  725.             ])
  726.             ->add('email'EmailType::class, [
  727.                 'label' => 'Votre Email',
  728.                 'constraints' => [
  729.                     new Email(),
  730.                 ],
  731.             ])
  732.             ->add('objet'TextType::class, [
  733.                 'label' => 'Objet',
  734.                 'constraints' => [
  735.                     new NotBlank(),
  736.                     new Length(['min' => 10'max' => 240]),
  737.                 ],
  738.             ])
  739.             ->add('message'TextareaType::class, [
  740.                 'label' => 'Votre message',
  741.                 'constraints' => [
  742.                     new NotBlank(),
  743.                     new Length(['min' => 10'max' => 2500]),
  744.                 ],
  745.             ])
  746.             ->add('recatpchaValue'RecaptchaType::class);
  747.         if ($user) {
  748.             $contexts = [];
  749.             foreach ($user->getAvailableContexts() as $availableContext) {
  750.                 $contexts[$availableContext->getLabel()] = $availableContext->getId();
  751.             }
  752.             $builder->add('context'ChoiceType::class, [
  753.                 'choices' => $contexts,
  754.                 'label' => 'Marque concernée',
  755.             ]);
  756.         }
  757.         $form $builder->getForm();
  758.         $form->handleRequest($request);
  759.         if ($form->isSubmitted() && $form->isValid()) {
  760.             $support->sendmail($form->getData());
  761.             $this->addFlash('success''Votre demande a bien été envoyée au support.');
  762.             return $this->redirectToRoute('HOMEPAGE');
  763.         }
  764.         return $this->render('default/support.html.twig', [
  765.                 'form' => $form->createView(),
  766.             ]
  767.         );
  768.     }
  769.     /**
  770.      * @Route("/_maintenance", name="MAINTENANCE", methods={"GET"})
  771.      * @return Response
  772.      */
  773.     public function maintenance(): Response
  774.     {
  775.         return $this->render('default/maintenance.html.twig', [
  776.             'ip' => $_SERVER['REMOTE_ADDR'],
  777.         ]);
  778.     }
  779. }