<?php
namespace App\Controller;
use App\Form\AskRegistrationType;
use App\Form\ContextNotificationType;
use App\Form\UrlRegistrationType;
use App\Model\AskRegistration;
use App\Model\ContextNotification;
use App\Model\UrlRegistration;
use App\Service\Gouv\Api\SireneV3;
use Oz\ApiNvl\Model\User;
use App\Service\Chart\Tickets\DeltaMonth;
use App\Service\Chart\Tickets\DeltaTrimester;
use App\Service\Chart\Tickets\Deltayear;
use App\Service\Chart\Tickets\TicketsNature;
use App\Service\Chart\Tickets\TicketsNote;
use App\Service\Chart\Tickets\TicketsUrgence;
use App\Service\Context\ContextHelper;
use App\Service\Dashboard\ChartProvider;
use App\Service\Document\DatasourcetoPdf;
use App\Service\Mail\AccessRequest;
use App\Service\Mail\Support;
use App\Service\News\NewsHelper;
use App\Service\Provider\ContextProvider;
use App\Service\Provider\InterlocutorProvider;
use App\Service\User\NotificationsHelper;
use DateTime;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use Exception;
use Oz\ApiNvl\Form\Company\AskContextType;
use Oz\ApiNvl\Form\Company\AskCustomerType;
use Oz\ApiNvl\Form\Ticket\TicketCreateType;
use Oz\ApiNvl\Form\User\UserEditType;
use Oz\ApiNvl\Form\User\UserPasswordChangeType;
use Oz\ApiNvl\Form\User\UserTicketNotificationType;
use Oz\ApiNvl\Model\AskContext;
use Oz\ApiNvl\Model\AskCustomer;
use Oz\ApiNvl\Model\Ticket\TicketCreate;
use Oz\ApiNvl\Model\User\UserEdit;
use Oz\ApiNvl\Model\User\UserPasswordChange;
use Oz\ApiNvl\Model\User\UserTicketNotification;
use Oz\ApiNvl\Provider\ContextProvider as ContextProviderApiNvl;
use Oz\ApiNvl\Provider\NewsProvider;
use Oz\ApiNvl\Provider\SuiviTicketProvider;
use Oz\ApiNvl\Provider\TicketProvider;
use Oz\ApiNvl\Provider\UserProvider;
use Oz\NvlPortalDisplayer\Model\Datasource\Datasource;
use Oz\NvlPortalDisplayer\Model\Request\Filter;
use Oz\NvlPortalDisplayer\Model\Request\OrderBy;
use Oz\NvlPortalDisplayer\Model\Request\Pager;
use Oz\NvlPortalDisplayer\Model\Request\Select;
use Oz\NvlPortalDisplayer\Model\RequestFactory;
use Oz\NvlPortalDisplayer\Provider\DatasourceFactory;
use Oz\NvlPortalDisplayer\Service\Helper\DatasourceHelper;
use Oz\NvlPortalDisplayer\Service\Preferences\PreferencesHelper;
use Oz\NvlPortalDisplayer\Service\Provider\ApiUrlProvider;
use Oz\Toolboxe\Form\Type\RecaptchaType;
use Oz\Toolboxe\Model\AjaxNotification;
use Oz\Toolboxe\Model\Breadcrumb;
use Oz\Toolboxe\Model\BreadcrumbStep;
use Psr\Cache\InvalidArgumentException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\Exception\UserNotFoundException;
use Symfony\Component\Security\Core\Security;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security as SecurityGranted;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Contracts\Cache\ItemInterface;
use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\DecodingExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
/**
*
*/
class DefaultController extends AbstractController
{
public const PAGE_NAME = 'pageName';
// /**
// * @var HttpClientInterface
// */
// protected $api_ededoc;
/**
* @var DatasourceHelper
*/
protected $datasourceHelper;
/**
* @var PreferencesHelper
*/
protected $preferencesHelper;
/**
* @var HttpClientInterface
*/
protected $api_nvl;
/**
* @var DatasourceFactory
*/
private $datasourceFactory;
/**
* @var NewsProvider
*/
private $newsProvider;
/**
* @var UserProvider
*/
private $userProvider;
/**
* @var SuiviTicketProvider
*/
private $suiviTicketProvider;
/**
* @var Security
*/
private $security;
/**
* @param HttpClientInterface $api_nvl
* @param DatasourceHelper $datasourceHelper
* @param PreferencesHelper $preferencesHelper
* @param DatasourceFactory $datasourceFactory
* @param NewsProvider $newsProvider
* @param UserProvider $userProvider
* @param SuiviTicketProvider $suiviTicketProvider
* @param Security $security
*/
public function __construct(
// HttpClientInterface $api_ededoc,
HttpClientInterface $api_nvl,
DatasourceHelper $datasourceHelper,
PreferencesHelper $preferencesHelper,
DatasourceFactory $datasourceFactory,
NewsProvider $newsProvider,
UserProvider $userProvider,
SuiviTicketProvider $suiviTicketProvider,
Security $security
)
{
// $this->api_ededoc = $api_ededoc;
$this->datasourceHelper = $datasourceHelper;
$this->preferencesHelper = $preferencesHelper;
$this->api_nvl = $api_nvl;
$this->datasourceFactory = $datasourceFactory;
$this->newsProvider = $newsProvider;
$this->userProvider = $userProvider;
$this->suiviTicketProvider = $suiviTicketProvider;
$this->security = $security;
}
/**
* @Route("/ask-register", name="ASK_REGISTER", methods={"GET","POST"})
* @param Request $request
* @param AccessRequest $accessRequest
* @param SireneV3 $sireneV3
* @return Response
* @throws ClientExceptionInterface
* @throws DecodingExceptionInterface
* @throws RedirectionExceptionInterface
* @throws ServerExceptionInterface
* @throws TransportExceptionInterface
* @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
*/
public function askRegister(Request $request, AccessRequest $accessRequest, SireneV3 $sireneV3): Response
{
if ($this->isGranted('ROLE_SERVICE_DESK_NOVENCI') && !$this->isGranted('ROLE_SERVICE_PORTAIL_NVL')) {
throw $this->createAccessDeniedException();
}
$askregistration = new AskRegistration();
$form = $this->createForm(AskRegistrationType::class, $askregistration);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$address = $sireneV3->getAddressFromSiret($askregistration->getSiret());
$askregistration->setAdresse($address);
$accessRequest->sendmail($askregistration);
$this->addFlash('success', "La demande d'inscription a bien été envoyée.");
return $this->redirectToRoute('APP_LOGIN');
}
return $this->render('default/ask-register.html.twig', [
'form' => $form->createView(),
]);
}
/**
* @SecurityGranted("is_granted('IS_AUTHENTICATED_FULLY')")
* @Route("/", name="HOMEPAGE", methods={"GET"})
* @return Response
* @throws ClientExceptionInterface
* @throws DecodingExceptionInterface
* @throws InvalidArgumentException
* @throws NoResultException
* @throws NonUniqueResultException
* @throws RedirectionExceptionInterface
* @throws ServerExceptionInterface
* @throws TransportExceptionInterface
*/
public function homepage(): Response
{
if ($this->isGranted('ROLE_SERVICE_DESK_NOVENCI') && !$this->isGranted('ROLE_SERVICE_PORTAIL_NVL')) {
return $this->redirectToRoute('APP_DESK_NOVENCI');
}
// $testMail->sendmail();
$cache = new FilesystemAdapter();
/** @var User $user */
$user = $this->getUser();
if (!$user instanceof User) {
throw new UserNotFoundException('Utilisateur inconnu');
}
if (!count($user->getContexts())) {
return $this->redirectToRoute('CONTEXT');
}
if (!count($user->getAvailableCustomers())) {
throw new AccessDeniedException('Impossible d\'utiliser le portail sans clients, veuillez contacter votre responsable.');
}
// Récupération des tickets
$datasourceId = 'TICKETSV2';
$displayerName = 'display_homepage_' . $datasourceId;
$this->datasourceFactory->init($datasourceId, $displayerName, ApiUrlProvider::ENVIRONMENT_NVL, Datasource::TYPE_MASTER_VOLET);
$ticketDatasourceConfig = $this->datasourceFactory->getDataSourceConfig();
$ticketDatasourceConfig->setContexts($user->getAvailableContexts());
$requestFactory = (new RequestFactory($ticketDatasourceConfig))
->addFilter(new Filter('Etat', Filter::EQUALS, 'En cours'))
->setPager(new Pager(1, 4))
;
try {
$tickets = $this->datasourceFactory->getData($requestFactory);
} catch (Exception $e) {
$tickets = [
'pagination' => [
'totalRecords' => 0,
],
'data' => [],
];
}
// Récupération des commandes
$datasourceId = 'COMMANDES';
$displayerName = 'display_homepage_' . $datasourceId;
$this->datasourceFactory->init($datasourceId, $displayerName, ApiUrlProvider::ENVIRONMENT_NVL, Datasource::TYPE_MASTER_VOLET);
$commandesDatasourceConfig = $this->datasourceFactory->getDataSourceConfig();
$commandesDatasourceConfig->setContexts($user->getAvailableContexts());
$requestFactory = (new RequestFactory($commandesDatasourceConfig))
->addFilter(new Filter('Statut', Filter::EQUALS, 'En cours'))
->setPager(new Pager(1, 4));
try {
$commandes = $this->datasourceFactory->getData($requestFactory);
} catch (Exception $e) {
$commandes = [
'pagination' => [
'totalRecords' => 0,
],
'data' => [],
];
}
// Récupération des interventions
$datasourceId = 'INTERVENTIONS';
$displayerName = 'display_homepage_' . $datasourceId;
// Date supérieure
$key = md5($user->getEmail() . $displayerName) . 'nextDate';
$NextDate = $cache->get($key, function (ItemInterface $item) use ($datasourceId, $displayerName, $user) {
$item->expiresAfter(300);
$this->datasourceFactory->init($datasourceId, $displayerName, ApiUrlProvider::ENVIRONMENT_NVL, Datasource::TYPE_MASTER_VOLET);
$requestFactoryNextDate = (new RequestFactory($this->datasourceFactory->getDataSourceConfig()))
->setPager(new Pager(1, 1))
->addSelect(new Select('DLSRHDEB'))
->addFilter(new Filter('DLSRHDEB', Filter::GREATER_THAN, (new DateTime('NOW'))->format(DATE_ATOM)))
->addOrderBy(new OrderBy('DLSRHDEB', '0'))
->setForcedContexts($user->getAvailableContexts());
try {
$NextDate = $this->datasourceFactory->getData($requestFactoryNextDate)->getData();
$NextDateString = $NextDate[0]['DLSRHDEB'] ?? null;
$NextDateObject = $NextDateString ? new DateTime($NextDateString) : null;
} catch (Exception $e) {
$NextDateObject = null;
}
return $NextDateObject;
}, 1);
// Récupération des interventions
$displayerName = 'display_homepage_planifier_' . $datasourceId;
$this->datasourceFactory->init($datasourceId, $displayerName, ApiUrlProvider::ENVIRONMENT_NVL, Datasource::TYPE_MASTER_VOLET);
$interventionsDatasourceConfig = $this->datasourceFactory->getDataSourceConfig();
$interventionsDatasourceConfig->setContexts($user->getAvailableContexts());
$requestFactory = (new RequestFactory($interventionsDatasourceConfig))
->setPager(new Pager(1, 3))
->addFilter(new Filter('Statut', Filter::EQUALS, 'Planifiée'))
->addOrderBy(new OrderBy('DLSRHDEB', '0'));
try {
$interventionsPlanifiers = $this->datasourceFactory->getData($requestFactory);
} catch (Exception $e) {
$interventionsPlanifiers = [
'pagination' => [
'totalRecords' => 0,
],
'data' => [],
];
}
// Récupération des news
$myToken = $user->getToken()->getToken();
$key = md5($user->getEmail() . 'news_nvl');
try {
$newsList = $cache->get($key, function (ItemInterface $item) use ($myToken) {
$item->expiresAfter(30);
$newsListresponse = $this->newsProvider->getNewsList($myToken, [
'pagination' => [
'limit' => 4,
],
'public' => true,
]);
if (200 !== $newsListresponse->getStatusCode()) {
throw new Exception('Impossible de récupérer les news');
}
$newsData = $newsListresponse->toArray();
return $newsData['news'] ?? [];
}, 1);
} catch (Exception $e) {
$newsList = [];
}
$this->datasourceFactory->init(
'INTERVENTIONS',
'display_static_INTERVENTIONS_homepage',
ApiUrlProvider::ENVIRONMENT_NVL,
Datasource::TYPE_MASTER_VOLET,
true);
$osDatasourceConfig = $this->datasourceFactory->getDataSourceConfig();
$this->datasourceFactory->init(
'MARKETING',
'display_static_MARKETING_homepage',
ApiUrlProvider::ENVIRONMENT_NVL,
Datasource::TYPE_MASTER_VOLET,
true);
$marketingDatasourceConfig = $this->datasourceFactory->getDataSourceConfig();
$defaultContexts = ContextProvider::getContexts();
// if (ContextGedimat::isGedimatExist($user->getAvailableContexts())) {
// // prise en charge de expert com gédimat
// $defaultContexts[] = [
// ContextProvider::ID => 8,
// ContextProvider::CODE => ContextProvider::EXPERT_COM,
// ContextProvider::LABEL => 'Expert Com Gédimat',
// ContextProvider::URL => 'https://www.expert-com.com/',
// ContextProvider::DESCRIPTION => 'Spécialiste en Gestion Télécom',
// ];
// // on supprime le expert com normal si il y a expert com gedimat
// ContextGedimat::removeExpertComFromAppContextsIfGedimatIsHere($defaultContexts);
// }
return $this->render('default/index.html.twig', [
// TODO: À voir comment faire
// 'searchParams' => $requestFactory->getRequestParams(),
// 'searchParams' => $requestFactoryNextDate->getRequestParams(),
'newsList' => $newsList,
'ticketsDataFields' => $ticketDatasourceConfig->getFields()->toArray(),
'commandesDataFields' => $commandesDatasourceConfig->getFields()->toArray(),
'interventionsDataFields' => $interventionsDatasourceConfig->getFields()->toArray(),
'tickets' => $tickets,
'commandes' => $commandes,
'interventionsPlanifiers' => $interventionsPlanifiers,
'osDatasource' => $osDatasourceConfig,
'marketingDatasource' => $marketingDatasourceConfig,
'osCustom' => [
'volet-view' => 'datasource/os/_detail-volet-os.html.twig',
],
'marketingCustom' => [
'volet-view' => 'datasource/os/_detail-volet-marketing.html.twig',
],
'interventions_calendar' => [
'nextDate' => $NextDate,
],
'contexts' => $defaultContexts,
]);
}
/**
* @SecurityGranted("is_granted('IS_AUTHENTICATED_FULLY') and is_granted('ROLE_SERVICE_PORTAIL_NVL')")
* @Route("/choose-context/{contextId}", name="CHOOSE_CONTEXT", methods={"GET"})
* @param int $contextId
* @return Response
*/
public function chooseContext(int $contextId): Response
{
/** @var User $user */
$user = $this->getUser();
if (!$context = $user->getAvailableContextById($contextId)) {
return $this->redirectToRoute('HOMEPAGE');
}
$this->getUser()->clearContexts()
->setContexts([$context]);
return $this->redirectToRoute('DASHBOARD');
}
/**
* @SecurityGranted("is_granted('IS_AUTHENTICATED_FULLY') and is_granted('ROLE_SERVICE_PORTAIL_NVL')")
* @Route("/dashboard", name="DASHBOARD", methods={"GET"})
* @param ChartProvider $chartProvider
* @param InterlocutorProvider $interlocutorProvider
* @param NewsHelper $newsHelper
* @return Response
* @throws ClientExceptionInterface
* @throws DecodingExceptionInterface
* @throws InvalidArgumentException
* @throws NoResultException
* @throws NonUniqueResultException
* @throws RedirectionExceptionInterface
* @throws ServerExceptionInterface
* @throws TransportExceptionInterface
*/
public function dashboard(ChartProvider $chartProvider, InterlocutorProvider $interlocutorProvider, NewsHelper $newsHelper): Response
{
$breadcrumb = new Breadcrumb([
new BreadcrumbStep('Dashboard'),
]);
/** @var User $user */
$user = $this->getUser();
if (!$user->getContexts()) {
return $this->redirectToRoute('CONTEXT');
}
$chartProvider->init();
$this->datasourceFactory->init(
'IC_AFFECTES',
'display_dashboard_' . 'IC_AFFECTES',
ApiUrlProvider::ENVIRONMENT_NVL,
Datasource::TYPE_MASTER_COLLAPSE
);
$isAffectesDataToFiltered = $this->datasourceFactory->getData()->getData();
$isAffectesDataFiltered = [];
foreach ($isAffectesDataToFiltered as $item) {
$key = trim($item['REP_NOM']) . trim($item['REP_MAIL']);
if (!array_key_exists($key, $isAffectesDataFiltered)) {
$isAffectesDataFiltered[$key] = [
'item' => $item,
'contexts' => [$item['CLI_RAISOC']],
];
continue;
}
$isAffectesDataFiltered[$key]['contexts'][] = $item['CLI_RAISOC'];
}
$currentContext = array_values($user->getContexts())[0];
// $cache = new FilesystemAdapter();
// $categoryIds = NewsHelper::getNewsCategoryByContext($user->getFirstContext()->getId());
// $key = md5(implode('_', $categoryIds) . $user->getEmail() . 'important_news');
// $importantNews = $cache->get($key, function (ItemInterface $item) use ($user, $newsProvider, $categoryIds) {
// $item->expiresAfter(60 * 20);
// $responseImportantNews = $newsProvider->getPriorityNews($categoryIds, $this->getUser()->getToken()->getToken());
//
// if (200 === $responseImportantNews->getStatusCode()) {
// $news = $responseImportantNews->toArray()['news'];
// if (count($news)) {
// return $news[array_key_first($news)];
// }
// return null;
// }
// return null;
// }, 1);
return $this->render('default/dashboard.html.twig', [
'currentContext' => $currentContext,
'interlocutors' => $interlocutorProvider->getInterlocutorByContext($currentContext, $user),
'breadcrumb' => $breadcrumb,
'isAffectesData' => $this->datasourceFactory->getData(),
'isAffectesDataFiltered' => $isAffectesDataFiltered,
'charts' => [
'tickets' => [
'DeltaYear' => $chartProvider->makeChart('TICKETSV2', Deltayear::class),
'DeltaTrimester' => $chartProvider->makeChart('TICKETSV2', DeltaTrimester::class),
'DeltaMonth' => $chartProvider->makeChart('TICKETSV2', DeltaMonth::class),
'ByUrgence' => $chartProvider->makeChart('TICKETSV2', TicketsUrgence::class),
'ByNature' => $chartProvider->makeChart('TICKETSV2', TicketsNature::class),
'ByNote' => $chartProvider->makeChart('TICKETSV2', TicketsNote::class),
],
],
'importantNews' => $newsHelper->getImportantNews(true),
]);
}
/**
* TODO: Ancienne route, à supprimer ? La route active c'est /profil dans ProfileController
* @SecurityGranted("is_granted('IS_AUTHENTICATED_FULLY') and is_granted('ROLE_SERVICE_PORTAIL_NVL')")
* @Route("/mon-profil", name="PROFILE", methods={"GET","POST"}, options={"expose"=true})
* @param Request $request
* @param UserProvider $userProvider
* @param ContextProviderApiNvl $contextProvider
* @return Response
* @throws ClientExceptionInterface
* @throws DecodingExceptionInterface
* @throws RedirectionExceptionInterface
* @throws ServerExceptionInterface
* @throws TransportExceptionInterface
*/
public function profile(Request $request, UserProvider $userProvider, ContextProviderApiNvl $contextProvider): Response
{
/** @var User $user */
$user = $this->getUser();
$userEdit = (new UserEdit())
->setPhone($user->getInfo()->getPhone())
->setFonction($user->getInfo()->getFonction());
$userEditform = $this->createForm(UserEditType::class, $userEdit);
// Informations
$userEditform->handleRequest($request);
if ($userEditform->isSubmitted() && $userEditform->isValid()) {
$user->getInfo()
->setPhone($userEdit->getPhone())
->setFonction($userEdit->getFonction());
$userProvider->changeInfo($userEdit);
$this->addFlash('success', 'Vos information ont été modifiées avec succès.');
return $this->redirectToRoute('PROFILE');
}
// Mot de passe
$userPasswordChange = (new UserPasswordChange())->setEmail($this->getUser()->getEmail());
$userEditPasswordform = $this->createForm(UserPasswordChangeType::class, $userPasswordChange);
$userEditPasswordform->handleRequest($request);
if ($userEditPasswordform->isSubmitted() && $userEditPasswordform->isValid()) {
$userProvider->changePassword($userPasswordChange);
$this->addFlash('success', 'Mot de passe modifié avec succès.');
return $this->redirectToRoute('PROFILE');
}
// Notifications
$userTicketNotification = new UserTicketNotification();
$userTicketNotification->setTypeOfNotification($user->getInfo()->getTrackingTickets() ?? 1);
$userTicketNotificationForm = $this->createForm(UserTicketNotificationType::class, $userTicketNotification, []);
$userTicketNotificationForm->handleRequest($request);
if ($userTicketNotificationForm->isSubmitted() && $userTicketNotificationForm->isValid()) {
$user->getInfo()->setTrackingTickets($userTicketNotification->getTypeOfNotification());
$this->suiviTicketProvider->updateContextNotifications([], $userTicketNotification->getTypeOfNotification());
$this->addFlash('success', 'Vos préférences de notifications ont été modifiées avec succès.');
return $this->redirectToRoute('PROFILE');
}
// Notifications par contextes
$userInfos = $this->userProvider->getInfos()->toArray();
$contextNotification = new ContextNotification($user, $userInfos);
$formContextNotification = $this->createForm(ContextNotificationType::class, $contextNotification, [
'user' => $user,
]);
$formContextNotification->handleRequest($request);
if ($formContextNotification->isSubmitted() && $formContextNotification->isValid()) {
// Faire la difference de ces valeurs après submit , et envoi vers API pour MAJ
$emailingSubscriptions = NotificationsHelper::getResultToSend($contextNotification->getFormChoices(), $contextNotification->getFormAbonnements());
$this->suiviTicketProvider->updateContextNotifications($emailingSubscriptions, $user->getInfo()->getTrackingTickets());
$context = ContextHelper::getContextById($user, $contextNotification->getContext());
$this->addFlash('success', sprintf('Les notifications pour la marque <strong>%s</strong> ont bien été modifiées', $context->getLabel()));
return $this->redirectToRoute('PROFILE');
}
// Ask context
$askContext = new AskContext();
$formAskContext = $this->createForm(AskContextType::class, $askContext);
$formAskContext->handleRequest($request);
if ($formAskContext->isSubmitted() && $formAskContext->isValid()) {
if ($this->userProvider->askContext($askContext, $user->getFirstContext()->getId())) {
$this->addFlash('success', 'Demande de marques envoyées avec succès. Le traitement manuel sera fait dans les 3 jours.');
} else {
$this->addFlash('error', 'Une erreur est survenue');
}
return $this->redirectToRoute('PROFILE');
}
// Ask customer
$askCustomer = new AskCustomer();
$formAskCustomer = $this->createForm(AskCustomerType::class, $askCustomer);
$formAskCustomer->handleRequest($request);
if ($formAskCustomer->isSubmitted() && $formAskCustomer->isValid()) {
if ($this->userProvider->askCustomer($askCustomer, $user->getFirstContext()->getId())) {
$this->addFlash('success', 'Demande de client envoyée avec succès. Le traitement manuel sera fait dans les 3 jours.');
} else {
$this->addFlash('error', 'Une erreur est survenue');
}
return $this->redirectToRoute('PROFILE');
}
return $this->render('default/profile.html.twig', [
'context' => $user->getFirstContext(),
'allContexts' => $contextProvider->getContexts(false),
'forms' => [
'notifications' => $userTicketNotificationForm->createView(),
'user' => $userEditform->createView(),
'password' => $userEditPasswordform->createView(),
'context' => $formAskContext->createView(),
'customer' => $formAskCustomer->createView(),
'formContext' => $formContextNotification->createView(),
],
]);
}
/**
* @Route("/pdf", name="PDF", methods={"POST"})
* @param Request $request
* @param DatasourcetoPdf $datasourcetoPdf
* @return Response
* @throws LoaderError
* @throws RuntimeError
* @throws SyntaxError
*/
public function pdf(Request $request, DatasourcetoPdf $datasourcetoPdf): Response
{
$lineParam = json_decode($request->get('lineParam'), true);
$childrenParam = json_decode($request->get('childrenParam'), true);
$keyValues = json_decode($request->get('keyValues'), true);
$view = $request->get('view');
return $this->file($datasourcetoPdf->getPdf($view, $lineParam, $childrenParam, $keyValues), 'file.pdf');
}
/**
* @Route("/test", name="TEST", methods={"GET","POST"})
*/
public function test(HttpClientInterface $httpClient): Response
{
return $this->render('default/test.html.twig', []);
}
/**
* @Route("/test-form", name="TEST_FORM", methods={"GET","POST"}, options={"expose"=true})
* @param Request $request
* @param TicketProvider $ticketProvider
* @return Response
* @throws TransportExceptionInterface
*/
public function testForm(Request $request, TicketProvider $ticketProvider): Response
{
$fullSubmit = filter_var($request->request->get('fullSubmit'), FILTER_VALIDATE_BOOLEAN);
$ticketCreate = new TicketCreate();
$form = $this->createForm(TicketCreateType::class, $ticketCreate, []);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid() && $fullSubmit) {
$response = $ticketProvider->create($ticketCreate);
if (200 !== $response->getStatusCode()) {
return $this->json([
'status' => false,
'close' => false,
AjaxNotification::AJAX_INDEX => new AjaxNotification('error', 'Problème lors de la création du ticket.'),
]);
}
return $this->json([
'status' => true,
'close' => true,
AjaxNotification::AJAX_INDEX => new AjaxNotification('success', 'Le ticket a bien été créé.'),
]);
}
if (!$fullSubmit) {
$form->clearErrors(true);
}
return $this->json([
'status' => true,
'close' => false,
'html' => $this->renderView('default/create-ticket.html.twig', [
'form' => $form->createView(),
]),
]);
}
/**
* @Route("/register/{email}/{hash}", name="URL_REGISTER", methods={"GET","POST"})
* @param Request $request
* @param string $email
* @param string $hash
* 123456azertYUIO!*
* @return Response
* @throws ClientExceptionInterface
* @throws DecodingExceptionInterface
* @throws RedirectionExceptionInterface
* @throws ServerExceptionInterface
* @throws TransportExceptionInterface
*/
public function urlRegister(Request $request, string $email, string $hash): Response
{
$urlRegistration = new UrlRegistration();
$urlRegistration
->setEmail($email)
->setHash($hash);
$form = $this->createForm(UrlRegistrationType::class, $urlRegistration);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$response = $this->userProvider->newAccountpassword($urlRegistration);
if (200 === $response->getStatusCode()) {
$this->addFlash('success', 'La demande création du compte a bien été finalisée.');
return $this->redirectToRoute('APP_LOGIN');
}
switch ($response->toArray(false)['message'] ?? null) {
case'UserNotFound':
$errorText = 'L\'utilisateur demandé n\'est pas actif.';
break;
case'NoRequest':
$errorText = 'Il n\'y a pas de demande en cours pour cet utilisateur.';
break;
case'BadHash':
case'RequestExpired':
$errorText = 'Ce lien n\'est plus valide ou à expiré.';
break;
default:
$errorText = 'La demande de création du compte a rencontré un problème.';
}
$this->addFlash('danger', $errorText);
}
return $this->render('default/url-register.html.twig', [
'form' => $form->createView(),
]);
}
/**
* @Route("/support", name="SUPPORT", methods={"GET","POST"})
* @param Request $request
* @param Support $support
* @return Response
* @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
*/
public function support(Request $request, Support $support): Response
{
if ($this->isGranted('ROLE_SERVICE_DESK_NOVENCI') && !$this->isGranted('ROLE_SERVICE_PORTAIL_NVL')) {
return $this->redirectToRoute('APP_DESK_NOVENCI_SUPPORT');
}
/** @var User $user */
$user = $this->getUser();
$context = $user
? $user->getFirstContext() ? $user->getFirstContext()->getId() : null
: null;
$name = $user
? sprintf('%s %s', $user->getInfo()->getFirstname(), $user->getInfo()->getLastname())
: '';
$builder = $this->createFormBuilder(
[
'name' => $name,
'message' => '',
'context' => $context,
]
)
->add('name', TextType::class, [
'label' => 'Votre Nom',
'constraints' => [
new NotBlank(),
new Length(['min' => 5, 'max' => 80]),
],
])
->add('email', EmailType::class, [
'label' => 'Votre Email',
'constraints' => [
new Email(),
],
])
->add('objet', TextType::class, [
'label' => 'Objet',
'constraints' => [
new NotBlank(),
new Length(['min' => 10, 'max' => 240]),
],
])
->add('message', TextareaType::class, [
'label' => 'Votre message',
'constraints' => [
new NotBlank(),
new Length(['min' => 10, 'max' => 2500]),
],
])
->add('recatpchaValue', RecaptchaType::class);
if ($user) {
$contexts = [];
foreach ($user->getAvailableContexts() as $availableContext) {
$contexts[$availableContext->getLabel()] = $availableContext->getId();
}
$builder->add('context', ChoiceType::class, [
'choices' => $contexts,
'label' => 'Marque concernée',
]);
}
$form = $builder->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$support->sendmail($form->getData());
$this->addFlash('success', 'Votre demande a bien été envoyée au support.');
return $this->redirectToRoute('HOMEPAGE');
}
return $this->render('default/support.html.twig', [
'form' => $form->createView(),
]
);
}
/**
* @Route("/_maintenance", name="MAINTENANCE", methods={"GET"})
* @return Response
*/
public function maintenance(): Response
{
return $this->render('default/maintenance.html.twig', [
'ip' => $_SERVER['REMOTE_ADDR'],
]);
}
}