src/Controller/HomeController.php line 47

Open in your IDE?
  1. <?php
  2. /**
  3.  * src/Controller/HomeController.php
  4.  * Gestion des pages d'accueil.
  5.  * 
  6.  * @author Jean-François Brisse <jeff@bbv-software.fr>
  7.  * @version 1.0.0
  8.  */
  9. namespace App\Controller;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\JsonResponse;
  13. use Symfony\Component\HttpFoundation\RequestStack;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. // Repositories.
  17. use App\Repository\Admin\CmsTextRepository;
  18. use App\Repository\Admin\HomePartnerRepository;
  19. use App\Repository\Admin\PromotionRepository;
  20. use App\Repository\Admin\SettingRepository;
  21. use App\Repository\Admin\UserRepository;
  22. use App\Repository\Authorization\AssignmentRepository;
  23. use App\Repository\Authorization\DefaultOptionsRepository;
  24. use App\Repository\Contract\ContractRepository;
  25. use App\Repository\Sinister\SinisterRepository;
  26. use App\Repository\Pricing\SubscriptionRepository;
  27. class HomeController extends AbstractController {
  28.     /**
  29.      * Accueil.
  30.      * 
  31.      * @param AssignmentRepository $assignRepository Repository des associations Établissements / Utilisateurs.
  32.      * @param CmsTextRepository $textRepository Repository des textes à afficher.
  33.      * @param ContractRepository $contractRepository Repository des contrats.
  34.      * @param DefaultOptionsRepository $defaultRepository Repository des options par défaut.
  35.      * @param HomePartnerRepository $homePartnerRepository Repository des partenariats.
  36.      * @param PromotionRepository $promotionRepository Repository des promotions.
  37.      * @param SinisterRepository $sinisterRepository Repository des sinistres.
  38.      * @param SettingRepository $settingRepository Repository des paramètres.
  39.      * @param SubscriptionRepository $subscriptionRepository Repository de la souscription.
  40.      * @param EntityManagerInterface $entityManager Doctrine manager.
  41.      * @return Response Réponse HTTP.
  42.      */
  43.     public function home(
  44.         AssignmentRepository $assignRepository,
  45.         CmsTextRepository $textRepository,
  46.         ContractRepository $contractRepository,
  47.         DefaultOptionsRepository $defaultRepository,
  48.         HomePartnerRepository $homePartnerRepository,
  49.         PromotionRepository $promotionRepository,
  50.         SinisterRepository $sinisterRepository,
  51.         SettingRepository $settingRepository,
  52.         SubscriptionRepository $subscriptionRepository,
  53.         EntityManagerInterface $entityManager
  54.     ): Response
  55.     {
  56.         $adminUser = $this->container->get('security.authorization_checker')->isGranted('ROLE_GESTION');
  57.         $user = $this->getUser();
  58.         $hasInfoHome = (!$adminUser || ($user->getUsername() == "JPVAdminSEL"));
  59.         $codeSoc = $this->getParameter('code_soc');
  60.         $socName = $this->getParameter('soc_name');
  61.         $appServer = $this->getParameter('app_server');
  62.         $setting = $settingRepository->findOneBy(['codeSoc' => $codeSoc]);
  63.         $settingUpdateMsg = $setting->getUpdateMsg();
  64.         $settingUpdateDate = $setting->getUpdateDate();
  65.         $testArray = ['', ' ', null];
  66.         $infoHome = [];
  67.         $maintenance = $setting->getMaintenance();
  68.         // Redirection vers le message de maintenance.
  69.         if ($maintenance) {
  70.             $logo = "info";
  71.             $message = "Afin de mieux vous servir et pour vous apporter de nouvelles options.";
  72.             $message2 = "Votre Extranet est en maintenance pour quelques minutes !";
  73.             $message3 = "En cas d'extrême urgence, veuillez vous rapprocher de JPV Assurances.";
  74.             
  75.             return $this->render('global/maintenance.html.twig', [
  76.                 'logo' => $logo,
  77.                 'message' => $message,
  78.                 'message2' => $message2,
  79.                 'message3' => $message3
  80.             ]);
  81.         }
  82.         
  83.         // Contrôle de l'affichage du message de mise à jour.
  84.         $updateDate = !is_null($settingUpdateDate) ? $settingUpdateDate->format('d/m/Y') : '';
  85.         $lastLogin = $user->getLastLogin();
  86.         $postLast = false;
  87.         if (!is_null($settingUpdateDate) && !is_null($lastLogin)) {
  88.             $postLast = $settingUpdateDate < $lastLogin;
  89.         }
  90.         $previousLogin = $user->getPreviousLogin();
  91.         $postPrevious = false;
  92.         if (!is_null($settingUpdateDate) && !is_null($previousLogin)) {
  93.             $postPrevious = $settingUpdateDate < $previousLogin;
  94.         }
  95.         $updateMsg = $settingUpdateMsg;
  96.         if ($settingUpdateMsg) {
  97.             $updateMsg = (!$postLast || !$postPrevious);
  98.         }
  99.         // Contrôle du dernier établissement utilisé.
  100.         $lastEstablishment = $user->getLastEstablishment();
  101.         $assignmentList = $assignRepository->findBy(['user' => $user]);
  102.         if (($lastEstablishment == 0) && (count($assignmentList) == 0)) {
  103.             $logo = "alert";
  104.             $message = "Vous n'êtes affilié à aucun établissement.";
  105.             $message2 = "Veuillez vous rapprocher de " . $socName . " !";
  106.             
  107.             return $this->render('global/message.html.twig', [
  108.                 'logo' => $logo,
  109.                 'message' => $message,
  110.                 'message2' => $message2
  111.             ]);
  112.         }
  113.         
  114.         // Gestion du thème par défaut.
  115.         if (count($assignmentList) > 0) {
  116.             $theme = $assignmentList[0]->getEstablishment()->getHomeTheme();
  117.             if ($lastEstablishment == 0) {
  118.                 $lastEstablishment = $assignmentList[0]->getEstablishment()->getId();
  119.                 $user->setLastEstablishment($lastEstablishment);
  120.             }
  121.         } else {
  122.             $theme = $this->getParameter('code_soc');
  123.         }
  124.         $user->setHomeTheme($theme);
  125.         $entityManager->flush();
  126.         
  127.         
  128.         // ******************************************************************
  129.         // Récupération des nombre d'élément pour les pastilles des boutons.
  130.         // ******************************************************************
  131.         $contractList = [];
  132.         $sinisterList = [];
  133.         $subscriptionObj = [];
  134.         
  135.         if (!$adminUser) {
  136.             $assignementList = $assignRepository->findActiveEstablishment($user);
  137.             if (count($assignementList) > 0) {
  138.                 $establishmentList = [];
  139.                 foreach ($assignementList as $assignement) {
  140.                     $establishmentList[] = $assignement->getEstablishment()->getId();
  141.                 }
  142.                 if ($hasInfoHome) {
  143.                     $subscriptionObj = $subscriptionRepository->findSubscriptionForEstablishment($establishmentList);
  144.                     $contractList = $contractRepository->findContractForEstablishment($establishmentList);
  145.                     $sinisterList = $sinisterRepository->findSinisterForEstablishment($establishmentList);
  146.                 }
  147.             }
  148.         } else {
  149.             if ($hasInfoHome) {
  150.                 $subscriptionObj = $subscriptionRepository->findSubscriptionForAdmin();
  151.                 $contractList = $contractRepository->findBy([], ['creationDate' => 'DESC']);
  152.                 $sinisterList = $sinisterRepository->findSinisterForAdmin();
  153.             }
  154.         }
  155.         
  156.         // ******************************************************************
  157.         // Récupération des infos des souscriptions / propositions.
  158.         // ******************************************************************
  159.         $nbPropoGreen  = 0; // Propo signée.
  160.         $nbPropoYellow = 0; // Propo non signée.
  161.         $nbPropoOrange = 0; // Propo non finie.
  162.         $nbInstanceRed = 0; // Propo en instance.
  163.         $nbSubGreen = 0;    // Tarification en cours.
  164.         $nbOccurrence = 0;  // Nombre d'occurrence de date de naissance.
  165.         // $subscriptionList = $subscriptionObj['subscriptionList'];
  166.         $subscriptionList = $subscriptionObj;
  167.         
  168.         if ((count($subscriptionList) > 0) && $hasInfoHome) {
  169.             foreach ($subscriptionList as $subscription) {
  170.                 
  171.                 // $subscription = $subscription[0];
  172.                 $validatedStep = $subscription->getValidatedStep();
  173.                 
  174.                 // Traitement des souscriptions qui sont en propo émises.
  175.                 if ($subscription->getStatus() === "SUB"){
  176.                     if (($validatedStep < 100) || !$subscription->getInfoProtection() && !$subscription->getInstance()
  177.                     ) {
  178.                         $nbPropoOrange++;
  179.                     } else {
  180.                         $subscription->getSigned() ? $nbPropoGreen++ : $nbPropoYellow++;
  181.                     }
  182.                     if (($subscription->getInstance()) && ($subscription->getStatus() === "SUB")) {
  183.                         $nbInstanceRed++;
  184.                     }
  185.                 // Traitement des souscriptions qui sont en tarifications en cours.
  186.                 } else if ($subscription->getStatus() === "RUN"  || $subscription->getStatus() === "API") {
  187.                     $nbSubGreen++;
  188.                 }
  189.             }
  190.         }
  191.         $infoHome['sub'] = [
  192.             'green' => $nbSubGreen
  193.         ];
  194.         $infoHome['warning'] = [
  195.             'red' => $nbOccurrence
  196.         ];
  197.         $infoHome['propo'] = [
  198.             'green' => $nbPropoGreen,
  199.             'yellow' => $nbPropoYellow,
  200.             'orange' => $nbPropoOrange
  201.         ];
  202.         $infoHome['instance'] = [
  203.             'red' => $nbInstanceRed
  204.         ];
  205.         
  206.         
  207.         // ******************************************************************
  208.         // Récupération des infos des contrats.
  209.         // ******************************************************************
  210.         $nbCntGreen = 0;
  211.         $nbCntYellow = 0;
  212.         $nbCntOrange = 0;
  213.         $totalCapital = 0;
  214.         if ((count($contractList) > 0) && $hasInfoHome) {
  215.             foreach ($contractList as $contract) {
  216.                 if (!$contract->getApiTransmittable() && !$contract->getDocSent()) {
  217.                     $nbCntYellow++;
  218.                 } else {
  219.                     if (($contract->getTransmitted() && !$contract->getComplete() && !$contract->getDocSent())
  220.                         || ($contract->getApiTransmittable() && !$contract->getTransmitted())) {
  221.                         $nbCntOrange++;
  222.                     } else {
  223.                         $nbCntGreen++;
  224.                     }
  225.                 }
  226. //                if (!$contract->getHasSinister()) {
  227.                     $totalCapital += $contract->getCapital();
  228. //                }
  229.             }
  230.         }
  231.         
  232.         $infoHome['cnt'] = [
  233.             'green' => $nbCntGreen,
  234.             'yellow' => $nbCntYellow,
  235.             'orange' => $nbCntOrange
  236.         ];
  237.         // ******************************************************************
  238.         // Récupération des infos des sinistres.
  239.         // ******************************************************************
  240.         $infoHome['sin'] = [
  241.             'green' => count($sinisterList)
  242.         ];
  243.         // ******************************************************************
  244.         // Récupération des SERVICES.
  245.         // ******************************************************************
  246.         $homePartnerList = $homePartnerRepository->findBy(['available' => true]);
  247.         $optionList = $defaultRepository->findOneBy(['establishment' => $lastEstablishment]);
  248.         $optionPartnerList = $optionList->getHomePartnerList();
  249.         $services = [];
  250.         $nbService = 0;
  251.         $nbPartner = 0;
  252.         if (count($homePartnerList) > 0) {
  253.             foreach ($homePartnerList as $homePartner) {
  254.                 $display = $optionPartnerList->contains($homePartner);
  255.                 if ($display) {
  256.                     $podium = $homePartner->getPodium();
  257.                     $type = ($homePartner->getServiceType() == "p")
  258.                         ? 'partners_assigned' : 'services_assigned';
  259.                     $url = !in_array($homePartner->getAccessUrl(), $testArray)
  260.                         ? $homePartner->getAccessUrl() : "#";
  261.                     $services[$type][] = [
  262.                         'id' => $homePartner->getId(),
  263.                         'title' => $homePartner->getTitle(),
  264.                         'subTitle' => $homePartner->getSubTitle(),
  265.                         'imgWhite' => $homePartner->getWhiteImgName(),
  266.                         'imgColored' => $homePartner->getColorImgName(),
  267.                         'imgModal' => $homePartner->getModalInfoImgName(),
  268.                         'information' => $homePartner->getInformation(),
  269.                         'available' => ($optionList->getPodium() >= $podium),
  270.                         'url' => $url
  271.                     ];
  272.                     ($homePartner->getServiceType() == "p") ? $nbPartner++ : $nbService++;
  273.                 }
  274.             }
  275.         }
  276.         $services['nb_services'] = $nbService;
  277.         $services['nb_partner'] = $nbPartner;
  278.         // ******************************************************************
  279.         // Récupération des textes d'information.
  280.         // ******************************************************************
  281.         $textList = $textRepository->findBy([
  282.             'category' => 1,
  283.             'active' => true
  284.         ], ['position' => 'ASC']);
  285.         $alert = empty($textList) ? false : true;
  286.         
  287.         // ******************************************************************
  288.         // Récupération des options des établissements.
  289.         // ******************************************************************
  290.         $accessControl = [
  291.             'icad' => $optionList->getIcadEnabled(),
  292.             'pricing' => $optionList->getPricingEnabled(),
  293.             'booking' => $optionList->getBookingEnabled()
  294.         ];
  295.         $promotionList = $promotionRepository->findAll();
  296.         $optionPromotionList = $optionList->getPromotionList();
  297.         $promoList = [];
  298.         if (count($promotionList) > 0) {
  299.             foreach ($promotionList as $promotion) {
  300.                 $allow = $optionPromotionList->contains($promotion) ? "Oui" : "Non";
  301.                 $ciePromo = $promotion->getCompany()->getName();
  302.                 $dates = "Permanent";
  303.                 if (!$promotion->getPermanent()) {
  304.                     $start = $promotion->getStartDate()->format('d/m/Y');
  305.                     $end = $promotion->getEndDate()->format('d/m/Y');
  306.                     $dates = "Du " . $start . " au " . $end;
  307.                 }
  308.                 $promoList[] = [
  309.                     'id' => $promotion->getId(),
  310.                     'code' => $promotion->getCodeLabel(),
  311.                     'company' => $ciePromo,
  312.                     'active' => $promotion->getActive(),
  313.                     'dates' => $dates,
  314.                     'message' => $promotion->getMessage(),
  315.                     'allow' => $allow
  316.                 ];
  317.             }
  318.         }
  319.         // Affichage de l'évolution ou nom du podium de la PF.
  320.         $upPodium = $optionList->getUpPodium();
  321.         $downPodium = $optionList->getDownPodium();
  322.         $podium = $optionList->getPodium();
  323.         $prevLaurel = "";
  324.         $laurel = "";
  325.         $nextLaurel = "";
  326.         if ($podium === 1) {
  327.             $laurel = "bronze";
  328.             $nextLaurel = "silver";
  329.         } else  if ($podium === 2) {
  330.             $prevLaurel = "bronze";
  331.             $laurel = "silver";
  332.             $nextLaurel = "gold";
  333.         } else  if ($podium === 3) {
  334.             $prevLaurel = "silver";
  335.             $laurel = "gold";
  336.         }
  337.         
  338.         return $this->render('global/home_'.$codeSoc.'.html.twig', [
  339.             'alert' => $alert,
  340.             'appServer' => $appServer,
  341.             'infoHome' => $infoHome,
  342.             'promoList' => $promoList,
  343.             'services' => $services,
  344.             'totalCapital' => $totalCapital,
  345.             'updateMsg' => $updateMsg,
  346.             'updateDate' => $updateDate,
  347.             'displayServices' => $optionList->getHomePartner(),
  348.             'textList' => $textList,
  349.             'accessControl' => $accessControl,
  350.             'upPodium' => $upPodium,
  351.             'downPodium' => $downPodium,
  352.             'prevLaurel' => $prevLaurel,
  353.             'laurel' => $laurel,
  354.             'nextLaurel' => $nextLaurel,
  355.             'establishmentId' => $lastEstablishment
  356.         ]);
  357.     }
  358.     /**
  359.      * Fonction pour la navbar.
  360.      * 
  361.      * @param RequestStack $requestStack Requête HTTP.
  362.      * @param AssignmentRepository $assignRepository Repository des associations Établissements / Utilisateurs.
  363.      * @param DefaultOptionsRepository $defaultRepository Repository des options par défaut.
  364.      * @param UserRepository $userRepository Repository des utilisateurs.
  365.      * @return Response Réponse HTTP.
  366.      */
  367.     public function navbar(
  368.         RequestStack $requestStack,
  369.         AssignmentRepository $assignRepository,
  370.         DefaultOptionsRepository $defaultRepository,
  371.         UserRepository $userRepository
  372.     ): Response
  373.     {
  374.         $user = $userRepository->find($this->getUser()->getId());
  375.         // Récupération des établisements liés à l'utilisateur.
  376.         $assignementList = $assignRepository->findActiveEstablishment($user);
  377.         $bestPodium = 0;
  378.         if (count($assignementList) > 0) {
  379.             foreach ($assignementList as $assignement) {
  380.                 $optionList = $defaultRepository->findOneBy(['establishment' => $assignement->getEstablishment()]);
  381.                 if ($optionList) {
  382.                     $podium = $optionList->getPodium();
  383.                     $bestPodium = ($bestPodium < $podium) ? $podium : $bestPodium;
  384.                 }
  385.             }
  386.         }
  387.         $laurel = "";
  388.         if ($bestPodium === 1) {
  389.             $laurel = "bronze";
  390.         } else  if ($bestPodium === 2) {
  391.             $laurel = "silver";
  392.         } else  if ($bestPodium === 3) {
  393.             $laurel = "gold";
  394.         }
  395.         // Récupérez la route courante et ses paramètres afin de remplacer le currentPath de la navbar qui sert de condition,
  396.         // Pour afficher ou non le bouton de défilement haut/bas.
  397.         $request = $requestStack->getMainRequest();
  398.         $currentRoute = $request->attributes->get('_route');
  399.         $routeParams = $request->attributes->get('_route_params');
  400.         return $this->render('global/_navbar.html.twig', [
  401.             'laurel' => $laurel,
  402.             'currentRoute' => $currentRoute,
  403.             'routeParams' => $routeParams
  404.         ]);
  405.     }
  406. }