src\Controller\API\ApiController.php line 138

Open in your IDE?
  1. <?php
  2. namespace App\Controller\API;
  3. use App\Entity\Admin\Branch;
  4. use App\Entity\Admin\BranchAdresse;
  5. use App\Entity\Admin\BranchProduit;
  6. use App\Entity\Admin\BranchProprietaire;
  7. use App\Entity\Admin\Department;
  8. use App\Entity\Admin\DepartmentProduit;
  9. use App\Entity\Admin\Perimetre;
  10. use App\Entity\Admin\Produit;
  11. use App\Entity\Admin\ProfilDroit;
  12. use App\Entity\Admin\Proprietaire;
  13. use App\Entity\Admin\User;
  14. use App\Entity\Admin\UserProduit;
  15. use App\Manager\Admin\PerimetreManager;
  16. use App\Manager\Admin\UserManager;
  17. use App\Manager\Admin\DashboardManager;
  18. use App\Manager\Admin\BranchAdresseManager;
  19. use App\Manager\Admin\UserProduitManager;
  20. use App\Manager\Admin\BranchManager;
  21. use App\Repository\Admin\PerimetreSystemRepository;
  22. use App\Repository\Admin\ProduitRepository;
  23. use App\Service\PasswordManager;
  24. use App\Service\ProduitApiConnector;
  25. use DateTime;
  26. use Doctrine\ORM\EntityManagerInterface;
  27. use Symfony\Component\HttpFoundation\JsonResponse;
  28. use Symfony\Component\HttpFoundation\Request;
  29. use Symfony\Component\HttpFoundation\Response;
  30. use Symfony\Component\Routing\Annotation\Route;
  31. use Symfony\Component\Security\Core\Security;
  32. use Symfony\Component\Yaml\Yaml;
  33. /**
  34.  * @Route ("/api", name="api_")
  35.  */
  36. class ApiController
  37. {
  38.     public function __construct(
  39.         private readonly EntityManagerInterface $em,
  40.         private readonly UserManager $userManager,
  41.         private readonly PerimetreManager $perimetreManager,
  42.         private readonly PerimetreSystemRepository $perimetreSystemRepository
  43.     ) {}
  44.     private function checkProduit(string $produit, ?User $user, ?Department $userDepartment, ?Branch $userBranch): string|UserProduit
  45.     {
  46.         $produitRequest = $this->em->getRepository(Produit::class)->findOneBy(["name" => $produit]);
  47.         if (empty($produitRequest)) {
  48.             return 'Produit inexistant';
  49.         }
  50.         $userProduit = $this->em->getRepository(UserProduit::class)->findOneBy(['user' => $user, 'produit' => $produitRequest, 'isActive' => true]);
  51.         if (empty($userProduit)) {
  52.             return 'Utilisateur non activé sur le produit';
  53.         }
  54.         $departmentProduit = $this->em->getRepository(DepartmentProduit::class)->findOneBy(['department' => $userDepartment, 'produit' => $produitRequest, 'isActive' => true]);
  55.         if (empty($departmentProduit)) {
  56.             return 'Service non activé sur le produit';
  57.         }
  58.         $branchProduit = $this->em->getRepository(BranchProduit::class)->findOneBy(['branch' => $userBranch, 'produit' => $produitRequest, 'isActive' => true]);
  59.         if (empty($branchProduit)) {
  60.             return 'Organisation non activée sur le produit';
  61.         }
  62.         return $userProduit;
  63.     }
  64.     private function getRequestArray(Request $request): ?array
  65.     {
  66.         return json_decode(str_replace("'", '"', $request->getContent()), true);
  67.     }
  68.     /**
  69.      * @Route ("/branch", name="branch")
  70.      */
  71.     public function getBranch(Request $request, BranchManager $branchManager, BranchAdresseManager $branchAdresseManager): ?JsonResponse
  72.     {
  73.         $requestContent = $this->getRequestArray($request);
  74.         if (!is_array($requestContent) || empty($requestContent['branch'])) return $this->returnBadAuthentication();
  75.         $branch = $branchManager->getRepository()->find($requestContent['branch']);
  76.         $proprietaires = [];
  77.         if ($branch->getBranchProprietaires()) {
  78.             foreach ($branch->getBranchProprietaires() as $bp) {
  79.                 if (empty($bp->getDeletedAt())) {
  80.                     $proprietaires[$bp->getProprietaire()->getCode()]['mnemonique'] = $bp->getMnemonique();
  81.                 }
  82.             }
  83.         }
  84.         $content = [
  85.             "branch_id" => $branch->getId(),
  86.             "branch_name" => $branch->getMnemonique(),
  87.             'branch_raison_sociale' => $branch->getRaisonSociale(),
  88.             'branch_siret' => $branch->getSiret(),
  89.             'branch_telephone' => $branch->getTelephone(),
  90.             'branch_adresses' => $branchAdresseManager->formatAll($branch->getAdresses('postal'), true) + $branchAdresseManager->formatAll($branch->getAdresses(), true),
  91.             'proprietaires' => $proprietaires
  92.         ];
  93.         return new JsonResponse(['message' => 'ok', 'branch' => $content]);
  94.     }
  95.     /**
  96.      * @Route ("/user/accept", name="user_accept_cg")
  97.      */
  98.     public function acceptedCG(Request $request, UserProduitManager $userProduitManager): ?JsonResponse
  99.     {
  100.         $requestContent = $this->getRequestArray($request);
  101.         if (!is_array($requestContent)) return $this->returnBadAuthentication();
  102.         if (array_key_exists('token', $requestContent)) {
  103.             $user = $this->userManager->getRepository()->findOneBy(["token" => $requestContent['token'], "deletedAt" => null]);
  104.             if (empty($user)) {
  105.                 return $this->returnBadAuthentication();
  106.             }
  107.             if (array_key_exists('produit', $requestContent)) {
  108.                 $userProduit = $userProduitManager->getRepository()->getUserProduitByUserAndProduit($user, $requestContent['produit']);
  109.                 if ($userProduit) {
  110.                     switch ($requestContent['type']) {
  111.                         case 'cgu':
  112.                             $userProduit->setCguAcceptedAt(new DateTime());
  113.                             break;
  114.                         case 'cgv':
  115.                             $userProduit->setCgvAcceptedAt(new DateTime());
  116.                             break;
  117.                     }
  118.                     $userProduitManager->update($userProduit);
  119.                     return new JsonResponse(['success' => 'ok']);
  120.                 }
  121.             }
  122.         }
  123.         return $this->returnBadAuthentication();
  124.     }
  125.     /**
  126.      * @Route ("/user", name="user")
  127.      */
  128.     public function getUser(Request $request, DashboardManager $dashboardManager, BranchAdresseManager $branchAdresseManager, PasswordManager $passwordManager, UserProduitManager $userProduitManager): ?JsonResponse
  129.     {
  130.         $requestContent = $this->getRequestArray($request);
  131.         if (!is_array($requestContent)) return $this->returnBadAuthentication();
  132.         $badAuth = false;
  133.         if (array_key_exists('username', $requestContent) and array_key_exists('password', $requestContent)) {
  134.             $user = $this->userManager->getRepository()->findOneBy(["username" => $requestContent['username'], "deletedAt" => null]);
  135.             if (empty($user)) {
  136.                 $badAuth = true;
  137.                 $this->userManager->addWrongUsername($requestContent['username'], $requestContent['ip'] ?? null);
  138.             } else {
  139.                 if (!$this->userManager->getEncoder()->isPasswordValid($user, $requestContent['password'])) {
  140.                     $this->userManager->addEchec($user, $requestContent['ip'] ?? null);
  141.                     $badAuth = true;
  142.                 } elseif (!$passwordManager->checkExpiration($user, $requestContent['produit'] ?? null)) {
  143.                     return $this->returnExpiredPassword($user, $requestContent['produit'] ?? null);
  144.                 }
  145.             }
  146.         } elseif (array_key_exists('token', $requestContent)) {
  147.             $user = $this->userManager->getRepository()->findOneBy(["token" => $requestContent['token'], "deletedAt" => null]);
  148.             if (empty($user)) {
  149.                 return $this->returnBadAuthentication();
  150.             }
  151.         } else {
  152.             return $this->returnBadAuthentication();
  153.         }
  154.         $userDepartment = $user ? $user->getDepartment() : null;
  155.         $userBranch = $user ? $userDepartment->getBranch() : null;
  156.         if (array_key_exists('produit', $requestContent)) {
  157.             $produitRequest = $this->checkProduit($requestContent['produit'], $user, $userDepartment, $userBranch);
  158.             if (is_string($produitRequest)) {
  159.                 $produitRequest = false;
  160.                 //$this->returnBadAuthentication($produitRequest);
  161.             }
  162.         } else $produitRequest = false;
  163.         if ($user && $this->userManager->checkIfEchec($user, $requestContent['produit'] ?? null)) {
  164.             return $this->returnEchecPassword($user, $requestContent['produit'] ?? null);
  165.         }
  166.         if ($badAuth) {
  167.             return $this->returnBadAuthentication();
  168.         }
  169.         $this->userManager->resetEchec($user);
  170.         $proprietaires = [];
  171.         $mnemoniques = [];
  172.         if ($user->getDepartment()->getBranch()->getBranchProprietaires()) {
  173.             foreach ($user->getDepartment()->getBranch()->getBranchProprietaires() as $bp) {
  174.                 if (empty($bp->getDeletedAt())) {
  175.                     $mnemoniques[$bp->getProprietaire()->getCode()] = $bp->getMnemonique();
  176.                 }
  177.             }
  178.         }
  179.         if ($user->getUserProprietaires()) {
  180.             foreach ($user->getUserProprietaires() as $proprietaire) {
  181.                 if ($proprietaire->getIsActive() && empty($proprietaire->getDeletedAt())) {
  182.                     if (!$produitRequest || !$produitRequest->getDefaultProprietaire() || $proprietaire == $produitRequest->getDefaultProprietaire()) {
  183.                         $proprietaires[$proprietaire->getProprietaire()->getCode()] = [
  184.                             'codeInterlocuteur' => $proprietaire->getCodeInterlocuteur(),
  185.                             'mnemonique' => $mnemoniques[$proprietaire->getProprietaire()->getCode()] ?? null
  186.                         ];
  187.                     }
  188.                 }
  189.             }
  190.         }
  191.         $content = [
  192.             'infos' => [
  193.                 'id' => $user->getId(),
  194.                 'token' => $user->getToken(),
  195.                 'username' => $user->getUsername(),
  196.                 'civility' => $user->getCivility(),
  197.                 'lastname' => $user->getLastname(),
  198.                 'firstname' => $user->getFirstname(),
  199.                 'email' => $user->getEmail(),
  200.                 'email2' => $user->getEmail2() && strpos($user->getEmail2(), ',') !== false
  201.                     ? explode(',', $user->getEmail2())[0]
  202.                     : $user->getEmail2(),
  203.                 'telephone' => $user->getTelephone(),
  204.                 'fonction' => $user->getFonction(),
  205.                 'code_interlocuteur' => $user->getCodeInterlocuteur(),
  206.                 "department_id" => $userDepartment->getId(),
  207.                 "department_name" => $userDepartment->getName(),
  208.                 "branch_id" => $userBranch->getId(),
  209.                 "branch_name" => $userBranch->getMnemonique(),
  210.                 'branch_raison_sociale' => $userBranch->getRaisonSociale(),
  211.                 'branch_siret' => $userBranch->getSiret(),
  212.                 'branch_telephone' => $userBranch->getTelephone(),
  213.                 'branch_adresses' => $branchAdresseManager->formatAll($userBranch->getAdresses('postal'), true) + $branchAdresseManager->formatAll($userBranch->getAdresses(), true),
  214.                 'access_users' => [],
  215.                 'access_departments' => [],
  216.                 'access_branches' => [],
  217.                 'proprietaires' => $proprietaires
  218.             ],
  219.         ];
  220.         // variables access
  221.         foreach ($user->getAccessUsers() as $accessUser) {
  222.             $content['infos']['access_users'][$accessUser->getId()] = $accessUser->getUsername();
  223.         }
  224.         foreach ($user->getAccessDepartments() as $accessDepartment) {
  225.             $content['infos']['access_departments'][$accessDepartment->getId()] = $accessDepartment->getName();
  226.         }
  227.         foreach ($user->getAccessBranches() as $accessBranch) {
  228.             $content['infos']['access_branches'][$accessBranch->getId()] = $accessBranch->getMnemonique();
  229.         }
  230.         // Recherche JAZ_PRODUIT :
  231.         $produitsData = [];
  232.         $produits = [];
  233.         $switchableProducts = [];
  234.         foreach ($user->getUserProfils() as $userProfil) {
  235.             if ($userProfil->getIsActive()) {
  236.                 $profil = $userProfil->getProfil();
  237.                 $profilDroits = $profil->getProfilDroits();
  238.                 foreach ($profilDroits as $profilDroit) {
  239.                     $droit = $profilDroit->getDroit();
  240.                     $produit = $droit->getProduit();
  241.                     if ($produit && (!$produitRequest || $produit == $produitRequest->getProduit())) {
  242.                         $produits[$produit->getName()] = $produit;
  243.                         if ($produit->getUrl() && (empty($produits[$requestContent['produit'] ?? '']) || $produit !== $produits[$requestContent['produit'] ?? ''])) {
  244.                             $switchableProducts[$produit->getName()] = [
  245.                                 'name' => $produit->getName(),
  246.                                 'logo' => $produit->getLogo() ? ($produit->getUrl() . $produit->getLogo()) : null,
  247.                                 'url' => $this->userManager->getSwitchUrl($user, $produit)[0] ?? null
  248.                             ];
  249.                         }
  250.                         $listCrude = [];
  251.                         if (isset($produitsData[$produit->getName()][$droit->getCode()])) {
  252.                             $listCrude = $produitsData[$produit->getName()][$droit->getCode()];
  253.                         }
  254.                         $produitsData[$produit->getName()][$droit->getCode()] = $this->formatProfilDroit($profilDroit, $listCrude);
  255.                     }
  256.                 }
  257.             }
  258.         }
  259.         $content['rights'] = $produitsData;
  260.         $content['switchableProducts'] = $switchableProducts;
  261.         $hasDbAuth = [];
  262.         foreach ($produits as $produit) {
  263.             if (!isset($hasDbAuth[$produit->getName()])) {
  264.                 $branchProduit = $this->em->getRepository(BranchProduit::class)->findOneBy(['branch' => $userBranch, 'produit' => $produit]);
  265.                 $userProduit = $this->em->getRepository(UserProduit::class)->findOneBy(['user' => $user, 'produit' => $produit]);
  266.                 $hasDbAuth[$produit->getName()] = [
  267.                     'branch' => ($branchProduit ? $branchProduit->getHasDbAuth() : false),
  268.                     'user' => ($userProduit ? $userProduit->getHasDbAuth() : false),
  269.                 ];
  270.             }
  271.         }
  272.         $content['hasDbAuth'] = $hasDbAuth;
  273.         /** Gestion des dashboards */
  274.         $dashboardsData = [];
  275.         foreach ($produits as $kp => $vp) {
  276.             $dashboardsTmp = [];
  277.             $dashboards = $dashboardManager->getRepository()->getDashboardsByProductsAndUser($vp, $user);
  278.             if ($dashboards) {
  279.                 foreach ($dashboards as $dashboard) {
  280.                     $dashboardsTmp[] = $dashboardManager->formatDashboardDatas($dashboard, $user);
  281.                 }
  282.             }
  283.             $dashboardsData[$kp] = $dashboardsTmp;
  284.         }
  285.         $content['dashboards'] = $dashboardsData;
  286.         /** Fin gestion des dashboards */
  287.         // Récupération des profils - Nécessaire pour simuler les Persona des forks de l'EC TDET
  288.         $userProfils =  $user->getUserProfils();
  289.         $profils = [];
  290.         foreach ($userProfils as $userProfil) {
  291.             if ($userProfil->getIsActive()) {
  292.                 $profils[$userProfil->getProfil()->getProduit()->getName()][] = $userProfil->getProfil()->getName();
  293.             }
  294.         }
  295.         $content['profils'] = $profils;
  296.         // Fonctionnalités
  297.         $detailFonctionnalites = [];
  298.         $detailFonctionnalitesD = [];
  299.         $detailFonctionnalitesU = [];
  300.         $content['fonctionnalites'] = [];
  301.         $userFonctionnalites = $user->getUserFonctionnalites();
  302.         $department_id = $userDepartment->getId();
  303.         foreach ($userFonctionnalites as $userFonctionnalite) {
  304.             $departmentFonctionnalite = $userFonctionnalite->getDepartmentFonctionnalite();
  305.             if ($departmentFonctionnalite->getDepartment()->getId() === $department_id) {
  306.                 $detailFonctionnalite = $departmentFonctionnalite->getDetailFonctionnalite();
  307.                 $fonctionnalite = $detailFonctionnalite->getFonctionnalite();
  308.                 if (!$userFonctionnalite->getIsActive() or !$departmentFonctionnalite->getIsActive()) {
  309.                     $detailFonctionnalite->setIsDisponible(false);
  310.                 }
  311.                 if ($detailFonctionnalite->getIsDisponible()) {
  312.                     $detailFonctionnalites[$fonctionnalite->getId()] = $detailFonctionnalite;
  313.                     $detailFonctionnalitesD[$fonctionnalite->getId()] = $departmentFonctionnalite;
  314.                     $detailFonctionnalitesU[$fonctionnalite->getId()] = $userFonctionnalite;
  315.                 }
  316.             }
  317.         }
  318.         foreach ($detailFonctionnalites as $detailFonctionnalite) {
  319.             $fonctionnalite = $detailFonctionnalite->getFonctionnalite();
  320.             $contentFonctionnalite = [
  321.                 "libelle" => $detailFonctionnalite->getLibelleOverride() ?? $fonctionnalite->getLibelle(),
  322.                 "show" => $detailFonctionnalite->getIsDisponible(),
  323.             ];
  324.             if ($fonctionnalite->getType() === "field") {
  325.                 $contentFonctionnalite += [
  326.                     "required" => $detailFonctionnalite->getIsObligatoire(),
  327.                     "type" => $detailFonctionnalite->getInputType(),
  328.                     "regex" => $detailFonctionnalite->getRegexPattern(),
  329.                     "pattern" => $detailFonctionnalite->getPattern(),
  330.                     "min_length" => $detailFonctionnalite->getMinLength(),
  331.                     "max_length" => $detailFonctionnalite->getMaxLength()
  332.                 ];
  333.             } elseif (!empty($fonctionnalite->getOptionsAvailableKey())) {
  334.                 $optionsAvailable = $fonctionnalite->getOptionsAvailableKey();
  335.                 $options = $detailFonctionnalite->getOptionsKey();
  336.                 if (!empty($detailFonctionnalitesD[$fonctionnalite->getId()]) && !empty($detailFonctionnalitesD[$fonctionnalite->getId()]->getOptionsKey())) {
  337.                     $optionsAvailable = $detailFonctionnalitesD[$fonctionnalite->getId()]->getOptionsKey();
  338.                     $options = $detailFonctionnalitesD[$fonctionnalite->getId()]->getOptions();
  339.                 }
  340.                 if (!empty($detailFonctionnalitesU[$fonctionnalite->getId()]) && !empty($detailFonctionnalitesU[$fonctionnalite->getId()]->getOptionsKey())) {
  341.                     $optionsAvailable = $detailFonctionnalitesU[$fonctionnalite->getId()]->getOptionsKey();
  342.                     $options = $detailFonctionnalitesU[$fonctionnalite->getId()]->getOptions();
  343.                 }
  344.                 $optionsAvailable = explode('","', substr(substr($optionsAvailable, 2), 0, -2));
  345.                 $options = explode('","', substr(substr($options, 2), 0, -2));
  346.                 $contentOptions = [];
  347.                 foreach ($optionsAvailable as $option) {
  348.                     if (in_array($option, $options)) $contentOptions[$option] = true;
  349.                     else $contentOptions[$option] = false;
  350.                 }
  351.                 $contentFonctionnalite += ['options' => $contentOptions];
  352.             }
  353.             $keyList = [];
  354.             while (!empty($fonctionnalite->getRootId())) {
  355.                 $key = $fonctionnalite->getLibelleKey();
  356.                 if ($fonctionnalite->getType() === "field") $key = 'field_' . $key;
  357.                 $keyList[] = $key;
  358.                 $fonctionnalite = $detailFonctionnalites[$fonctionnalite->getRootId()]->getFonctionnalite();
  359.             }
  360.             $key = $fonctionnalite->getLibelleKey();
  361.             if ($fonctionnalite->getType() === "field") $key = 'field_' . $key;
  362.             $keyList[] = $key;
  363.             $arrayToFill = &$content['fonctionnalites'];
  364.             while (sizeof($keyList) > 1) {
  365.                 $key = array_pop($keyList);
  366.                 if (!array_key_exists($key, $arrayToFill)) {
  367.                     $arrayToFill[$key] = [];
  368.                 }
  369.                 $arrayToFill = &$arrayToFill[$key];
  370.                 if (!array_key_exists('options', $arrayToFill)) {
  371.                     $arrayToFill['options'] = [];
  372.                 }
  373.                 $arrayToFill = &$arrayToFill['options'];
  374.             }
  375.             $key = array_pop($keyList);
  376.             if (!array_key_exists($key, $arrayToFill)) {
  377.                 $arrayToFill[$key] = [];
  378.             }
  379.             $arrayToFill[$key] += $contentFonctionnalite;
  380.         }
  381.         $content['fonctionnalites']['indice_thresh_exetr'] = -1;
  382.         if (!empty($requestContent['produit']) && $requestContent['produit'] === 'OOFTOP') {
  383.             $get_user_const = (Yaml::parseFile('../config/custom/get_user_const.yaml') ?? []);
  384.             $match_prestations = $get_user_const['match_prestations'] ?? [];
  385.             $prestations = $get_user_const['prestations'] ?? [];
  386.             foreach ($match_prestations as $fonctionnalite => $prestas) {
  387.                 if (!isset($content['fonctionnalites'][$fonctionnalite]) || !isset($content['fonctionnalites'][$fonctionnalite]['show']) || $content['fonctionnalites'][$fonctionnalite]['show'] === false) {
  388.                     foreach ($prestas as $presta) {
  389.                         unset($prestations[$presta]);
  390.                     }
  391.                 }
  392.             }
  393.             $content['prestations'] = $prestations;
  394.         }
  395.         if (empty($requestContent['produit']) || $requestContent['produit'] === 'NOSE') {
  396.             $content['perimetre'] = $this->perimetreManager->getPerimetreByProductAndType($user->getPerimetres());
  397.         } elseif (!empty($requestContent['produit']) && !empty($produits[$requestContent['produit']])) {
  398.             $content['perimetre'] = $this->perimetreSystemRepository->getPerimetreSystemByUserAndProduct($user, $produits[$requestContent['produit']]);
  399.             $userProduit = $userProduitManager->getRepository()->getUserProduitByUserAndProduit($user, $requestContent['produit']);
  400.             if ($userProduit) {
  401.                 $content['infos']['cguAcceptedAt'] = $userProduit->getCguAcceptedAt() ? $userProduit->getCguAcceptedAt()->format('Y-m-d') : null;
  402.                 $content['infos']['cgvAcceptedAt'] = $userProduit->getCgvAcceptedAt() ? $userProduit->getCgvAcceptedAt()->format('Y-m-d') : null;
  403.             }
  404.         }
  405.         // Périmètre production
  406.         return new JsonResponse(['message' => 'ok', 'user' => $content]);
  407.     }
  408.     /**
  409.      * @Route("/password_constraints", name="password_constraints")
  410.      */
  411.     public function sendPasswordContraints(PasswordManager $passwordManager): ?JsonResponse
  412.     {
  413.         $data = $passwordManager->sendConstraints();
  414.         return new JsonResponse($data);
  415.     }
  416.     /**
  417.      * @Route("/password/init", name="password_init")
  418.      */
  419.     public function checkPasswordInitialization(Request $request): ?JsonResponse
  420.     {
  421.         $requestContent = $this->getRequestArray($request);
  422.         $username = $request->get('username') ?? (array_key_exists('username', $requestContent) ? $requestContent['username'] : null);
  423.         $token = $request->get('token') ?? (array_key_exists('username', $requestContent) ? $requestContent['token'] : null);
  424.         $plainPassword1 = $request->get('password1') ?? (array_key_exists('password1', $requestContent) ? $requestContent['password1'] : null);
  425.         $plainPassword2 = $request->get('password2') ?? (array_key_exists('password2', $requestContent) ? $requestContent['password2'] : null);
  426.         // Recherche de l'utilisateur
  427.         $user = $this->userManager->getRepository()->findOneBy(['username' => $username, 'deletedAt' => null]);
  428.         if (empty($user)) return new JsonResponse(['message' => 'Bad Request', 'error' => 'Utilisateur inconnu.'], 400);
  429.         if (!empty($token)) $user = $this->userManager->checkInitTokenValidity($token);
  430.         else return new JsonResponse(['message' => 'Bad Request', 'error' => ['Votre lien est arrivé à expiration. Veuillez renouveler votre demande.']], 400);
  431.         if (is_null($plainPassword1) or is_null($plainPassword2)) {
  432.             $result = ['Paramètres manquants'];
  433.         } else $result = $this->userManager->initPasswordByUser($user, $plainPassword1, $plainPassword2);
  434.         if (is_array($result)) {
  435.             return new JsonResponse(['message' => 'Bad Request', 'error' => $result], 400);
  436.         } elseif ($result instanceof User) {
  437.             $this->userManager->updatePassword($user, $plainPassword1);
  438.             return new JsonResponse(['message' => 'OK']);
  439.         }
  440.         return new JsonResponse(['message' => 'Internal Server Error'], 500);
  441.     }
  442.     /**
  443.      * @Route("/password/token/check", name="password_token_check")
  444.      */
  445.     public function checkTokenValidity(Request $request): ?JsonResponse
  446.     {
  447.         $requestContent = $this->getRequestArray($request);
  448.         $token = $request->get('token') ?? (array_key_exists('username', $requestContent) ? $requestContent['token'] : null);
  449.         $user = null;
  450.         if (!empty($token)) {
  451.             $user = $this->userManager->checkResetTokenValidity($token);
  452.             if (!$user) {
  453.                 $user = $this->userManager->checkTokenValidity($token);
  454.             }
  455.         }
  456.         if (!$user) {
  457.             return new JsonResponse(['message' => 'Bad Request', 'error' => ['Votre lien est arrivé à expiration. Veuillez renouveler votre demande.']], 400);
  458.         }
  459.         return new JsonResponse(['message' => 'Ok']);
  460.     }
  461.     /**
  462.      * @Route("/password/reset/check", name="password_reset_check")
  463.      */
  464.     public function checkPasswordReset(Request $request): ?JsonResponse
  465.     {
  466.         $requestContent = $this->getRequestArray($request);
  467.         $username = $request->get('username') ?? (array_key_exists('username', $requestContent) ? $requestContent['username'] : null);
  468.         $token = $request->get('token') ?? (array_key_exists('username', $requestContent) ? $requestContent['token'] : null);
  469.         $plainPassword1 = $request->get('password1') ?? (array_key_exists('password1', $requestContent) ? $requestContent['password1'] : null);
  470.         $plainPassword2 = $request->get('password2') ?? (array_key_exists('password2', $requestContent) ? $requestContent['password2'] : null);
  471.         // Recherche de l'utilisateur
  472.         $user = $this->userManager->getRepository()->findOneBy(['username' => $username, 'deletedAt' => null]);
  473.         if (empty($user)) return new JsonResponse(['message' => 'Bad Request', 'error' => 'Utilisateur inconnu.'], 400);
  474.         if (!empty($token)) $user = $this->userManager->checkResetTokenValidity($token);
  475.         else return new JsonResponse(['message' => 'Bad Request', 'error' => ['Votre lien est arrivé à expiration. Veuillez renouveler votre demande.']], 400);
  476.         $result = $this->userManager->initPasswordByUser($user, $plainPassword1, $plainPassword2);
  477.         if (is_array($result)) {
  478.             return new JsonResponse(['message' => 'Bad Request', 'error' => $result], 400);
  479.         } elseif ($result instanceof User) {
  480.             $this->userManager->updatePassword($user, $plainPassword1);
  481.             $this->userManager->resetEchec($user);
  482.             return new JsonResponse(['message' => 'OK']);
  483.         }
  484.         return new JsonResponse(['message' => 'Internal Server Error'], 500);
  485.     }
  486.     /**
  487.      * @Route("/password/reset/request", name="password_reset_request")
  488.      */
  489.     public function requestForPasswordReset(Request $request, ProduitApiConnector $connector): ?JsonResponse
  490.     {
  491.         $requestContent = $this->getRequestArray($request);
  492.         $username = $request->get('username') ?? (array_key_exists('username', $requestContent) ? $requestContent['username'] : null);
  493.         $produitName = $request->get('produit_name') ?? (array_key_exists('produit_name', $requestContent) ? $requestContent['produit_name'] : null);
  494.         // Recherche de l'utilisateur et du produit
  495.         $user = $this->userManager->getRepository()->findOneBy(['username' => $username, 'deletedAt' => null]);
  496.         $produit = $this->em->getRepository(Produit::class)->findOneBy(['name' => $produitName]);
  497.         if (empty($user) || empty($produit)) {
  498.             return new JsonResponse(['message' => 'Bad Request', 'error' => ['Utilisateur ou produit inconnu.']], 400);
  499.         }
  500.         if ($produitName === 'NOSE') {
  501.             $this->userManager->resetPasswordForNose($username);
  502.         } else {
  503.             // JAZ 237 - reset password false
  504.             $token = $this->userManager->resetPasswordForProduit($username, false);
  505.             $organisation = $user->getDepartment()->getBranch();
  506.             $parameters = [
  507.                 'token' => $token,
  508.                 'username' => $user->getUsername(),
  509.                 'nom' => $user->getLastname() . ' ' . $user->getFirstname(),
  510.                 'email' => $user->getEmail(),
  511.                 'ste' => $organisation->getMnemonique(),
  512.             ];
  513.             $connector->sendRequestToProduit($produit, $parameters, 'GET', $produit->getResetPasswordUrl() ?? 'user/pass/reset');
  514.         }
  515.         return new JsonResponse(['message' => 'Ok']);
  516.     }
  517.     /**
  518.      * @Route("/password/edit", name="password_edit")
  519.      */
  520.     public function changePassword(Request $request): ?JsonResponse
  521.     {
  522.         $requestContent = $this->getRequestArray($request);
  523.         $username = $request->get('username') ?? (array_key_exists('username', $requestContent) ? $requestContent['username'] : null);
  524.         $token = $request->get('token') ?? (array_key_exists('username', $requestContent) ? $requestContent['token'] : null);
  525.         $plainPassword1 = $request->get('password1') ?? (array_key_exists('password1', $requestContent) ? $requestContent['password1'] : null);
  526.         $plainPassword2 = $request->get('password2') ?? (array_key_exists('password2', $requestContent) ? $requestContent['password2'] : null);
  527.         $oldPlainPassword = $request->get('old_password') ?? (array_key_exists('old_password', $requestContent) ? $requestContent['old_password'] : null);
  528.         // Recherche de l'utilisateur
  529.         $user = $this->userManager->getRepository()->findOneBy(['username' => $username, 'deletedAt' => null]);
  530.         if (empty($user)) return new JsonResponse(['message' => 'Bad Request', 'error' => ['Utilisateur inconnu.']], 400);
  531.         if ($token !== $user->getToken()) return new JsonResponse(['message' => 'Bad Request', 'error' => ['Votre lien est arrivé à expiration. Veuillez renouveler votre demande.']], 400);
  532.         if (is_null($oldPlainPassword) or is_null($plainPassword1) or is_null($plainPassword2)) {
  533.             $result = ['Paramètres manquants'];
  534.         } else {
  535.             $result = $this->userManager->updatePasswordByUser($user, $oldPlainPassword, $plainPassword1, $plainPassword2);
  536.         }
  537.         if (is_array($result)) {
  538.             return new JsonResponse(['message' => 'Bad Request', 'error' => $result], 400);
  539.         } elseif ($result instanceof User) {
  540.             $user = $this->userManager->updatePassword($user, $plainPassword1);
  541.             $this->userManager->resetEchec($user);
  542.             return new JsonResponse(['message' => 'OK', 'new_token' => $user->getToken()]);
  543.         }
  544.         return new JsonResponse(['message' => 'Internal Server Error'], 500);
  545.     }
  546.     /**
  547.      * @Route ("/droit", name="droit")
  548.      */
  549.     public function getDroit(Request $request): JsonResponse
  550.     {
  551.         $userToken = $request->get('userToken');
  552.         $produitName = $request->get('produit');
  553.         $droitCode = $request->get('codeDroit');
  554.         if (empty($userToken) || empty($produitName)) return new JsonResponse(['message' => 'Paramètre manquant'], 204);
  555.         $profilsDroits = $this->em->getRepository(ProfilDroit::class)->findForApi($userToken, $produitName, $droitCode);
  556.         $profilsDroitsResult = [];
  557.         if (!empty($profilsDroits)) {
  558.             foreach ($profilsDroits as $profilDroit) {
  559.                 $droit = $profilDroit->getDroit();
  560.                 $listCrude = [];
  561.                 if (isset($profilsDroitsResult[$droit->getCode()])) {
  562.                     $listCrude = $profilsDroitsResult[$droit->getCode()];
  563.                 }
  564.                 $profilsDroitsResult[$droit->getCode()] = $this->formatProfilDroit($profilDroit, $listCrude);
  565.             }
  566.         }
  567.         return new JsonResponse(['message' => 'ok', 'droit' => $profilsDroitsResult]);
  568.     }
  569.     /**
  570.      * @Route ("/perimetre", name="perimetre")
  571.      */
  572.     public function getPerimetre(Request $request): ?JsonResponse
  573.     {
  574.         $userToken = $request->get('userToken');
  575.         $produitName = $request->get('produit');
  576.         if (empty($userToken) || empty($produitName)) return new JsonResponse(['message' => 'Paramètre manquant'], 204);
  577.         $perimetres = $this->em->getRepository(Perimetre::class)->findForApi($userToken, $produitName);
  578.         $perimetreResult = $this->perimetreManager->getPerimetreByType($perimetres);
  579.         return new JsonResponse(['message' => 'ok', 'perimetre' => $perimetreResult]);
  580.     }
  581.     /**
  582.      * @Route("/entitesFacturation/{mnemoProprietaire}/{mnemoClient}", name="entite_facturation", methods={"GET"})
  583.      */
  584.     public function getEntitesFacturation(string $mnemoProprietaire, string $mnemoClient): ?JsonResponse
  585.     {
  586.         $proprietaire = $this->em->getRepository(Proprietaire::class)->findOneBy(['code' => $mnemoProprietaire]);
  587.         $client = $this->em->getRepository(Branch::class)->getBranchByMnemonique($mnemoClient, $proprietaire);
  588.         if ($client instanceof BranchAdresse) {
  589.             $client = $client->getBranch();
  590.         }
  591.         $entiteFacturationList = [];
  592.         if ($client && $client->getAdresses('factu', false)) {
  593.             /** @var BranchAdresse $adress */
  594.             foreach ($client->getAdresses('factu', false) as $adress) {
  595.                 $filteredArray = $adress->getProprietaires()->filter(
  596.                     function (Proprietaire $p) use ($proprietaire) {
  597.                         return $p->getId() === $proprietaire->getId();
  598.                     }
  599.                 );
  600.                 if (!$filteredArray->isEmpty()) {
  601.                     $entiteFacturationList[] = $adress->format(false, true);
  602.                 }
  603.             }
  604.         }
  605.         return new JsonResponse($entiteFacturationList);
  606.     }
  607.     /**
  608.      * @Route("/entite/factu", name="entite_factu", methods={"GET"})
  609.      */
  610.     public function getEntiteFactu(): JsonResponse
  611.     {
  612.         $addresses = $this->em->getRepository(BranchAdresse::class)->findBy(['type' => 'factu']);
  613.         $entiteFacturationList = [];
  614.         /** @var BranchAdresse $adress */
  615.         foreach ($addresses as $adress) {
  616.             $entiteFacturationList[] = $adress->format(false, true);
  617.         }
  618.         return new JsonResponse($entiteFacturationList);
  619.     }
  620.     /**
  621.      * @Route("/get/clients/proprietaire/{proprietaire}", name="search_client_by_proprietaire", methods={"GET"})
  622.      */
  623.     public function getClientsByProprietaire(string $proprietaire): JsonResponse
  624.     {
  625.         return new JsonResponse($this->em->getRepository(BranchProprietaire::class)->getElementByElement('bp.mnemonique', 'p.code', $proprietaire));
  626.     }
  627.     /**
  628.      * @Route("/get/clients/mnemonique/{mnemonique}", name="search_client_by_mnemonique", methods={"GET"})
  629.      */
  630.     public function getClientByMnemonique(string $mnemonique): Response
  631.     {
  632.         return new JsonResponse($this->em->getRepository(Branch::class)->getElementByElement('b.mnemonique', 'bp.mnemonique', $mnemonique));
  633.     }
  634.     /**
  635.      * @Route("/get/proprietaire/mnemonique/{mnemonique}", name="search_proprietaire_by_mnemonique", methods={"GET"})
  636.      */
  637.     public function getProprietairesByMnemonique(string $mnemonique): Response
  638.     {
  639.         return new JsonResponse($this->em->getRepository(Branch::class)->getElementByElement('p.code', 'bp.mnemonique', $mnemonique));
  640.     }
  641.     /**
  642.      * @Route("/get/proprietaires/client/{client}", name="search_proprietaire_by_client", methods={"GET"})
  643.      */
  644.     public function getProprietairesByClient(string $client): Response
  645.     {
  646.         return new JsonResponse($this->em->getRepository(Branch::class)->getElementByElement('p.code', 'b.mnemonique', $client));
  647.     }
  648.     /**
  649.      * @Route("/interlocuteur/{proprietaire}/{cliCode}/{cliCodeFactu}", name="entite_facturation_interlocuteur", methods={"GET"}, defaults={"cliCodeFactu"=null})
  650.      */
  651.     public function getInterlocuteurByClientProprietaire(string $proprietaire, string $cliCode, ?string $cliCodeFactu): Response
  652.     {
  653.         $users = $this->userManager->getRepository()->getInterlocuteurByEntiteFacturation($proprietaire, $cliCode, $cliCodeFactu);
  654.         $data = [];
  655.         /** @var User $user */
  656.         foreach ($users as $user) {
  657.             $data[] = [
  658.                 'id' => $user['id'],
  659.                 'firstName' => $user['firstname'],
  660.                 'lastName' => $user['lastname'],
  661.                 'codeInterlocuteur' => $user['codeInterlocuteur']
  662.             ];
  663.         }
  664.         return new JsonResponse($data);
  665.     }
  666.     /**
  667.      * @Route("/switch/{username}/{produit}", name="switch_user", methods={"GET"})
  668.      */
  669.     public function switchUser(string $username, string $produit, ProduitRepository $produitRepository, Security $security): JsonResponse
  670.     {
  671.         $user = $this->userManager->getRepository()->findByUsername($username);
  672.         $error = '';
  673.         $url = '';
  674.         if (is_null($user)) {
  675.             $user = $this->userManager->getRepository()->findOneBy(['email' => $username, 'deletedAt' => null]);
  676.         }
  677.         if ($user) {
  678.             $userDepartment = $user->getDepartment();
  679.             $userBranch = $userDepartment->getBranch();
  680.             $produitRequest = $this->checkProduit($produit, $user, $userDepartment, $userBranch);
  681.             if (is_string($produitRequest)) {
  682.                 $error = $this->returnBadAuthentication($produitRequest);
  683.             } else {
  684.                 [$url, $error] = $this->userManager->getSwitchUrl($user, $produitRepository->findOneBy(['name' => $produit]), $security->getUser());
  685.             }
  686.         } else {
  687.             $error = "L'utilisateur demandé n'existe pas.";
  688.         }
  689.         return new JsonResponse(['url' => $url, 'error' => $error, 'success' => $error ? '' : 'URL trouvée']);
  690.     }
  691.     private function formatProfilDroit(ProfilDroit $profilDroit, array $previousProfilDroitFormat = []): array
  692.     {
  693.         $droit = $profilDroit->getDroit();
  694.         $result = [
  695.             "label" => $droit->getName(),
  696.             "c" => $profilDroit->getHasCreate() ? 1 : 0,
  697.             "r" => $profilDroit->getHasRead() ? 1 : 0,
  698.             "u" => $profilDroit->getHasUpdate() ? 1 : 0,
  699.             "d" => $profilDroit->getHasDelete() ? 1 : 0,
  700.             "e" => $profilDroit->getHasExecute() ? 1 : 0,
  701.         ];
  702.         foreach ($previousProfilDroitFormat as $key => $value) {
  703.             if ($key !== 'label') {
  704.                 $result[$key] = ($value || $result[$key]) ? 1 : 0;
  705.             }
  706.         }
  707.         return $result;
  708.     }
  709.     private function returnBadAuthentication($message = ""): ?JsonResponse
  710.     {
  711.         return new JsonResponse(['message' => "Erreur d'authentification ({$message})"], 401);
  712.     }
  713.     private function returnExpiredPassword(User $user, ?string $produit): ?JsonResponse
  714.     {
  715.         if ($produit === 'NOSE')  $this->userManager->resetPasswordForNose($user->getUsername());
  716.         return new JsonResponse([
  717.             'message' => "Erreur d'authentification (Mot de passe expiré)",
  718.             'code' => 'EXPIRED',
  719.             'token' => $user->getToken(),
  720.             'resetToken' => $user->getResetToken()
  721.         ], 401);
  722.     }
  723.     private function returnEchecPassword(User $user, ?string $produit): ?JsonResponse
  724.     {
  725.         if ($produit === 'NOSE')  $this->userManager->resetPasswordForNose($user->getUsername());
  726.         return new JsonResponse([
  727.             'message' => "Erreur d'authentification (echec_password)",
  728.             'code' => 'ECHEC',
  729.             'token' => $user->getToken()
  730.         ], 401);
  731.     }
  732. }