<?php
/**
* src/Controller/HomeController.php
* Gestion des pages d'accueil.
*
* @author Jean-François Brisse <jeff@bbv-software.fr>
* @version 1.0.0
*/
namespace App\Controller;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
// Repositories.
use App\Repository\Admin\CmsTextRepository;
use App\Repository\Admin\HomePartnerRepository;
use App\Repository\Admin\PromotionRepository;
use App\Repository\Admin\SettingRepository;
use App\Repository\Admin\UserRepository;
use App\Repository\Authorization\AssignmentRepository;
use App\Repository\Authorization\DefaultOptionsRepository;
use App\Repository\Contract\ContractRepository;
use App\Repository\Sinister\SinisterRepository;
use App\Repository\Pricing\SubscriptionRepository;
class HomeController extends AbstractController {
/**
* Accueil.
*
* @param AssignmentRepository $assignRepository Repository des associations Établissements / Utilisateurs.
* @param CmsTextRepository $textRepository Repository des textes à afficher.
* @param ContractRepository $contractRepository Repository des contrats.
* @param DefaultOptionsRepository $defaultRepository Repository des options par défaut.
* @param HomePartnerRepository $homePartnerRepository Repository des partenariats.
* @param PromotionRepository $promotionRepository Repository des promotions.
* @param SinisterRepository $sinisterRepository Repository des sinistres.
* @param SettingRepository $settingRepository Repository des paramètres.
* @param SubscriptionRepository $subscriptionRepository Repository de la souscription.
* @param EntityManagerInterface $entityManager Doctrine manager.
* @return Response Réponse HTTP.
*/
public function home(
AssignmentRepository $assignRepository,
CmsTextRepository $textRepository,
ContractRepository $contractRepository,
DefaultOptionsRepository $defaultRepository,
HomePartnerRepository $homePartnerRepository,
PromotionRepository $promotionRepository,
SinisterRepository $sinisterRepository,
SettingRepository $settingRepository,
SubscriptionRepository $subscriptionRepository,
EntityManagerInterface $entityManager
): Response
{
$adminUser = $this->container->get('security.authorization_checker')->isGranted('ROLE_GESTION');
$user = $this->getUser();
$hasInfoHome = (!$adminUser || ($user->getUsername() == "JPVAdminSEL"));
$codeSoc = $this->getParameter('code_soc');
$socName = $this->getParameter('soc_name');
$appServer = $this->getParameter('app_server');
$setting = $settingRepository->findOneBy(['codeSoc' => $codeSoc]);
$settingUpdateMsg = $setting->getUpdateMsg();
$settingUpdateDate = $setting->getUpdateDate();
$testArray = ['', ' ', null];
$infoHome = [];
$maintenance = $setting->getMaintenance();
// Redirection vers le message de maintenance.
if ($maintenance) {
$logo = "info";
$message = "Afin de mieux vous servir et pour vous apporter de nouvelles options.";
$message2 = "Votre Extranet est en maintenance pour quelques minutes !";
$message3 = "En cas d'extrême urgence, veuillez vous rapprocher de JPV Assurances.";
return $this->render('global/maintenance.html.twig', [
'logo' => $logo,
'message' => $message,
'message2' => $message2,
'message3' => $message3
]);
}
// Contrôle de l'affichage du message de mise à jour.
$updateDate = !is_null($settingUpdateDate) ? $settingUpdateDate->format('d/m/Y') : '';
$lastLogin = $user->getLastLogin();
$postLast = false;
if (!is_null($settingUpdateDate) && !is_null($lastLogin)) {
$postLast = $settingUpdateDate < $lastLogin;
}
$previousLogin = $user->getPreviousLogin();
$postPrevious = false;
if (!is_null($settingUpdateDate) && !is_null($previousLogin)) {
$postPrevious = $settingUpdateDate < $previousLogin;
}
$updateMsg = $settingUpdateMsg;
if ($settingUpdateMsg) {
$updateMsg = (!$postLast || !$postPrevious);
}
// Contrôle du dernier établissement utilisé.
$lastEstablishment = $user->getLastEstablishment();
$assignmentList = $assignRepository->findBy(['user' => $user]);
if (($lastEstablishment == 0) && (count($assignmentList) == 0)) {
$logo = "alert";
$message = "Vous n'êtes affilié à aucun établissement.";
$message2 = "Veuillez vous rapprocher de " . $socName . " !";
return $this->render('global/message.html.twig', [
'logo' => $logo,
'message' => $message,
'message2' => $message2
]);
}
// Gestion du thème par défaut.
if (count($assignmentList) > 0) {
$theme = $assignmentList[0]->getEstablishment()->getHomeTheme();
if ($lastEstablishment == 0) {
$lastEstablishment = $assignmentList[0]->getEstablishment()->getId();
$user->setLastEstablishment($lastEstablishment);
}
} else {
$theme = $this->getParameter('code_soc');
}
$user->setHomeTheme($theme);
$entityManager->flush();
// ******************************************************************
// Récupération des nombre d'élément pour les pastilles des boutons.
// ******************************************************************
$contractList = [];
$sinisterList = [];
$subscriptionObj = [];
if (!$adminUser) {
$assignementList = $assignRepository->findActiveEstablishment($user);
if (count($assignementList) > 0) {
$establishmentList = [];
foreach ($assignementList as $assignement) {
$establishmentList[] = $assignement->getEstablishment()->getId();
}
if ($hasInfoHome) {
$subscriptionObj = $subscriptionRepository->findSubscriptionForEstablishment($establishmentList);
$contractList = $contractRepository->findContractForEstablishment($establishmentList);
$sinisterList = $sinisterRepository->findSinisterForEstablishment($establishmentList);
}
}
} else {
if ($hasInfoHome) {
$subscriptionObj = $subscriptionRepository->findSubscriptionForAdmin();
$contractList = $contractRepository->findBy([], ['creationDate' => 'DESC']);
$sinisterList = $sinisterRepository->findSinisterForAdmin();
}
}
// ******************************************************************
// Récupération des infos des souscriptions / propositions.
// ******************************************************************
$nbPropoGreen = 0; // Propo signée.
$nbPropoYellow = 0; // Propo non signée.
$nbPropoOrange = 0; // Propo non finie.
$nbInstanceRed = 0; // Propo en instance.
$nbSubGreen = 0; // Tarification en cours.
$nbOccurrence = 0; // Nombre d'occurrence de date de naissance.
// $subscriptionList = $subscriptionObj['subscriptionList'];
$subscriptionList = $subscriptionObj;
if ((count($subscriptionList) > 0) && $hasInfoHome) {
foreach ($subscriptionList as $subscription) {
// $subscription = $subscription[0];
$validatedStep = $subscription->getValidatedStep();
// Traitement des souscriptions qui sont en propo émises.
if ($subscription->getStatus() === "SUB"){
if (($validatedStep < 100) || !$subscription->getInfoProtection() && !$subscription->getInstance()
) {
$nbPropoOrange++;
} else {
$subscription->getSigned() ? $nbPropoGreen++ : $nbPropoYellow++;
}
if (($subscription->getInstance()) && ($subscription->getStatus() === "SUB")) {
$nbInstanceRed++;
}
// Traitement des souscriptions qui sont en tarifications en cours.
} else if ($subscription->getStatus() === "RUN" || $subscription->getStatus() === "API") {
$nbSubGreen++;
}
}
}
$infoHome['sub'] = [
'green' => $nbSubGreen
];
$infoHome['warning'] = [
'red' => $nbOccurrence
];
$infoHome['propo'] = [
'green' => $nbPropoGreen,
'yellow' => $nbPropoYellow,
'orange' => $nbPropoOrange
];
$infoHome['instance'] = [
'red' => $nbInstanceRed
];
// ******************************************************************
// Récupération des infos des contrats.
// ******************************************************************
$nbCntGreen = 0;
$nbCntYellow = 0;
$nbCntOrange = 0;
$totalCapital = 0;
if ((count($contractList) > 0) && $hasInfoHome) {
foreach ($contractList as $contract) {
if (!$contract->getApiTransmittable() && !$contract->getDocSent()) {
$nbCntYellow++;
} else {
if (($contract->getTransmitted() && !$contract->getComplete() && !$contract->getDocSent())
|| ($contract->getApiTransmittable() && !$contract->getTransmitted())) {
$nbCntOrange++;
} else {
$nbCntGreen++;
}
}
// if (!$contract->getHasSinister()) {
$totalCapital += $contract->getCapital();
// }
}
}
$infoHome['cnt'] = [
'green' => $nbCntGreen,
'yellow' => $nbCntYellow,
'orange' => $nbCntOrange
];
// ******************************************************************
// Récupération des infos des sinistres.
// ******************************************************************
$infoHome['sin'] = [
'green' => count($sinisterList)
];
// ******************************************************************
// Récupération des SERVICES.
// ******************************************************************
$homePartnerList = $homePartnerRepository->findBy(['available' => true]);
$optionList = $defaultRepository->findOneBy(['establishment' => $lastEstablishment]);
$optionPartnerList = $optionList->getHomePartnerList();
$services = [];
$nbService = 0;
$nbPartner = 0;
if (count($homePartnerList) > 0) {
foreach ($homePartnerList as $homePartner) {
$display = $optionPartnerList->contains($homePartner);
if ($display) {
$podium = $homePartner->getPodium();
$type = ($homePartner->getServiceType() == "p")
? 'partners_assigned' : 'services_assigned';
$url = !in_array($homePartner->getAccessUrl(), $testArray)
? $homePartner->getAccessUrl() : "#";
$services[$type][] = [
'id' => $homePartner->getId(),
'title' => $homePartner->getTitle(),
'subTitle' => $homePartner->getSubTitle(),
'imgWhite' => $homePartner->getWhiteImgName(),
'imgColored' => $homePartner->getColorImgName(),
'imgModal' => $homePartner->getModalInfoImgName(),
'information' => $homePartner->getInformation(),
'available' => ($optionList->getPodium() >= $podium),
'url' => $url
];
($homePartner->getServiceType() == "p") ? $nbPartner++ : $nbService++;
}
}
}
$services['nb_services'] = $nbService;
$services['nb_partner'] = $nbPartner;
// ******************************************************************
// Récupération des textes d'information.
// ******************************************************************
$textList = $textRepository->findBy([
'category' => 1,
'active' => true
], ['position' => 'ASC']);
$alert = empty($textList) ? false : true;
// ******************************************************************
// Récupération des options des établissements.
// ******************************************************************
$accessControl = [
'icad' => $optionList->getIcadEnabled(),
'pricing' => $optionList->getPricingEnabled(),
'booking' => $optionList->getBookingEnabled()
];
$promotionList = $promotionRepository->findAll();
$optionPromotionList = $optionList->getPromotionList();
$promoList = [];
if (count($promotionList) > 0) {
foreach ($promotionList as $promotion) {
$allow = $optionPromotionList->contains($promotion) ? "Oui" : "Non";
$ciePromo = $promotion->getCompany()->getName();
$dates = "Permanent";
if (!$promotion->getPermanent()) {
$start = $promotion->getStartDate()->format('d/m/Y');
$end = $promotion->getEndDate()->format('d/m/Y');
$dates = "Du " . $start . " au " . $end;
}
$promoList[] = [
'id' => $promotion->getId(),
'code' => $promotion->getCodeLabel(),
'company' => $ciePromo,
'active' => $promotion->getActive(),
'dates' => $dates,
'message' => $promotion->getMessage(),
'allow' => $allow
];
}
}
// Affichage de l'évolution ou nom du podium de la PF.
$upPodium = $optionList->getUpPodium();
$downPodium = $optionList->getDownPodium();
$podium = $optionList->getPodium();
$prevLaurel = "";
$laurel = "";
$nextLaurel = "";
if ($podium === 1) {
$laurel = "bronze";
$nextLaurel = "silver";
} else if ($podium === 2) {
$prevLaurel = "bronze";
$laurel = "silver";
$nextLaurel = "gold";
} else if ($podium === 3) {
$prevLaurel = "silver";
$laurel = "gold";
}
return $this->render('global/home_'.$codeSoc.'.html.twig', [
'alert' => $alert,
'appServer' => $appServer,
'infoHome' => $infoHome,
'promoList' => $promoList,
'services' => $services,
'totalCapital' => $totalCapital,
'updateMsg' => $updateMsg,
'updateDate' => $updateDate,
'displayServices' => $optionList->getHomePartner(),
'textList' => $textList,
'accessControl' => $accessControl,
'upPodium' => $upPodium,
'downPodium' => $downPodium,
'prevLaurel' => $prevLaurel,
'laurel' => $laurel,
'nextLaurel' => $nextLaurel,
'establishmentId' => $lastEstablishment
]);
}
/**
* Fonction pour la navbar.
*
* @param RequestStack $requestStack Requête HTTP.
* @param AssignmentRepository $assignRepository Repository des associations Établissements / Utilisateurs.
* @param DefaultOptionsRepository $defaultRepository Repository des options par défaut.
* @param UserRepository $userRepository Repository des utilisateurs.
* @return Response Réponse HTTP.
*/
public function navbar(
RequestStack $requestStack,
AssignmentRepository $assignRepository,
DefaultOptionsRepository $defaultRepository,
UserRepository $userRepository
): Response
{
$user = $userRepository->find($this->getUser()->getId());
// Récupération des établisements liés à l'utilisateur.
$assignementList = $assignRepository->findActiveEstablishment($user);
$bestPodium = 0;
if (count($assignementList) > 0) {
foreach ($assignementList as $assignement) {
$optionList = $defaultRepository->findOneBy(['establishment' => $assignement->getEstablishment()]);
if ($optionList) {
$podium = $optionList->getPodium();
$bestPodium = ($bestPodium < $podium) ? $podium : $bestPodium;
}
}
}
$laurel = "";
if ($bestPodium === 1) {
$laurel = "bronze";
} else if ($bestPodium === 2) {
$laurel = "silver";
} else if ($bestPodium === 3) {
$laurel = "gold";
}
// Récupérez la route courante et ses paramètres afin de remplacer le currentPath de la navbar qui sert de condition,
// Pour afficher ou non le bouton de défilement haut/bas.
$request = $requestStack->getMainRequest();
$currentRoute = $request->attributes->get('_route');
$routeParams = $request->attributes->get('_route_params');
return $this->render('global/_navbar.html.twig', [
'laurel' => $laurel,
'currentRoute' => $currentRoute,
'routeParams' => $routeParams
]);
}
}