src/Controller/ManagerController.php line 1555

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Account;
  4. use App\Entity\ActionStd;
  5. use App\Entity\ActionStdDocument;
  6. use App\Entity\Credit;
  7. use App\Entity\Document;
  8. use App\Entity\DocumentType;
  9. use App\Entity\Info;
  10. use App\Entity\LoginLog;
  11. use App\Entity\Manager;
  12. use App\Entity\Partner;
  13. use App\Entity\SubcontractorStd;
  14. use App\Entity\SubcontractorStdDocument;
  15. use App\Entity\Subscription;
  16. use App\Entity\SystemStd;
  17. use App\Entity\Training;
  18. use App\Entity\TrainingRequest;
  19. use App\Entity\Treatment;
  20. use App\Entity\TreatmentStd;
  21. use App\Entity\User;
  22. use App\Form\ActionStdTranslateType;
  23. use App\Form\ActionStdType;
  24. use App\Form\InfoType;
  25. use App\Form\ManagerType;
  26. use App\Form\PartnerType;
  27. use App\Form\SubcontractorStdTranslateType;
  28. use App\Form\SubcontractorStdType;
  29. use App\Form\SubscriptionType;
  30. use App\Form\SubscriptionUserType;
  31. use App\Form\SystemStdTranslateType;
  32. use App\Form\SystemStdType;
  33. use App\Form\TrainingTranslateType;
  34. use App\Form\TrainingType;
  35. use App\Form\TreatmentStdTranslateType;
  36. use App\Form\TreatmentStdType;
  37. use App\Form\UserType;
  38. use App\Pdf\MyPdf;
  39. use App\Security\PasswordEncoder;
  40. use App\Services\FileUploadService;
  41. use Doctrine\ORM\EntityManagerInterface;
  42. use Doctrine\ORM\EntityRepository;
  43. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  44. use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
  45. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  46. use Qipsius\TCPDFBundle\Controller\TCPDFController;
  47. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  48. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  49. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  50. use Symfony\Component\Form\Extension\Core\Type\FileType;
  51. use Symfony\Component\Form\Extension\Core\Type\NumberType;
  52. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  53. use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
  54. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  55. use Symfony\Component\Form\Extension\Core\Type\TextType;
  56. use Symfony\Component\HttpFoundation\File\UploadedFile;
  57. use Symfony\Component\HttpFoundation\JsonResponse;
  58. use Symfony\Component\HttpFoundation\Request;
  59. use Symfony\Component\HttpFoundation\StreamedResponse;
  60. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  61. use Symfony\Component\Routing\Annotation\Route;
  62. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  63. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  64. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  65. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  66. use Symfony\Component\Serializer\Serializer;
  67. use Symfony\Component\Validator\Constraints as Assert;
  68. /**
  69.  * @Route("/manager", name="manager_")
  70.  */
  71. class ManagerController extends AbstractMDPController
  72. {
  73.     /**
  74.      * @Route("/", name="homepage")
  75.      */
  76.     public function indexAction(Request $request)
  77.     {
  78.         return $this->redirectToRoute("manager_users");
  79.     }
  80.     /**
  81.      * @Route("/account", name="account")
  82.      */
  83.     public function accountAction(Request $request)
  84.     {
  85.         $em $this->entityManager;
  86.         $account $this->getUser();
  87.         $r_email $account->getEmail();
  88.         $form $this->createForm(ManagerType::class, $account->getManager());
  89.         $form['email']->setData($account->getEmail());
  90.         $form2 $this->createFormBuilder()
  91.             ->add('password'RepeatedType::class, array(
  92.                 'type' => PasswordType::class,
  93.                 'invalid_message' => 'Les mot de passe ne sont pas identiques',
  94.                 'first_options'  => array(
  95.                     'attr' => array(
  96.                         'placeholder' => 'Changer mot de passe'
  97.                     ),
  98.                     'constraints' =>[
  99.                         new Assert\NotBlank([
  100.                             'message' => 'Merci de saisir un mot de passe'
  101.                         ]),
  102.                         new Assert\Regex([
  103.                             'pattern' => '/^(?:(?=(\S*?[A-Z]){1})(?=(\S*?[a-z]){1})(?=(\S*?[0-9]){1})(?=\S*?[~!^(){}<>%@#&*+=_\-$`,.\/\\\;:\'"|\[\]]){1}.{12,})$/m',
  104.                             'message' => "Votre mot de passe doit respecter les recommandations de l'ANSSI : au moins 12 caractères de types différents (majuscules, minuscules, chiffres, caractères spéciaux)"
  105.                         ])
  106.                     ],
  107.                     'label' => "Nouveau mot de passe"
  108.                 ),
  109.                 'second_options' => array(
  110.                     'attr' => array(
  111.                         'placeholder' => 'Confirmation mot de passe'
  112.                     ),
  113.                     'label' => "Confirmez le mot de passe"
  114.                 ),
  115.                 'mapped' => false
  116.             ))->getForm();
  117.         $form->handleRequest($request);
  118.         $form2->handleRequest($request);
  119.         if ($form->isSubmitted() && $form->isValid()) {
  120.             $em->flush();
  121.             $this->get('session')->getFlashBag()->add('success''Profil mis à jour');
  122.             if ($r_email != $form['email']->getData()) {
  123.                 if (filter_var($form['email']->getData(), FILTER_VALIDATE_EMAIL)) {
  124.                     $other_account $em->getRepository(Account::class)->findOneBy(['email' => $form['email']->getData()]);
  125.                     if ($other_account && $other_account->getId() != $account->getId()) {
  126.                         $this->get('session')->getFlashBag()->add('danger''Cette adresse mail est déjà utilisée par un autre utilisateur');
  127.                     } else {
  128.                         $account->setEmail($form['email']->getData());
  129.                         $account->getManager()->setEmail($form['email']->getData());
  130.                         $em->flush();
  131.                         $oldToken $this->get('security.token_storage')->getToken();
  132.                         $token = new UsernamePasswordToken(
  133.                             $account//user object with updated username
  134.                             $oldToken->getFirewallName());
  135.                         $this->get('security.token_storage')->setToken($token);
  136.                         $this->get('session')->getFlashBag()->add('success''Identifiant de connexion modifié');
  137.                     }
  138.                 } else {
  139.                     $this->get('session')->getFlashBag()->add('danger''Cette adresse mail n\'est pas valide');
  140.                 }
  141.             }
  142.             return $this->redirectToRoute('manager_account');
  143.         }
  144.         if ($form2->isSubmitted() && $form2->isValid()) {
  145.             $salt md5(uniqid());
  146.             $pwd $form2['password']->getData();
  147.             $account->setSalt($salt);
  148.             $PasswordEncoder = new PasswordEncoder;
  149.             $enc_pwd $PasswordEncoder->encodePassword($pwd$salt);
  150.             $account->setPassword($enc_pwd);
  151.             $em->flush();
  152.             $this->get('session')->getFlashBag()->add('success''Mot de passe mis à jour');
  153.             return $this->redirectToRoute('manager_account');
  154.         }
  155.         return $this->render('manager/account.html.twig', [
  156.             'form' => $form->createView(),
  157.             'form2' => $form2->createView(),
  158.         ]);
  159.     }
  160.     /**
  161.      * @Route("/managers", name="managers")
  162.      */
  163.     public function managersAction(Request $request)
  164.     {
  165.         if (!$this->isGranted("ROLE_DPO")) {
  166.             throw new NotFoundHttpException();
  167.         }
  168.         $managers $this->entityManager->getRepository(Manager::class)->findAll();
  169.         return $this->render('manager/managers.html.twig', [
  170.             "managers" => $managers
  171.         ]);
  172.     }
  173.     /**
  174.      * @Route("/managers/add", name="managers_add")
  175.      */
  176.     public function managersAddAction(Request $request)
  177.     {
  178.         if (!$this->isGranted("ROLE_DPO")) {
  179.             throw new NotFoundHttpException();
  180.         }
  181.         $manager = new Manager();
  182.         $form $this->createForm(ManagerType::class, $manager)
  183.             ->add('role'ChoiceType::class, [
  184.                 'attr' => [
  185.                     'placeholder' => 'Type de compte'
  186.                 ],
  187.                 'label' => 'Type de compte',
  188.                 'choices' => [
  189.                     "A définir" => "ROLE_MANAGER",
  190.                     "Administrateur" => "ROLE_ADMIN",
  191.                     "DPO" => "ROLE_DPO",
  192.                     "Juriste" => "ROLE_JURISTE",
  193.                     "Commerce" => "ROLE_COMMERCE",
  194.                 ],
  195.                 'required' => true,
  196.                 'mapped' => false
  197.             ])
  198.         ;
  199.         $form->handleRequest($request);
  200.         if ($form->isSubmitted() && $form->isValid()) {
  201.             $em $this->entityManager;
  202.             if ($form['email']->getData()) {
  203.                 if (filter_var($form['email']->getData(), FILTER_VALIDATE_EMAIL)) {
  204.                     $other_account $em->getRepository(Account::class)->findOneBy(['email' => $form['email']->getData()]);
  205.                     if ($other_account) {
  206.                         $this->get('session')->getFlashBag()->add('danger''Cette adresse mail est déjà utilisée par un autre utilisateur');
  207.                     } else {
  208.                         $manager->setEmail($form['email']->getData());
  209.                     }
  210.                 } else {
  211.                     $this->get('session')->getFlashBag()->add('danger''Cette adresse mail n\'est pas valide');
  212.                 }
  213.             }
  214.             if ($manager->getEmail()) {
  215.                 $now = new \DateTime("now");
  216.                 $em->persist($manager);
  217.                 $account = new Account();
  218.                 $account->setEmail($manager->getEmail());
  219.                 $account->setEnabled(true);
  220.                 $account->setManager($manager);
  221.                 $account->setRegistrationDate($now);
  222.                 $account->setRoles([$form['role']->getData()]);
  223.                 $salt md5(uniqid());
  224.                 $pwd "";
  225.                 $characters '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  226.                 $charactersLength strlen($characters);
  227.                 for ($i 0$i 12$i++) {
  228.                     $pwd .= $characters[rand(0$charactersLength 1)];
  229.                 }
  230.                 $account->setSalt($salt);
  231.                 $PasswordEncoder = new PasswordEncoder;
  232.                 $enc_pwd $PasswordEncoder->encodePassword($pwd$salt);
  233.                 $account->setPassword($enc_pwd);
  234.                 $em->persist($account);
  235.                 $em->flush();
  236.                 $this->get('session')->getFlashBag()->add('success''Nouveau délégué ajouté');
  237.                 return $this->redirectToRoute("manager_managers");
  238.             }
  239.         }
  240.         return $this->render('manager/managers_add.html.twig', [
  241.             "form" => $form->createView(),
  242.         ]);
  243.     }
  244.     /**
  245.      * @Route("/managers/{id}/edit", name="managers_edit")
  246.      */
  247.     public function managersEditAction(Request $requestManager $manager)
  248.     {
  249.         if (!$this->isGranted("ROLE_DPO")) {
  250.             throw new NotFoundHttpException();
  251.         }
  252.         if ($manager->getAccount()->getId() == $this->getUser()->getId()) {
  253.             return $this->redirectToRoute("manager_account");
  254.         }
  255.         $r_email $manager->getEmail();
  256.         $form $this->createForm(ManagerType::class, $manager)
  257.             ->add('role'ChoiceType::class, [
  258.                 'attr' => [
  259.                     'placeholder' => 'Type de compte'
  260.                 ],
  261.                 'label' => 'Type de compte',
  262.                 'choices' => [
  263.                     "A définir" => "ROLE_MANAGER",
  264.                     "Administrateur" => "ROLE_ADMIN",
  265.                     "DPO" => "ROLE_DPO",
  266.                     "Juriste" => "ROLE_JURISTE",
  267.                     "Commerce" => "ROLE_COMMERCE",
  268.                 ],
  269.                 'required' => true,
  270.                 'mapped' => false
  271.             ])
  272.             ->add('enabled'CheckboxType::class, [
  273.                 'label' => "Compte actif",
  274.                 'required' => false,
  275.                 'mapped' => false
  276.             ])
  277.         ;
  278.         $form['email']->setData($manager->getEmail());
  279.         $form['enabled']->setData($manager->getAccount()->isEnabled());
  280.         $form['role']->setData($manager->getAccount()->getRoles()[0]);
  281.         $form->handleRequest($request);
  282.         if ($form->isSubmitted() && $form->isValid()) {
  283.             $em $this->getDoctrine()->getManager();
  284.             $manager->getAccount()->setEnabled($form['enabled']->getData());
  285.             $manager->getAccount()->setRoles([$form['role']->getData()]);
  286.             $this->get('session')->getFlashBag()->add('success''Compte mis à jour');
  287.             $em->flush();
  288.             if ($r_email != $form['email']->getData()) {
  289.                 if (filter_var($form['email']->getData(), FILTER_VALIDATE_EMAIL)) {
  290.                     $other_account $em->getRepository(Account::class)->findOneBy(['email' => $form['email']->getData()]);
  291.                     if ($other_account && $other_account->getId() != $manager->getAccount()->getId()) {
  292.                         $this->get('session')->getFlashBag()->add('danger''Cette adresse mail est déjà utilisée par un autre utilisateur');
  293.                     } else {
  294.                         $manager->getAccount()->setEmail($form['email']->getData());
  295.                         $manager->setEmail($form['email']->getData());
  296.                         $em->flush();
  297.                         $this->get('session')->getFlashBag()->add('success''Identifiant de connexion modifié');
  298.                     }
  299.                 } else {
  300.                     $this->get('session')->getFlashBag()->add('danger''Cette adresse mail n\'est pas valide');
  301.                 }
  302.             }
  303.             return $this->redirectToRoute("manager_managers");
  304.         }
  305.         return $this->render('manager/managers_edit.html.twig', [
  306.             "form" => $form->createView(),
  307.         ]);
  308.     }
  309.     /**
  310.      * @Route("/managers/{id}/delete", name="managers_delete")
  311.      */
  312.     public function managersDeleteAction(Request $requestManager $manager)
  313.     {
  314.         if (!$this->isGranted("ROLE_DPO")) {
  315.             throw new NotFoundHttpException();
  316.         }
  317.         $em $this->entityManager;
  318.         $users $em->getRepository(User::class)->findBy(['manager' => $manager]);
  319.         $documents $em->getRepository(Document::class)->findBy(['manager' => $manager]);
  320.         if (count($users) == && count($documents) == 0) {
  321.             $em->remove($manager);
  322.             $em->flush();
  323.             $this->get('session')->getFlashBag()->add('success''Compte délégué supprimé');
  324.         } else {
  325.             $form $this->createFormBuilder()
  326.                 ->add('changeUsers'ChoiceType::class, [
  327.                     'choices' => [
  328.                         "Supprimer les clients" => "0",
  329.                         "Associer à un autre délégué" => "1",
  330.                     ],
  331.                     'data' => '1',
  332.                     'expanded' => true,
  333.                     'multiple' => false,
  334.                 ])
  335.                 ->add('managerUsers'EntityType::class, [
  336.                     'attr' => array(
  337.                         'placeholder' => 'Délégué à la Protection des Données',
  338.                     ),
  339.                     'label' => 'Délégué à la Protection des Données',
  340.                     'expanded' => false,
  341.                     'multiple' => false,
  342.                     'required' => true,
  343.                     'class' => Manager::class,
  344.                     'query_builder' => function (EntityRepository $er) use ( $manager ) {
  345.                         $qb $er->createQueryBuilder('m');
  346.                         return $qb->where('m.id != :managerId')
  347.                             ->setParameter("managerId"$manager->getId())
  348.                             ->orderBy('m.lastName''ASC');
  349.                     },
  350.                     'choice_label' => function(Manager $manager) {
  351.                         return $manager->getFirstName().' '.$manager->getLastName().' ('.$manager->getCompanyName().')';
  352.                     },
  353.                 ])
  354.                 ->add('changeDocuments'ChoiceType::class, [
  355.                     'choices' => [
  356.                         "Supprimer les documents" => "0",
  357.                         "Associer à un autre délégué" => "1",
  358.                     ],
  359.                     'data' => '1',
  360.                     'expanded' => true,
  361.                     'multiple' => false,
  362.                 ])
  363.                 ->add('managerDocuments'EntityType::class, [
  364.                     'attr' => array(
  365.                         'placeholder' => 'Délégué à la Protection des Données',
  366.                     ),
  367.                     'label' => 'Délégué à la Protection des Données',
  368.                     'expanded' => false,
  369.                     'multiple' => false,
  370.                     'required' => true,
  371.                     'class' => Manager::class,
  372.                     'query_builder' => function (EntityRepository $er) use ( $manager ) {
  373.                         $qb $er->createQueryBuilder('m');
  374.                         return $qb->where('m.id != :managerId')
  375.                             ->setParameter("managerId"$manager->getId())
  376.                             ->orderBy('m.lastName''ASC');
  377.                     },
  378.                     'choice_label' => function(Manager $manager) {
  379.                         return $manager->getFirstName().' '.$manager->getLastName().' ('.$manager->getCompanyName().')';
  380.                     },
  381.                 ])
  382.                 ->getForm();
  383.             $form->handleRequest($request);
  384.             if ($form->isSubmitted() && $form->isValid()) {
  385.                 $error false;
  386.                 if ($form['changeDocuments']->getData() && $form['changeDocuments']->getData() == "1") {
  387.                     if (!$form['managerDocuments']->getData()) {
  388.                         $error true;
  389.                     }
  390.                 }
  391.                 if ($form['changeUsers']->getData() && $form['changeUsers']->getData() == "1") {
  392.                     if (!$form['managerUsers']->getData()) {
  393.                         $error true;
  394.                     }
  395.                 }
  396.                 if (!$error) {
  397.                     if ($form['changeDocuments']->getData() && $form['changeDocuments']->getData() == "1") {
  398.                         foreach ($documents as $document) {
  399.                             $document->setManager($form['managerDocuments']->getData());
  400.                             $em->flush();
  401.                         }
  402.                     } else {
  403.                         foreach ($documents as $document) {
  404.                             $em->remove($document);
  405.                             $em->flush();
  406.                         }
  407.                     }
  408.                     if ($form['changeUsers']->getData() && $form['changeUsers']->getData() == "1") {
  409.                         foreach ($users as $user) {
  410.                             $user->setManager($form['managerUsers']->getData());
  411.                         }
  412.                     } else {
  413.                         foreach ($users as $user) {
  414.                             $em->remove($user);
  415.                             $em->flush();
  416.                         }
  417.                     }
  418.                     $em->remove($manager);
  419.                     $em->flush();
  420.                     $this->get('session')->getFlashBag()->add('success''Compte délégué supprimé');
  421.                     return $this->redirectToRoute("manager_managers");
  422.                 }
  423.             }
  424.             return $this->render('manager/managers_delete.html.twig', [
  425.                 "form" => $form->createView(),
  426.             ]);
  427.         }
  428.         return $this->redirectToRoute("manager_managers");
  429.     }
  430.     /**
  431.      * @Route("/currentsubscriptions", name="current_subscriptions")
  432.      */
  433.     public function currentSubscriptionsAction(Request $request)
  434.     {
  435.         if ($this->isGranted("ROLE_DPO")) {
  436.             $users $this->entityManager->getRepository(User::class)->findAll();
  437.         } elseif ($this->isGranted("ROLE_JURISTE")) {
  438.             $users $this->entityManager->getRepository(User::class)->findForManager($this->getUser()->getManager());
  439.         } else {
  440.             $users $this->entityManager->getRepository(User::class)->findBy(['demo' => true]);
  441.         }
  442.         return $this->render('manager/current_subscriptions.html.twig', [
  443.             "users" => $users,
  444.             "now" => new \DateTime("now"),
  445.         ]);
  446.     }
  447.     /**
  448.      * @Route("/users", name="users")
  449.      */
  450.     public function usersAction(Request $request)
  451.     {
  452.         if ($this->isGranted("ROLE_DPO")) {
  453.             $users $this->entityManager->getRepository(User::class)->findAll();
  454.         } elseif ($this->isGranted("ROLE_JURISTE")) {
  455.             $users $this->entityManager->getRepository(User::class)->findForManager($this->getUser()->getManager());
  456.         } else {
  457.             $users $this->entityManager->getRepository(User::class)->findBy(['demo' => true]);
  458.         }
  459.         return $this->render('manager/users.html.twig', [
  460.             "users" => $users
  461.         ]);
  462.     }
  463.     /**
  464.      * @Route("/users/add", name="users_add")
  465.      */
  466.     public function usersAddAction(Request $request)
  467.     {
  468.         $user = new User();
  469.         $form $this->createForm(UserType::class, $user);
  470.         if ($this->isGranted("ROLE_DPO")) {
  471.             $isAdmin true;
  472.         } else {
  473.             $isAdmin false;
  474.         }
  475.         $manager $this->getUser()->getManager();
  476.         $form->add('parentUser'EntityType::class, [
  477.                 'attr' => array(
  478.                     'placeholder' => 'Compte client principal',
  479.                 ),
  480.                 'label' => 'Compte client principal',
  481.                 'placeholder' => 'Compte client principal',
  482.                 'expanded' => false,
  483.                 'multiple' => false,
  484.                 'required' => false,
  485.                 'class' => User::class,
  486.                 'query_builder' => function (EntityRepository $er) use ( $user$manager$isAdmin ) {
  487.                     $qb $er->createQueryBuilder('u');
  488.                     if (!$isAdmin) {
  489.                         $qb->andWhere("u.manager = :manager")
  490.                         ->setParameter("manager"$manager);
  491.                     }
  492.                     return $qb->orderBy('u.companyName''ASC');
  493.                 },
  494.                 'choice_label' => function(User $queryUser) {
  495.                     return $queryUser->getCompanyName();
  496.                 },
  497.             ])
  498.             ->add('childrenUsers'EntityType::class, [
  499.                 'attr' => array(
  500.                     'placeholder' => 'Comptes clients rattachés',
  501.                 ),
  502.                 'label' => 'Comptes clients rattachés',
  503.                 'placeholder' => 'Comptes clients rattachés',
  504.                 'expanded' => false,
  505.                 'multiple' => true,
  506.                 'required' => false,
  507.                 'class' => User::class,
  508.                 'query_builder' => function (EntityRepository $er) use ( $user$manager$isAdmin ) {
  509.                     $qb $er->createQueryBuilder('u');
  510.                     if (!$isAdmin) {
  511.                         $qb->andWhere("u.manager = :manager")
  512.                             ->setParameter("manager"$manager);
  513.                     }
  514.                     return $qb->orderBy('u.companyName''ASC');
  515.                 },
  516.                 'choice_label' => function(User $queryUser) {
  517.                     return $queryUser->getCompanyName();
  518.                 },
  519.             ])
  520.             ;
  521.         if ($this->isGranted("ROLE_DPO")) {
  522.             $form->add('manager'EntityType::class, [
  523.                 'attr' => array(
  524.                     'placeholder' => 'Délégué à la Protection des Données',
  525.                 ),
  526.                 'label' => 'Délégué à la Protection des Données',
  527.                 'expanded' => false,
  528.                 'multiple' => false,
  529.                 'required' => true,
  530.                 'data' => $this->getUser()->getManager(),
  531.                 'class' => Manager::class,
  532.                 'choice_label' => function(Manager $manager) {
  533.                     return $manager->getFirstName().' '.$manager->getLastName().' ('.$manager->getCompanyName().')';
  534.                 },
  535.             ])
  536.                 ->add('managerDpo'CheckboxType::class, [
  537.                 'label' => "Délégué à la Protection des Données",
  538.                 'required' => false
  539.             ])
  540.                 ->add('lawyer'EntityType::class, [
  541.                     'attr' => array(
  542.                         'placeholder' => 'Juriste',
  543.                     ),
  544.                     'label' => 'Juriste',
  545.                     'expanded' => false,
  546.                     'multiple' => false,
  547.                     'required' => false,
  548.                     'class' => Manager::class,
  549.                     'choice_label' => function(Manager $manager) {
  550.                         return $manager->getFirstName().' '.$manager->getLastName().' ('.$manager->getCompanyName().')';
  551.                     },
  552.                 ]);
  553.         } else {
  554.             $form->add('managerDpo'CheckboxType::class, [
  555.                 'label' => "Vous êtes DPO pour ce client",
  556.                 'required' => false
  557.             ]);
  558.         }
  559.         $form->add('demo'CheckboxType::class, [
  560.             'label' => "Compte de démo pour les commerciaux",
  561.             'required' => false
  562.         ]);
  563.         $form->handleRequest($request);
  564.         if ($form->isSubmitted() && $form->isValid()) {
  565.             $em $this->entityManager;
  566.             if ($form['email']->getData()) {
  567.                 if (filter_var($form['email']->getData(), FILTER_VALIDATE_EMAIL)) {
  568.                     $other_account $em->getRepository(Account::class)->findOneBy(['email' => $form['email']->getData()]);
  569.                     if ($other_account) {
  570.                         $this->get('session')->getFlashBag()->add('danger''Cette adresse mail est déjà utilisée par un autre utilisateur');
  571.                     } else {
  572.                         $user->setEmail($form['email']->getData());
  573.                     }
  574.                 } else {
  575.                     $this->get('session')->getFlashBag()->add('danger''Cette adresse mail n\'est pas valide');
  576.                 }
  577.             }
  578.             if ($user->getEmail()) {
  579.                 $now = new \DateTime("now");
  580.                 if (!$this->isGranted("ROLE_DPO")) {
  581.                     $user->setManager($this->getUser()->getManager());
  582.                 }
  583.                 $em->persist($user);
  584.                 $account = new Account();
  585.                 $account->setEmail($user->getEmail());
  586.                 $account->setEnabled(true);
  587.                 $account->setUser($user);
  588.                 $account->setRegistrationDate($now);
  589.                 $account->setRoles(["ROLE_USER"]);
  590.                 $salt md5(uniqid());
  591.                 $pwd "";
  592.                 $characters '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  593.                 $charactersLength strlen($characters);
  594.                 for ($i 0$i 12$i++) {
  595.                     $pwd .= $characters[rand(0$charactersLength 1)];
  596.                 }
  597.                 $account->setSalt($salt);
  598.                 $PasswordEncoder = new PasswordEncoder;
  599.                 $enc_pwd $PasswordEncoder->encodePassword($pwd$salt);
  600.                 $account->setPassword($enc_pwd);
  601.                 $em->persist($account);
  602.                 $em->flush();
  603.                 if ($form['childrenUsers']->getData()) {
  604.                     foreach ($form['childrenUsers']->getData() as $childUser) {
  605.                         $tmpChildUser $em->getRepository(User::class)->find($childUser->getId());
  606.                         if ($tmpChildUser) {
  607.                             $tmpChildUser->setParentUser($user);
  608.                             $em->flush();
  609.                         }
  610.                     }
  611.                 }
  612.                 $beginDate = new \DateTime("now");
  613.                 $beginDate->setTime(000);
  614.                 $endDate = clone $beginDate;
  615.                 $endDate->sub(new \DateInterval("P1D"));
  616.                 $endDate->add(new \DateInterval("P30D"));
  617.                 $defaultSubscriptionType $em->getRepository(\App\Entity\SubscriptionType::class)->findOneBy(["code" => "FREE30D"]);
  618.                 $defaultSubcription = new Subscription();
  619.                 $defaultSubcription->setCreationDate($beginDate);
  620.                 $defaultSubcription->setBeginDate($beginDate);
  621.                 $defaultSubcription->setEndDate($endDate);
  622.                 $defaultSubcription->setPaymentUntil($endDate);
  623.                 $defaultSubcription->setInvolvementMonths(0);
  624.                 $defaultSubcription->setBillingMonths(0);
  625.                 $defaultSubcription->setUnitBillingPrice(0);
  626.                 $defaultSubcription->setActive(true);
  627.                 $defaultSubcription->setUser($user);
  628.                 $defaultSubcription->setType($defaultSubscriptionType);
  629.                 $em->persist($defaultSubcription);
  630.                 $em->flush();
  631.                 $user->setCurrentSubscription($defaultSubcription);
  632.                 $em->flush();
  633.                 if ($user->getParentUser()) {
  634.                     $parentTreatments $em->getRepository(Treatment::class)->findBy(["user" => $user->getParentUser(), "group" => true]);
  635.                     foreach ($parentTreatments as $parentTreatment) {
  636.                         $user->getGroupTreatments()->add($parentTreatment);
  637.                     }
  638.                     $em->flush();
  639.                 }
  640.                 if ($user->getChildrenUsers()) {
  641.                     $parentTreatments $em->getRepository(Treatment::class)->findBy(["user" => $user"group" => true]);
  642.                     foreach ($user->getChildrenUsers() as $childUser) {
  643.                         foreach ($parentTreatments as $parentTreatment) {
  644.                             if (!$childUser->getGroupTreatments()->contains($parentTreatment)) {
  645.                                 $childUser->getGroupTreatments()->add($parentTreatment);
  646.                             }
  647.                         }
  648.                     }
  649.                     $em->flush();
  650.                 }
  651.                 $this->get('session')->getFlashBag()->add('success''Nouveau client ajouté');
  652.                 $this->get('session')->getFlashBag()->add('success''Abonnement attribué au nouveau client : '.$defaultSubscriptionType->getLibelle());
  653.                 if ($this->isGranted("ROLE_ADMIN")) {
  654.                     return $this->redirectToRoute("manager_subscriptions_user", ["id" => $user->getId()]);
  655.                 } else {
  656.                     return $this->redirectToRoute("manager_users");
  657.                 }
  658.             }
  659.         }
  660.         return $this->render('manager/users_add.html.twig', [
  661.             "form" => $form->createView(),
  662.         ]);
  663.     }
  664.     /**
  665.      * @Route("/users/{id}/edit", name="users_edit")
  666.      */
  667.     public function usersEditAction(Request $requestUser $user)
  668.     {
  669.         if (!$this->isGranted("ROLE_DPO")) {
  670.             if ($user->getManager()->getId() != $this->getUser()->getManager()->getId()) {
  671.                 throw new NotFoundHttpException();
  672.             }
  673.         }
  674.         if ($this->isGranted("ROLE_DPO")) {
  675.             $isAdmin true;
  676.         } else {
  677.             $isAdmin false;
  678.         }
  679.         $manager $this->getUser()->getManager();
  680.         $r_email $user->getEmail();
  681.         $hasParentUser = ($user->getParentUser() != null);
  682.         $childUsersIds = [];
  683.         foreach ($user->getChildrenUsers() as $childUser) {
  684.             $childUsersIds[] = $childUser->getId();
  685.         }
  686.         $form $this->createForm(UserType::class, $user)
  687.             ->add('enabled'CheckboxType::class, [
  688.                 'label' => "Compte actif",
  689.                 'required' => false,
  690.                 'mapped' => false
  691.             ])
  692.         ;
  693.         $form->add('parentUser'EntityType::class, [
  694.             'attr' => array(
  695.                 'placeholder' => 'Compte client principal',
  696.             ),
  697.             'label' => 'Compte client principal',
  698.             'placeholder' => 'Compte client principal',
  699.             'expanded' => false,
  700.             'multiple' => false,
  701.             'required' => false,
  702.             'class' => User::class,
  703.             'query_builder' => function (EntityRepository $er) use ( $user$manager$isAdmin ) {
  704.                 $qb $er->createQueryBuilder('u');
  705.                 $qb->where('u.id != :userId')
  706.                     ->setParameter("userId"$user->getId());
  707.                 if (!$isAdmin) {
  708.                     $qb->andWhere("u.manager = :manager")
  709.                         ->setParameter("manager"$manager);
  710.                 }
  711.                 return $qb->orderBy('u.companyName''ASC');
  712.             },
  713.             'choice_label' => function(User $queryUser) {
  714.                 return $queryUser->getCompanyName();
  715.             },
  716.         ])
  717.             ->add('childrenUsers'EntityType::class, [
  718.                 'attr' => array(
  719.                     'placeholder' => 'Comptes clients rattachés',
  720.                 ),
  721.                 'label' => 'Comptes clients rattachés',
  722.                 'placeholder' => 'Comptes clients rattachés',
  723.                 'expanded' => false,
  724.                 'multiple' => true,
  725.                 'required' => false,
  726.                 'class' => User::class,
  727.                 'query_builder' => function (EntityRepository $er) use ( $user$manager$isAdmin ) {
  728.                     $qb $er->createQueryBuilder('u');
  729.                     $qb->where('u.id != :userId')
  730.                         ->setParameter("userId"$user->getId());
  731.                     if (!$isAdmin) {
  732.                         $qb->andWhere("u.manager = :manager")
  733.                             ->setParameter("manager"$manager);
  734.                     }
  735.                     return $qb->orderBy('u.companyName''ASC');
  736.                 },
  737.                 'choice_label' => function(User $queryUser) {
  738.                     return $queryUser->getCompanyName();
  739.                 },
  740.             ])
  741.             ;
  742.         if ($this->isGranted("ROLE_DPO")) {
  743.             $form->add('manager'EntityType::class, [
  744.                 'attr' => array(
  745.                     'placeholder' => 'Délégué à la Protection des Données',
  746.                 ),
  747.                 'label' => 'Délégué à la Protection des Données',
  748.                 'expanded' => false,
  749.                 'multiple' => false,
  750.                 'required' => true,
  751.                 'class' => Manager::class,
  752.                 'choice_label' => function(Manager $manager) {
  753.                     return $manager->getFirstName().' '.$manager->getLastName().' ('.$manager->getCompanyName().')';
  754.                 },
  755.             ])
  756.                 ->add('managerDpo'CheckboxType::class, [
  757.                 'label' => "Délégué à la Protection des Données",
  758.                 'required' => false
  759.             ])
  760.                 ->add('lawyer'EntityType::class, [
  761.                     'attr' => array(
  762.                         'placeholder' => 'Juriste',
  763.                     ),
  764.                     'label' => 'Juriste',
  765.                     'expanded' => false,
  766.                     'multiple' => false,
  767.                     'required' => false,
  768.                     'class' => Manager::class,
  769.                     'choice_label' => function(Manager $manager) {
  770.                         return $manager->getFirstName().' '.$manager->getLastName().' ('.$manager->getCompanyName().')';
  771.                     },
  772.                 ]);
  773.         } else {
  774.             $form->add('managerDpo'CheckboxType::class, [
  775.                 'label' => "Vous êtes DPO pour ce client",
  776.                 'required' => false
  777.             ]);
  778.         }
  779.         $form['email']->setData($user->getEmail());
  780.         $form['enabled']->setData($user->getAccount()->isEnabled());
  781.         $form->handleRequest($request);
  782.         if ($form->isSubmitted() && $form->isValid()) {
  783.             $em $this->entityManager;
  784.             $user->getAccount()->setEnabled($form['enabled']->getData());
  785.             /**
  786.              * @var UploadedFile $file
  787.              */
  788.             $file $form->get('pictureFile')->getData();
  789.             if ($file != NULL) {
  790.                 $fileName $user->getId()."_".md5(uniqid()) . '.' $file->guessExtension();
  791.                 $file->move(
  792.                     $this->getParameter('pictures_directory'), $fileName
  793.                 );
  794.                 $user->setPicture($fileName);
  795.             }
  796.             $this->get('session')->getFlashBag()->add('success''Compte mis à jour');
  797.             $em->flush();
  798.             if (!$hasParentUser && $user->getParentUser()) {
  799.                 $parentTreatments $em->getRepository(Treatment::class)->findBy(["user" => $user->getParentUser(), "group" => true]);
  800.                 foreach ($parentTreatments as $parentTreatment) {
  801.                     $user->getGroupTreatments()->add($parentTreatment);
  802.                 }
  803.                 $em->flush();
  804.             } elseif ($hasParentUser && !$user->getParentUser()) {
  805.                 $user->getGroupTreatments()->clear();
  806.                 $em->flush();
  807.             }
  808.             $parentTreatments $em->getRepository(Treatment::class)->findBy(["user" => $user"group" => true]);
  809.             if ($form['childrenUsers']->getData()) {
  810.                 foreach ($form['childrenUsers']->getData() as $childUser) {
  811.                     $keyExistingChildUser array_search($childUser->getId(), $childUsersIds);
  812.                     if ($keyExistingChildUser !== FALSE) {
  813.                         unset($childUsersIds[$keyExistingChildUser]);
  814.                     } else {
  815.                         $tmpChildUser $em->getRepository(User::class)->find($childUser->getId());
  816.                         if ($tmpChildUser) {
  817.                             $tmpChildUser->setParentUser($user);
  818.                             $em->flush();
  819.                             foreach ($parentTreatments as $parentTreatment) {
  820.                                 if (!$tmpChildUser->getGroupTreatments()->contains($parentTreatment)) {
  821.                                     $tmpChildUser->getGroupTreatments()->add($parentTreatment);
  822.                                 }
  823.                             }
  824.                             $em->flush();
  825.                         }
  826.                     }
  827.                 }
  828.             }
  829.             foreach ($childUsersIds as $childUserId) {
  830.                 $tmpChildUser $em->getRepository(User::class)->find($childUserId);
  831.                 if ($tmpChildUser) {
  832.                     $tmpChildUser->setParentUser(null);
  833.                     $em->flush();
  834.                     foreach ($parentTreatments as $parentTreatment) {
  835.                         if ($tmpChildUser->getGroupTreatments()->contains($parentTreatment)) {
  836.                             $tmpChildUser->getGroupTreatments()->removeElement($parentTreatment);
  837.                         }
  838.                     }
  839.                     $em->flush();
  840.                 }
  841.             }
  842.             if ($r_email != $form['email']->getData()) {
  843.                 if (filter_var($form['email']->getData(), FILTER_VALIDATE_EMAIL)) {
  844.                     $other_account $em->getRepository(Account::class)->findOneBy(['email' => $form['email']->getData()]);
  845.                     if ($other_account && $other_account->getId() != $user->getAccount()->getId()) {
  846.                         $this->get('session')->getFlashBag()->add('danger''Cette adresse mail est déjà utilisée par un autre utilisateur');
  847.                     } else {
  848.                         $user->getAccount()->setEmail($form['email']->getData());
  849.                         $user->setEmail($form['email']->getData());
  850.                         $em->flush();
  851.                         $this->get('session')->getFlashBag()->add('success''Identifiant de connexion modifié');
  852.                     }
  853.                 } else {
  854.                     $this->get('session')->getFlashBag()->add('danger''Cette adresse mail n\'est pas valide');
  855.                 }
  856.             }
  857.             return $this->redirectToRoute("manager_users");
  858.         }
  859.         return $this->render('manager/users_edit.html.twig', [
  860.             "form" => $form->createView(),
  861.             "user" => $user
  862.         ]);
  863.     }
  864.     /**
  865.      * @Route("/users/{id}/delete", name="users_delete")
  866.      */
  867.     public function usersDeleteAction(Request $requestUser $user)
  868.     {
  869.         if (!$this->isGranted("ROLE_DPO")) {
  870.             //if ($user->getManager()->getId() != $this->getUser()->getManager()->getId()) {
  871.                 throw new NotFoundHttpException();
  872.             //}
  873.         }
  874.         $em $this->entityManager;
  875.         $em->remove($user);
  876.         $em->flush();
  877.         $this->get('session')->getFlashBag()->add('success''Compte client supprimé');
  878.         return $this->redirectToRoute("manager_users");
  879.     }
  880.     /**
  881.      * @Route("/users/{id}/print", name="users_print")
  882.      */
  883.     public function usersPrintAction(Request $requestUser $user)
  884.     {
  885.         $tcpdf = new TCPDFController('TCPDF');
  886.         $pdf $tcpdf->create('vertical'PDF_UNITPDF_PAGE_FORMATtrue'UTF-8'false);
  887.         $pdf->SetPrintHeader(false);
  888.         $pdf->SetAuthor('myDigitplace');
  889.         $pdf->SetTitle("Fiche société");
  890.         $pdf->AddPage('P''A4');
  891.         $html $this->renderView('manager/pdf/user.html.twig', [
  892.             "user" => $user
  893.         ]);
  894.         $filename 'fiche_societe';
  895.         $pdf->writeHTMLCell($w 0$h 0$x ''$y ''$html$border 0$ln 1$fill 0$reseth true$align ''$autopadding true);
  896.         return $pdf->Output($filename.".pdf",'I');
  897.     }
  898.     /**
  899.      * @Route("/documents", name="documents")
  900.      */
  901.     public function documentsAction(Request $requestFileUploadService $fileUploadService)
  902.     {
  903.         $documentsTypes $this->entityManager->getRepository(DocumentType::class)->findBy(["parent" => null]);
  904.         $typesChoices = [];
  905.         $types $this->entityManager->getRepository(DocumentType::class)->findBy(["parent" => null]);
  906.         foreach ($types as $type) {
  907.             $typesChoices[] = (object) ['value' => $type->getId(), 'label' => $type->getLibelle()];
  908.             foreach ($type->getChildren() as $child) {
  909.                 $typesChoices[] = (object) ['value' => $child->getId(), 'label' => "|----".$child->getLibelle()];
  910.             }
  911.         }
  912.         $form $this->createFormBuilder()
  913.             ->add('file'FileType::class, [
  914.                 'attr' => [
  915.                     'placeholder' => 'Fichier'
  916.                 ],
  917.                 'label' => 'Fichier',
  918.                 'required' => true,
  919.                 'mapped' => false
  920.             ])
  921.             ->add('name'TextType::class, [
  922.                 'attr' => [
  923.                     'placeholder' => 'Nom'
  924.                 ],
  925.                 'label' => 'Nom',
  926.                 'required' => false,
  927.                 'mapped' => false
  928.             ])
  929.             ->add('type'ChoiceType::class, [
  930.                 'attr' => array(
  931.                     'placeholder' => 'Type',
  932.                 ),
  933.                 'label' => 'Type',
  934.                 'expanded' => false,
  935.                 'multiple' => false,
  936.                 'required' => true,
  937.                 'mapped' => false,
  938.                 'choices' => $typesChoices,
  939.                 'choice_label' => function($entry) { return $entry!=null $entry->label ""; },
  940.                 'choice_value' => function($entry) { return $entry!=null $entry->value 0; },
  941.             ])->getForm();
  942.         $form->handleRequest($request);
  943.         if ($form->isSubmitted() && $form->isValid()) {
  944.             $em $this->entityManager;
  945.             /**
  946.              * @var UploadedFile $file
  947.              */
  948.             $file $form->get('file')->getData();
  949.             if ($file != NULL) {
  950.                 $fileName $this->getUser()->getManager()->getId()."_".md5(uniqid()) . '.' $file->guessExtension();
  951.                 $fileUploadService->uploadDocument($file$fileName);
  952.                 $docTitle $form['name']->getData()??$file->getClientOriginalName();
  953.                 $document = new Document();
  954.                 $document->setName($docTitle);
  955.                 $document->setFilename($fileName);
  956.                 $document->setManager($this->getUser()->getManager());
  957.                 if ($form['type']->getData()) {
  958.                     $type $em->getRepository(DocumentType::class)->find($form['type']->getData()->value);
  959.                     if ($type) {
  960.                         $document->setType($type);
  961.                     }
  962.                 }
  963.                 $em->persist($document);
  964.                 $em->flush();
  965.                 $this->get('session')->getFlashBag()->add('success''Nouveau document téléversé');
  966.             }
  967.             return $this->redirectToRoute("manager_documents");
  968.         }
  969.         return $this->render('manager/documents.html.twig', [
  970.             "documentsTypes" => $documentsTypes,
  971.             "form" => $form->createView(),
  972.         ]);
  973.     }
  974.     /**
  975.      * @Route("/documentstypes", name="documents_types")
  976.      */
  977.     public function documentsTypesAction(Request $request)
  978.     {
  979.         $documentsTypes $this->entityManager->getRepository(DocumentType::class)->findAll();
  980.         return $this->render('manager/documents_types.html.twig', [
  981.             "documentsTypes" => $documentsTypes,
  982.         ]);
  983.     }
  984.     /**
  985.      * @Route("/documentstypes/add", name="documents_types_add")
  986.      */
  987.     public function documentsTypesAddAction(Request $request)
  988.     {
  989.         $documentType = new DocumentType();
  990.         $form $this->createFormBuilder($documentType)
  991.             ->add("parent"EntityType::class, [
  992.                 'attr' => array(
  993.                     'placeholder' => 'Catégorie principale',
  994.                 ),
  995.                 'label' => 'Catégorie principale',
  996.                 'expanded' => false,
  997.                 'multiple' => false,
  998.                 'required' => true,
  999.                 'class' => DocumentType::class,
  1000.                 'query_builder' => function (EntityRepository $er) {
  1001.                     $qb $er->createQueryBuilder('dt');
  1002.                     return $qb->where($qb->expr()->isNull("dt.parent"))
  1003.                         ->orderBy('dt.libelle''ASC');
  1004.                 },
  1005.                 'choice_label' => function(DocumentType $documentType) {
  1006.                     return $documentType->getLibelle();
  1007.                 },
  1008.             ])
  1009.             ->add("libelle"TextType::class, [
  1010.                 "attr" => [
  1011.                     "placeholder" => "Nom"
  1012.                 ],
  1013.                 "label" => "Nom",
  1014.             ])
  1015.             ->add("libelle_en"TextType::class, [
  1016.                 "attr" => [
  1017.                     "placeholder" => "Nom EN (traduction)"
  1018.                 ],
  1019.                 "label" => "Nom EN (traduction)",
  1020.                 "mapped" => false,
  1021.             ])
  1022.             ->getForm();
  1023.         $form->handleRequest($request);
  1024.         if ($form->isSubmitted() && $form->isValid()) {
  1025.             $em $this->entityManager;
  1026.             $em->persist($documentType);
  1027.             $em->flush();
  1028.             $repository $em->getRepository('Gedmo\Translatable\Entity\Translation');
  1029.             $repository
  1030.                 ->translate($documentType'libelle''en'$form["libelle_en"]->getData())
  1031.             ;
  1032.             $em->flush();
  1033.             return $this->redirectToRoute("manager_documents_types");
  1034.         }
  1035.         return $this->render('manager/documents_types_add.html.twig', [
  1036.             "form" => $form->createView(),
  1037.         ]);
  1038.     }
  1039.     /**
  1040.      * @Route("/documentstypes/{id}/edit", name="documents_types_edit")
  1041.      */
  1042.     public function documentsTypesEditAction(Request $requestDocumentType $documentType)
  1043.     {
  1044.         $em $this->entityManager;
  1045.         $repository $em->getRepository('Gedmo\Translatable\Entity\Translation');
  1046.         $translations $repository->findTranslations($documentType);
  1047.         $form $this->createFormBuilder($documentType)
  1048.             ->add("parent"EntityType::class, [
  1049.                 'attr' => array(
  1050.                     'placeholder' => 'Catégorie principale',
  1051.                 ),
  1052.                 'label' => 'Catégorie principale',
  1053.                 'expanded' => false,
  1054.                 'multiple' => false,
  1055.                 'required' => true,
  1056.                 'class' => DocumentType::class,
  1057.                 'query_builder' => function (EntityRepository $er) {
  1058.                     $qb $er->createQueryBuilder('dt');
  1059.                     return $qb->where($qb->expr()->isNull("dt.parent"))
  1060.                         ->orderBy('dt.libelle''ASC');
  1061.                 },
  1062.                 'choice_label' => function(DocumentType $documentType) {
  1063.                     return $documentType->getLibelle();
  1064.                 },
  1065.             ])
  1066.             ->add("libelle"TextType::class, [
  1067.                 "attr" => [
  1068.                     "placeholder" => "Nom"
  1069.                 ],
  1070.                 "label" => "Nom",
  1071.             ])
  1072.             ->add("libelle_en"TextType::class, [
  1073.                 "attr" => [
  1074.                     "placeholder" => "Nom EN (traduction)"
  1075.                 ],
  1076.                 "label" => "Nom EN (traduction)",
  1077.                 "mapped" => false,
  1078.                 "data" => $translations["en"]["libelle"],
  1079.             ])
  1080.             ->getForm();
  1081.         $form->handleRequest($request);
  1082.         if ($form->isSubmitted() && $form->isValid()) {
  1083.             $em->persist($documentType);
  1084.             $em->flush();
  1085.             $repository
  1086.                 ->translate($documentType'libelle''en'$form["libelle_en"]->getData())
  1087.             ;
  1088.             $em->flush();
  1089.             return $this->redirectToRoute("manager_documents_types");
  1090.         }
  1091.         return $this->render('manager/documents_types_edit.html.twig', [
  1092.             "form" => $form->createView(),
  1093.         ]);
  1094.     }
  1095.     /**
  1096.      * @Route("/documentstypes/{id}/delete", name="documents_types_delete")
  1097.      */
  1098.     public function documentsTypesDeleteAction(Request $requestDocumentType $documentType)
  1099.     {
  1100.         $em $this->entityManager;
  1101.         $parentId $documentType->getParent()->getId();
  1102.         $parentType $em->getRepository(DocumentType::class)->find($parentId);
  1103.         $documents $em->getRepository(Document::class)->findBy(["type" => $documentType]);
  1104.         foreach ($documents as $document) {
  1105.             $document->setType($parentType);
  1106.             $em->flush();
  1107.         }
  1108.         $em->remove($documentType);
  1109.         $em->flush();
  1110.         return $this->redirectToRoute("manager_documents_types");
  1111.     }
  1112.     /**
  1113.      * @Route("/documents/{id}/edit", name="documents_edit")
  1114.      */
  1115.     public function documentsEditAction(Request $requestFileUploadService $fileUploadServiceDocument $document)
  1116.     {
  1117.         $em $this->entityManager;
  1118.         $repository $em->getRepository('Gedmo\Translatable\Entity\Translation');
  1119.         $translations $repository->findTranslations($document);
  1120.         $name $document->getName();
  1121.         $filename $document->getFilename();
  1122.         $name_en "";
  1123.         $filename_en "";
  1124.         if (isset($translations["en"])) {
  1125.             $name_en $translations["en"]["name"];
  1126.             $filename_en $translations["en"]["filename"];
  1127.         }
  1128.         $typesChoices = [];
  1129.         $types $this->entityManager->getRepository(DocumentType::class)->findBy(["parent" => null]);
  1130.         foreach ($types as $type) {
  1131.             $typesChoices[] = (object) ['value' => $type->getId(), 'label' => $type->getLibelle()];
  1132.             foreach ($type->getChildren() as $child) {
  1133.                 $typesChoices[] = (object) ['value' => $child->getId(), 'label' => "|----".$child->getLibelle()];
  1134.             }
  1135.         }
  1136.         $form $this->createFormBuilder()
  1137.             ->add('name'TextType::class, [
  1138.                 'attr' => [
  1139.                     'placeholder' => 'Nom'
  1140.                 ],
  1141.                 'label' => 'Nom',
  1142.                 'required' => false,
  1143.                 'mapped' => false,
  1144.                 "data" => $name,
  1145.             ])
  1146.             ->add('file'FileType::class, [
  1147.                 'attr' => [
  1148.                     'placeholder' => 'Fichier'
  1149.                 ],
  1150.                 'label' => 'Remplacer le fichier',
  1151.                 'required' => false,
  1152.                 'mapped' => false
  1153.             ])
  1154.             ->add('type'ChoiceType::class, [
  1155.                 'attr' => array(
  1156.                     'placeholder' => 'Type',
  1157.                 ),
  1158.                 'label' => 'Type',
  1159.                 'expanded' => false,
  1160.                 'multiple' => false,
  1161.                 'required' => true,
  1162.                 'mapped' => false,
  1163.                 'choices' => $typesChoices,
  1164.                 'choice_label' => function($entry) { return $entry!=null $entry->label ""; },
  1165.                 'choice_value' => function($entry) { return $entry!=null $entry->value 0; },
  1166.                 "data" => (object) ['value' => $document->getType()->getId()],
  1167.             ]);
  1168.         if ($document->isTranslatedEn()) {
  1169.             $form->add('name_en'TextType::class, [
  1170.                 'attr' => [
  1171.                     'placeholder' => ' EN (traduction)'
  1172.                 ],
  1173.                 'label' => ' EN (traduction)',
  1174.                 'required' => false,
  1175.                 'mapped' => false,
  1176.                 "data" => $name_en,
  1177.             ])
  1178.                 ->add('file_en'FileType::class, [
  1179.                     'attr' => [
  1180.                         'placeholder' => 'Fichier'
  1181.                     ],
  1182.                     'label' => 'Remplacer le fichier EN (traduction)',
  1183.                     'required' => false,
  1184.                     'mapped' => false
  1185.                 ]);
  1186.         }
  1187.         $form $form->getForm();
  1188.         $form->handleRequest($request);
  1189.         if ($form->isSubmitted() && $form->isValid()) {
  1190.             if ($form['type']->getData()) {
  1191.                 $type $em->getRepository(DocumentType::class)->find($form['type']->getData()->value);
  1192.                 if ($type) {
  1193.                     $document->setType($type);
  1194.                 }
  1195.             }
  1196.             $docTitle $form['name']->getData()??$filename;
  1197.             $document->setName($docTitle);
  1198.             $em->flush();
  1199.             /**
  1200.              * @var UploadedFile $file
  1201.              */
  1202.             $file $form->get('file')->getData();
  1203.             if ($file != NULL) {
  1204.                 $fileName $this->getUser()->getManager()->getId()."_".md5(uniqid()) . '.' $file->guessExtension();
  1205.                 $fileUploadService->uploadDocument($file$fileName);
  1206.                 $docTitle $form["name"]->getData()??$file->getClientOriginalName();
  1207.                 $document->setName($docTitle);
  1208.                 $document->setFilename($fileName);
  1209.                 $document->setManager($this->getUser()->getManager());
  1210.                 $em->flush();
  1211.             }
  1212.             if ($document->isTranslatedEn()) {
  1213.                 $repository
  1214.                     ->translate($document'name''en'$form["name_en"]->getData())
  1215.                 ;
  1216.                 $em->flush();
  1217.                 /**
  1218.                  * @var UploadedFile $file_en
  1219.                  */
  1220.                 $file_en $form->get('file_en')->getData();
  1221.                 if ($file_en != NULL) {
  1222.                     $fileName $this->getUser()->getManager()->getId()."_".md5(uniqid()) . '.' $file_en->guessExtension();
  1223.                     $fileUploadService->uploadDocument($file_en$fileName);
  1224.                     $docTitle $form["name_en"]->getData()??$file_en->getClientOriginalName();
  1225.                     $document->setName($docTitle);
  1226.                     $document->setFilename($fileName);
  1227.                     $repository
  1228.                         ->translate($document'name''en'$docTitle)
  1229.                         ->translate($document'filename''en'$fileName)
  1230.                     ;
  1231.                     $document->setManager($this->getUser()->getManager());
  1232.                     $em->flush();
  1233.                 }
  1234.             }
  1235.             return $this->redirectToRoute("manager_documents");
  1236.         }
  1237.         return $this->render('manager/documents_edit.html.twig', [
  1238.             "document" => $document,
  1239.             "form" => $form->createView(),
  1240.             "filename" => $filename,
  1241.             "filename_en" => $filename_en,
  1242.         ]);
  1243.     }
  1244.     /**
  1245.      * @Route("/documents/{id}/translate", name="documents_translate")
  1246.      */
  1247.     public function documentsTranslateAction(Request $requestDocument $document)
  1248.     {
  1249.         $form $this->createFormBuilder()
  1250.             ->add('documentFile'FileType::class, [
  1251.                 'attr' => [
  1252.                     'placeholder' => 'Document EN (traduction)'
  1253.                 ],
  1254.                 'label' => 'Document EN (traduction)',
  1255.                 'required' => true,
  1256.                 'mapped' => false
  1257.             ])
  1258.             ->add("libelle_en"TextType::class, [
  1259.                 "attr" => [
  1260.                     "placeholder" => "Nom EN (traduction)"
  1261.                 ],
  1262.                 "label" => "Nom EN (traduction)",
  1263.                 "mapped" => false,
  1264.             ])
  1265.             ->getForm();
  1266.         $form->handleRequest($request);
  1267.         $em $this->entityManager;
  1268.         if ($form->isSubmitted() && $form->isValid()) {
  1269.             /**
  1270.              * @var UploadedFile $file
  1271.              */
  1272.             $file $form->get('documentFile')->getData();
  1273.             if ($file != NULL) {
  1274.                 $fileName $this->getUser()->getManager()->getId()."_".md5(uniqid()) . '.' $file->guessExtension();
  1275.                 $file->move(
  1276.                     $this->getParameter('documents_directory'), $fileName
  1277.                 );
  1278.                 $docTitle $form['libelle_en']->getData()??$file->getClientOriginalName();
  1279.                 $repository $em->getRepository('Gedmo\Translatable\Entity\Translation');
  1280.                 $repository
  1281.                     ->translate($document'name''en'$docTitle)
  1282.                     ->translate($document'filename''en'$fileName)
  1283.                 ;
  1284.                 $document->setTranslatedEn(true);
  1285.                 $em->flush();
  1286.                 $this->get('session')->getFlashBag()->add('success''Nouveau document traduit');
  1287.             }
  1288.             return $this->redirectToRoute("manager_documents");
  1289.         }
  1290.         return $this->render('manager/documents_translate.html.twig', [
  1291.             "form" => $form->createView(),
  1292.         ]);
  1293.     }
  1294.     /**
  1295.      * @Route("/documents/{id}/delete", name="documents_delete")
  1296.      */
  1297.     public function documentsDeleteAction(Request $requestDocument $document)
  1298.     {
  1299.         $filePath $this->getParameter('documents_directory') . $document->getFilename();
  1300.         $em $this->getDoctrine()->getManager();
  1301.         $em->remove($document);
  1302.         $em->flush();
  1303.         unlink($filePath);
  1304.         $this->get('session')->getFlashBag()->add('success''Document supprimé');
  1305.         return $this->redirectToRoute("manager_documents");
  1306.     }
  1307.     /**
  1308.      * @Route("/switch/{id}", name="user_switch")
  1309.      */
  1310.     public function userSwitchAction(Request $requestUser $user)
  1311.     {
  1312.         if (!$this->isGranted("ROLE_DPO")) {
  1313.             if ($this->isGranted("ROLE_JURISTE") || $this->isGranted("ROLE_COMMERCE")) {
  1314.                 if ($this->isGranted("ROLE_JURISTE")) {
  1315.                     if ($user->getManager()->getId() != $this->getUser()->getManager()->getId()
  1316.                         && ($user->getLawyer() && $user->getLawyer()->getId() != $this->getUser()->getManager()->getId())) {
  1317.                         throw new NotFoundHttpException();
  1318.                     }
  1319.                 } else {
  1320.                     if (!$user->isDemo()) {
  1321.                         throw new NotFoundHttpException();
  1322.                     }
  1323.                 }
  1324.             } else {
  1325.                 throw new NotFoundHttpException();
  1326.             }
  1327.         }
  1328.         return $this->redirectToRoute("default_homepage", ['_switch_user' =>  $user->getAccount()->getEmail()]);
  1329.     }
  1330.     /**
  1331.      * @Route("/partners", name="partners")
  1332.      */
  1333.     public function partnersAction(Request $request)
  1334.     {
  1335.         if (!$this->isGranted("ROLE_DPO")) {
  1336.             throw new NotFoundHttpException();
  1337.         }
  1338.         $partners $this->entityManager->getRepository(Partner::class)->findAll();
  1339.         return $this->render('manager/partners.html.twig', [
  1340.             "partners" => $partners
  1341.         ]);
  1342.     }
  1343.     /**
  1344.      * @Route("/partners/add", name="partners_add")
  1345.      */
  1346.     public function partnersAddAction(Request $requestFileUploadService $fileUploadService)
  1347.     {
  1348.         if (!$this->isGranted("ROLE_DPO")) {
  1349.             throw new NotFoundHttpException();
  1350.         }
  1351.         $partner = new Partner();
  1352.         $form $this->createForm(PartnerType::class, $partner);
  1353.         $form->handleRequest($request);
  1354.         if ($form->isSubmitted() && $form->isValid()) {
  1355.             $em $this->entityManager;
  1356.             $em->persist($partner);
  1357.             $em->flush();
  1358.             /**
  1359.              * @var UploadedFile $file
  1360.              */
  1361.             $file $form->get('pictureFile')->getData();
  1362.             if ($file != NULL) {
  1363.                 $fileName $partner->getId()."_".md5(uniqid()) . '.' $file->guessExtension();
  1364.                 $fileUploadService->uploadPicture($file$fileName);
  1365.                 $partner->setPicture($fileName);
  1366.                 $em->flush();
  1367.             }
  1368.             $this->get('session')->getFlashBag()->add('success''Nouveau partenaire ajouté');
  1369.             return $this->redirectToRoute("manager_partners");
  1370.         }
  1371.         return $this->render('manager/partners_add.html.twig', [
  1372.             "form" => $form->createView(),
  1373.         ]);
  1374.     }
  1375.     /**
  1376.      * @Route("/partners/{id}/edit", name="partners_edit")
  1377.      */
  1378.     public function partnersEditAction(Request $requestFileUploadService $fileUploadServicePartner $partner)
  1379.     {
  1380.         if (!$this->isGranted("ROLE_DPO")) {
  1381.             throw new NotFoundHttpException();
  1382.         }
  1383.         $form $this->createForm(PartnerType::class, $partner);
  1384.         $form->handleRequest($request);
  1385.         if ($form->isSubmitted() && $form->isValid()) {
  1386.             $em $this->entityManager;
  1387.             $em->flush();
  1388.             /**
  1389.              * @var UploadedFile $file
  1390.              */
  1391.             $file $form->get('pictureFile')->getData();
  1392.             if ($file != NULL) {
  1393.                 $fileName $partner->getId()."_".md5(uniqid()) . '.' $file->guessExtension();
  1394.                 $fileUploadService->uploadPicture($file$fileName);
  1395.                 $partner->setPicture($fileName);
  1396.                 $em->flush();
  1397.             }
  1398.             $this->get('session')->getFlashBag()->add('success''Partenaire mis à jour');
  1399.             return $this->redirectToRoute("manager_partners");
  1400.         }
  1401.         return $this->render('manager/partners_edit.html.twig', [
  1402.             "form" => $form->createView(),
  1403.             "partner" => $partner
  1404.         ]);
  1405.     }
  1406.     /**
  1407.      * @Route("/partners/{id}/delete", name="partners_delete")
  1408.      */
  1409.     public function partnersDeleteAction(Request $requestPartner $partner)
  1410.     {
  1411.         if (!$this->isGranted("ROLE_DPO")) {
  1412.             throw new NotFoundHttpException();
  1413.         }
  1414.         $em $this->entityManager;
  1415.         $em->remove($partner);
  1416.         $em->flush();
  1417.         $this->get('session')->getFlashBag()->add('success''Partenaire supprimé');
  1418.         return $this->redirectToRoute("manager_partners");
  1419.     }
  1420.     /**
  1421.      * @Route("/systems", name="systems")
  1422.      */
  1423.     public function systemsAction(Request $request)
  1424.     {
  1425.         // Fetch systems
  1426.         $systemsQuery $this->entityManager->getRepository(SystemStd::class)->findAll();
  1427.     
  1428.         // Define system categories (unchanged)
  1429.         $systems = [
  1430.             "computing" => [
  1431.                 "network" => [], "security" => [], "administration" => [], "device" => [], "software" => [], "server" => []
  1432.             ],
  1433.             "physical" => [
  1434.                 "partitioning" => [], "information" => []
  1435.             ],
  1436.             "action" => [
  1437.                 "minimization" => [], "anonymization" => [], "pseudonymization" => [], "sensitization" => [], "supervision" => [], "destruction" => []
  1438.             ],
  1439.             "supplier" => [
  1440.                 "supplier" => []
  1441.             ]
  1442.         ];
  1443.     
  1444.         // Serialize systems for frontend (unchanged)
  1445.         $systemsJs = [];
  1446.         $serializer = new Serializer([new ObjectNormalizer()], [new JsonEncoder()]);
  1447.         foreach ($systemsQuery as $system) {
  1448.             $systems[$system->getType()][$system->getSubtype()][] = $system;
  1449.             $systemsJs[$system->getId()] = json_decode($serializer->serialize($system'json', [
  1450.                 "attributes" => ['id''name''data''type''subtype'],
  1451.                 "circular_reference_handler" => fn($object) => $object->getId()
  1452.             ]), true);
  1453.         }
  1454.     
  1455.         // Define standard system categories (unchanged)
  1456.         $systemsStd = [
  1457.             "computing" =>  [
  1458.                 "network" => ["label" => "Réseau""items" => [], "icon" => "fa-print"],
  1459.                 "security" => ["label" => "Sécurité""items" => [], "icon" => "fa-shield"],
  1460.                 "administration" => ["label" => "Administration""items" => [], "icon" => "fa-users"],
  1461.                 "device" => ["label" => "Périphérique""items" => [], "icon" => "fa-desktop"],
  1462.                 "software" => ["label" => "Logiciel""items" => [], "icon" => "fa-window-maximize"],
  1463.                 "server" => ["label" => "Serveur""items" => [], "icon" => "fa-server"],
  1464.             ],
  1465.             "physical" => [
  1466.                 "partitioning" => ["label" => "Cloisonnement""items" => [], "icon" => "fa-home"],
  1467.                 "information" => ["label" => "Information""items" => [], "icon" => "fa-lightbulb-o"],
  1468.             ],
  1469.             "action" => [
  1470.                 "minimization" => ["label" => "Minimisation""items" => [], "icon" => "fa-user"],
  1471.                 "anonymization" => ["label" => "Anonymisation""items" => [], "icon" => "fa-user-secret"],
  1472.                 "pseudonymization" => ["label" => "Pseudonymisation""items" => [], "icon" => "fa-question-circle-o"],
  1473.                 "sensitization" => ["label" => "Sensibilisation""items" => [], "icon" => "fa-exclamation-triangle"],
  1474.                 "supervision" => ["label" => "Contrôle""items" => [], "icon" => "fa-search"],
  1475.                 "destruction" => ["label" => "Destruction""items" => [], "icon" => "fa-trash-o"],
  1476.             ],
  1477.             "supplier" => [
  1478.                 "supplier" => ["label" => "Prestataires""items" => [], "icon" => "fa-calendar-check-o"],
  1479.             ]
  1480.         ];
  1481.         $addedType $request->query->get('addedType');
  1482.         $addedSubtype $request->query->get('addedSubtype');
  1483.         // Build the mind map with meta info
  1484.         $mindMap = [
  1485.             "meta" => [
  1486.                 "name" => "Cartographie SI",
  1487.                 "author" => "myDigitplace",
  1488.                 "version" => "1.0"
  1489.             ],
  1490.             "format" => "node_tree",
  1491.             "data" => [
  1492.                 "id" => "root",
  1493.                 "topic" =>"
  1494.                         <div class='border border1'><div class='circle'></div></div>
  1495.                         <div class='border border2'><div class='circle'></div></div>
  1496.                         <div class='border border3'><div class='circle'></div></div>
  1497.                         <div class='border border4'><div class='circle'></div></div>
  1498.                         <div class='node-content'>
  1499.                             <svg xmlns='http://www.w3.org/2000/svg' width='40' height='40' viewBox='0 0 16 16'><path fill='currentColor' fill-rule='evenodd' d='M6.146 2.153a.5.5 0 0 1 .354-.146h3a.5.5 0 0 1 .5.5V4.51a.5.5 0 0 1-.5.5H8.497V7h4.5a.5.5 0 0 1 .5.5V10H14.5a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 1 .5-.5h.997V8h-4v2H9.5a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 1 .5-.5h.997V8h-4v2H4.5a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 1 .5-.5h.997V7.5a.5.5 0 0 1 .5-.5h4.5V5.01H6.5a.5.5 0 0 1-.5-.5V2.508a.5.5 0 0 1 .146-.354' clip-rule='evenodd'/></svg>
  1500.                             <div class='text-wrapper'>Système d'information</div>
  1501.                         </div>",
  1502.                 "expanded" => true,
  1503.                 "children" => []
  1504.             ]
  1505.         ];
  1506.     
  1507.         // Custom French names for nodes
  1508.         $customNames = [
  1509.             "computing" => "Informatique",
  1510.             "physical" => "Physique",
  1511.             "action" => "Action",
  1512.             "supplier" => "Prestataires de SI"
  1513.         ];
  1514.     
  1515.         foreach ($systemsStd as $type => $categories) {
  1516.             $node = [
  1517.                 "id" => $type,
  1518.                 "topic" => "
  1519.                 <div class='border border1'><div class='circle'></div></div>
  1520.                 <div class='border border2'><div class='circle'></div></div>
  1521.                 <div class='border border3'><div class='circle'></div></div>
  1522.                 <div class='border border4'><div class='circle'></div></div>
  1523.                 <div class='node-content'>
  1524.                     <i class='fa " $categories[array_key_first($categories)]['icon'] . "'></i>
  1525.                     <div class='text-wrapper'>" . ($customNames[$type] ?? ucfirst($type)) . "</div>
  1526.                 </div> ",
  1527.                 "expanded" => ($type === $addedType),
  1528.                 "children" => []
  1529.             ];
  1530.     
  1531.             foreach ($categories as $subtype => $details) {
  1532.                 $subnode = [
  1533.                     "id" => "{$type}_{$subtype}",
  1534.                     "topic" =>"
  1535.                             <div class='border border1'><div class='circle'></div></div>
  1536.                             <div class='border border2'><div class='circle'></div></div>
  1537.                             <div class='border border3'><div class='circle'></div></div>
  1538.                             <div class='border border4'><div class='circle'></div></div>
  1539.                             <div class='node-content'>
  1540.                                 <i class='fa " $details["icon"] . "'></i>
  1541.                                 <div class='text-wrapper'>" $details["label"] . "</div>
  1542.                             </div> <span class='node-2-actions'><a href=\"".$this->generateUrl("manager_systems_add")."?type=".$type."&subtype=".$subtype."\" class=\"btn btn-sm btn-rounded-circle btn-primary\"><i class=\"mdi mdi-plus\"></i></a></span>",
  1543.                     "expanded" => ($type === $addedType && $subtype === $addedSubtype),
  1544.                     "children" => []
  1545.                 ];
  1546.     
  1547.                 foreach ($systems[$type][$subtype] as $item) {
  1548.     $subnode["children"][] = [
  1549.         "id" => $item->getId(),
  1550.         "topic" => "
  1551.                 <div class='border border1'><div class='circle'></div></div>
  1552.                 <div class='border border2'><div class='circle'></div></div>
  1553.                 <div class='border border3'><div class='circle'></div></div>
  1554.                 <div class='border border4'><div class='circle'></div></div>
  1555.                 <div class='node-content'>  
  1556.                     <div class='text-wrapper'>" htmlspecialchars($item->getName(), ENT_QUOTES'UTF-8') . "</div>
  1557.                 </div>
  1558.                 <span class='node-3-actions options'>
  1559.                     <a href=\"" $this->generateUrl("manager_systems_edit", ["id" => $item->getId()]) . "\" class=\"btn edit my-1 mr-1\">
  1560.                         <i class=\"mdi mdi-circle-edit-outline\"></i>
  1561.                     </a>
  1562.                     <a href=\"" $this->generateUrl("manager_systems_delete", ["id" => $item->getId()]) . "\" class=\"btn delete my-1\" onclick=\"return confirm('Confirmer la suppression de cet élément ?');\">
  1563.                         <i class=\"mdi mdi-close\"></i>
  1564.                     </a>
  1565.                 </span>
  1566.             ",
  1567.             "attr" => [
  1568.                             "class" => "jmnode-level-3",
  1569.                             "onclick" => "openModalInfo(".$item->getId().")",
  1570.                         ]
  1571.     ];
  1572. }
  1573.                 
  1574.     
  1575.                 $node["children"][] = $subnode;
  1576.             }
  1577.     
  1578.             $mindMap["data"]["children"][] = $node;
  1579.         }
  1580.     
  1581.         return $this->render('manager/systems.html.twig', [
  1582.             "systems" => $systems,
  1583.             "mindMap" => $mindMap,
  1584.             "mindMapHeight" => 12 * (38 1.5),
  1585.             "systemsJs" => $systemsJs
  1586.         ]);
  1587.     }
  1588.     
  1589.     
  1590.     /**
  1591.      * @Route("/systems/{id}/translate/{_locale}", name="systems_translate")
  1592.      */
  1593.     public function systemsTranslateAction(Request $requestSystemStd $system)
  1594.     {
  1595.         $em $this->entityManager;
  1596.         $repository $em->getRepository('Gedmo\Translatable\Entity\Translation');
  1597.         $translations $repository->findTranslations($system);
  1598.         if (!isset($translations[$request->get("_locale")])) {
  1599.             return $this->redirectToRoute("manager_systems_gen_translate", ["id" => $system->getId(), "_locale" => "fr""locale" => $request->get("_locale")]);
  1600.         }
  1601.         $system $em->find(SystemStd::class, $request->get("id"));
  1602.         $types = [
  1603.             "computing" => [
  1604.                 "network" => 4,
  1605.                 "security" => 4,
  1606.                 "administration" => 4,
  1607.                 "device" => 4,
  1608.                 "software" => 4,
  1609.                 "server" => 4,
  1610.             ],
  1611.             "physical" => [
  1612.                 "partitioning" => 2,
  1613.                 "information" => 2,
  1614.             ],
  1615.             "action" => [
  1616.                 "minimization" => 2,
  1617.                 "anonymization" => 2,
  1618.                 "pseudonymization" => 2,
  1619.                 "sensitization" => 2,
  1620.                 "supervision" => 2,
  1621.                 "destruction" => 2,
  1622.             ],
  1623.             "supplier" => [
  1624.                 "supplier" => 1
  1625.             ]
  1626.         ];
  1627.         $form $this->createForm(SystemStdTranslateType::class, $system);
  1628.         switch ($system->getSubtype()) {
  1629.             case "network":
  1630.                 $form->add('field1'ChoiceType::class, [
  1631.                     'attr' => [
  1632.                         'placeholder' => 'Type'
  1633.                     ],
  1634.                     'placeholder' => 'Type',
  1635.                     'label' => 'Type',
  1636.                     'choices' => [
  1637.                         "Filaire" => "Filaire",
  1638.                         "Sans-fil" => "Sans-fil",
  1639.                     ],
  1640.                     'data' => isset($system->getData()[0])?$system->getData()[0]["value"]:null,
  1641.                     'required' => false,
  1642.                     'mapped' => false
  1643.                 ])
  1644.                     ->add('field2'TextareaType::class, [
  1645.                         'attr' => [
  1646.                             'placeholder' => 'Informations complémentaires'
  1647.                         ],
  1648.                         'label' => 'Informations complémentaires',
  1649.                         'data' => isset($system->getData()[1])?$system->getData()[1]["value"]:null,
  1650.                         'required' => false,
  1651.                         'mapped' => false
  1652.                     ])
  1653.                     ->add('field3'ChoiceType::class, [
  1654.                         'attr' => [
  1655.                             'placeholder' => 'Type'
  1656.                         ],
  1657.                         'placeholder' => 'Type',
  1658.                         'label' => 'Si Wifi, sélectionnez le type',
  1659.                         'choices' => [
  1660.                             "Privé" => "Privé",
  1661.                             "Public" => "Public",
  1662.                         ],
  1663.                         'data' => isset($system->getData()[2])?$system->getData()[2]["value"]:null,
  1664.                         'required' => false,
  1665.                         'mapped' => false
  1666.                     ])
  1667.                     ->add('field4'TextType::class, [
  1668.                         'attr' => [
  1669.                             'placeholder' => 'Protocole'
  1670.                         ],
  1671.                         'label' => 'Si Wifi, quel protocole ?',
  1672.                         'data' => isset($system->getData()[3])?$system->getData()[3]["value"]:null,
  1673.                         'required' => false,
  1674.                         'mapped' => false
  1675.                     ])
  1676.                 ;
  1677.                 break;
  1678.             case "security":
  1679.             case "administration":
  1680.             case "device":
  1681.             case "software":
  1682.             case "server":
  1683.                 $form->add('field1'TextType::class, [
  1684.                     'attr' => [
  1685.                         'placeholder' => 'Type'
  1686.                     ],
  1687.                     'label' => 'Type',
  1688.                     'data' => isset($system->getData()[0])?$system->getData()[0]["value"]:null,
  1689.                     'required' => false,
  1690.                     'mapped' => false
  1691.                 ])
  1692.                     ->add('field2'TextareaType::class, [
  1693.                         'attr' => [
  1694.                             'placeholder' => 'Informations complémentaires'
  1695.                         ],
  1696.                         'label' => 'Informations complémentaires',
  1697.                         'data' => isset($system->getData()[1])?$system->getData()[1]["value"]:null,
  1698.                         'required' => false,
  1699.                         'mapped' => false
  1700.                     ])
  1701.                     ->add('field3'TextType::class, [
  1702.                         'attr' => [
  1703.                             'placeholder' => '__/__/____',
  1704.                             'data-mask' => '00/00/0000',
  1705.                             'data-mask-clearifnotmatch' => 'true'
  1706.                         ],
  1707.                         'label' => 'Date d\'achat',
  1708.                         'data' => isset($system->getData()[2])?$system->getData()[2]["value"]:null,
  1709.                         'required' => false,
  1710.                         'mapped' => false
  1711.                     ])
  1712.                     ->add('field4'TextType::class, [
  1713.                         'attr' => [
  1714.                             'placeholder' => 'N° d’identification'
  1715.                         ],
  1716.                         'label' => 'N° d’identification',
  1717.                         'data' => isset($system->getData()[3])?$system->getData()[3]["value"]:null,
  1718.                         'required' => false,
  1719.                         'mapped' => false
  1720.                     ]);
  1721.                 break;
  1722.             case "partitioning":
  1723.             case "minimization":
  1724.             case "anonymization":
  1725.             case "pseudonymization":
  1726.             case "sensitization":
  1727.             case "information":
  1728.             case "supervision":
  1729.             case "destruction":
  1730.                 $form->add('field1'TextareaType::class, [
  1731.                     'attr' => [
  1732.                         'placeholder' => 'Description'
  1733.                     ],
  1734.                     'label' => 'Description',
  1735.                     'data' => isset($system->getData()[0])?$system->getData()[0]["value"]:null,
  1736.                     'required' => false,
  1737.                     'mapped' => false
  1738.                 ])
  1739.                     ->add('field2'TextareaType::class, [
  1740.                         'attr' => [
  1741.                             'placeholder' => 'Informations complémentaires'
  1742.                         ],
  1743.                         'label' => 'Informations complémentaires',
  1744.                         'data' => isset($system->getData()[1])?$system->getData()[1]["value"]:null,
  1745.                         'required' => false,
  1746.                         'mapped' => false
  1747.                     ]);
  1748.                 break;
  1749.             case "supplier":
  1750.                 $form->add('field1'TextType::class, [
  1751.                     'attr' => [
  1752.                         'placeholder' => 'Type'
  1753.                     ],
  1754.                     'label' => 'Type',
  1755.                     'data' => isset($system->getData()[0])?$system->getData()[0]["value"]:null,
  1756.                     'required' => false,
  1757.                     'mapped' => false
  1758.                 ]);
  1759.                 break;
  1760.             default:
  1761.                 throw new NotFoundHttpException();
  1762.         }
  1763.         $form->handleRequest($request);
  1764.         if ($form->isSubmitted() && $form->isValid()) {
  1765.             $data = [];
  1766.             switch ($system->getSubtype()) {
  1767.                 case "network":
  1768.                     $data[] = [
  1769.                         "title" => 'Type',
  1770.                         "value" => $form['field1']->getData()
  1771.                     ];
  1772.                     $data[] = [
  1773.                         "title" => 'Informations complémentaires',
  1774.                         "value" => $form['field2']->getData()
  1775.                     ];
  1776.                     $data[] = [
  1777.                         "title" => 'Type de Wifi',
  1778.                         "value" => $form['field3']->getData()
  1779.                     ];
  1780.                     $data[] = [
  1781.                         "title" => 'Protocole Wifi',
  1782.                         "value" => $form['field4']->getData()
  1783.                     ];
  1784.                     ;
  1785.                     break;
  1786.                 case "security":
  1787.                 case "administration":
  1788.                 case "device":
  1789.                 case "software":
  1790.                 case "server":
  1791.                     $data[] = [
  1792.                         "title" => 'Type',
  1793.                         "value" => $form['field1']->getData()
  1794.                     ];
  1795.                     $data[] = [
  1796.                         "title" => 'Informations complémentaires',
  1797.                         "value" => $form['field2']->getData()
  1798.                     ];
  1799.                     $data[] = [
  1800.                         "title" => 'Date d\'achat',
  1801.                         "value" => $form['field3']->getData()
  1802.                     ];
  1803.                     $data[] = [
  1804.                         "title" => 'N° d’identification',
  1805.                         "value" => $form['field4']->getData()
  1806.                     ];
  1807.                     break;
  1808.                 case "partitioning":
  1809.                 case "minimization":
  1810.                 case "anonymization":
  1811.                 case "pseudonymization":
  1812.                 case "sensitization":
  1813.                 case "information":
  1814.                 case "supervision":
  1815.                 case "destruction":
  1816.                     $data[] = [
  1817.                         "title" => 'Description',
  1818.                         "value" => $form['field1']->getData()
  1819.                     ];
  1820.                     $data[] = [
  1821.                         "title" => 'Informations complémentaires',
  1822.                         "value" => $form['field2']->getData()
  1823.                     ];
  1824.                     break;
  1825.                 case "supplier":
  1826.                     $data[] = [
  1827.                         "title" => 'Type',
  1828.                         "value" => $form['field1']->getData()
  1829.                     ];
  1830.                     break;
  1831.                 default:
  1832.                     throw new NotFoundHttpException();
  1833.             }
  1834.             $system->setData($data);
  1835.             $em->persist($system);
  1836.             $em->flush();
  1837.             $this->get('session')->getFlashBag()->add('success''Traduction de l\'élément de cartographie mis à jour');
  1838.             return $this->redirectToRoute("manager_systems");
  1839.         }
  1840.         return $this->render('manager/systems_translate.html.twig', [
  1841.             "form" => $form->createView(),
  1842.             "system" => $system,
  1843.             "fields" => $types[$system->getType()][$system->getSubtype()]
  1844.         ]);
  1845.     }
  1846.     /**
  1847.      * @Route("/systems/{id}/gentranslate/{locale}_{_locale}", name="systems_gen_translate")
  1848.      */
  1849.     public function systemsGanTranslateAction(Request $requestSystemStd $system$locale$_locale)
  1850.     {
  1851.         $em $this->entityManager;
  1852.         $repository $em->getRepository('Gedmo\Translatable\Entity\Translation');
  1853.         $translations $repository->findTranslations($system);
  1854.         if (!isset($translations[$locale])) {
  1855.             $repository
  1856.                 ->translate($system'name'$locale$system->getName())
  1857.                 ->translate($system'data'$locale$system->getData())
  1858.             ;
  1859.             $em->persist($system);
  1860.             $em->flush();
  1861.             return $this->redirectToRoute("manager_systems_translate", ["id" => $system->getId(), "_locale" => $locale]);
  1862.         }
  1863.         return $this->redirectToRoute("manager_systems");
  1864.     }
  1865.     /**
  1866.      * @Route("/systems/export", name="systems_export")
  1867.      */
  1868.     public function systemsExportAction(Request $request)
  1869.     {
  1870.         $systemsQuery $this->entityManager->getRepository(SystemStd::class)->findAll();
  1871.         $systems = [
  1872.             "computing" => [
  1873.                 "network" => [],
  1874.                 "security" => [],
  1875.                 "administration" => [],
  1876.                 "device" => [],
  1877.                 "software" => [],
  1878.                 "server" => [],
  1879.             ],
  1880.             "physical" => [
  1881.                 "partitioning" => [],
  1882.                 "information" => [],
  1883.             ],
  1884.             "action" => [
  1885.                 "minimization" => [],
  1886.                 "anonymization" => [],
  1887.                 "pseudonymization" => [],
  1888.                 "sensitization" => [],
  1889.                 "supervision" => [],
  1890.                 "destruction" => [],
  1891.             ],
  1892.             "supplier" => [
  1893.                 "supplier" => []
  1894.             ]
  1895.         ];
  1896.         foreach ($systemsQuery as $system) {
  1897.             $systems[$system->getType()][$system->getSubtype()][] = $system;
  1898.         }
  1899.         $pdf = new MyPdf('vertical'PDF_UNITPDF_PAGE_FORMATtrue'UTF-8'false);
  1900.         $pdf->SetAuthor('myDigitplace');
  1901.         $pdf->SetTitle("Cartographie du SI");
  1902.         $pdf->SetMargins(10,22,10true);
  1903.         $pdf->SetAutoPageBreak(TRUE35);
  1904.         $pdf->AddPage('L''A4');
  1905.         $html $this->renderView('manager/pdf/systems.html.twig', [
  1906.             "systems" => $systems
  1907.         ]);
  1908.         $filename 'Cartographie_du_SI';
  1909.         $pdf->writeHTMLCell($w 0$h 0$x ''$y ''$html$border 0$ln 1$fill 0$reseth true$align ''$autopadding true);
  1910.         return $pdf->Output($filename.".pdf",'I');
  1911.     }
  1912.     /**
  1913.      * @Route("/systems/export/{type}", name="systems_export_excel")
  1914.      */
  1915.     public function systemsExportExcelAction(Request $request$type)
  1916.     {
  1917.         $systemsQuery $this->entityManager->getRepository(SystemStd::class)->findAll();
  1918.         $systems = [
  1919.             "computing" => [
  1920.                 "network" => [],
  1921.                 "security" => [],
  1922.                 "administration" => [],
  1923.                 "device" => [],
  1924.                 "software" => [],
  1925.                 "server" => [],
  1926.             ],
  1927.             "physical" => [
  1928.                 "partitioning" => [],
  1929.                 "information" => [],
  1930.             ],
  1931.             "action" => [
  1932.                 "minimization" => [],
  1933.                 "anonymization" => [],
  1934.                 "pseudonymization" => [],
  1935.                 "sensitization" => [],
  1936.                 "supervision" => [],
  1937.                 "destruction" => [],
  1938.             ],
  1939.             "supplier" => [
  1940.                 "supplier" => []
  1941.             ]
  1942.         ];
  1943.         foreach ($systemsQuery as $system) {
  1944.             $systems[$system->getType()][$system->getSubtype()][] = $system;
  1945.         }
  1946.         $spreadsheet = new Spreadsheet();
  1947.         $translateSubtypes = [
  1948.             "network" => "Réseau",
  1949.             "security" => "Sécurité",
  1950.             "administration" => "Administration",
  1951.             "device" => "Périphérique",
  1952.             "software" => "Logiciel",
  1953.             "server" => "Serveur",
  1954.             "partitioning" => "Cloisonnement",
  1955.             "minimization" => "Minimisation",
  1956.             "anonymization" => "Anonymisation",
  1957.             "pseudonymization" => "Pseudonymisation",
  1958.             "sensitization" => "Sensibilisation et formation",
  1959.             "information" => "Information",
  1960.             "supervision" => "Contrôle et qualité",
  1961.             "destruction" => "Destruction et suppression",
  1962.             "supplier" => "Prestataires du SI"
  1963.         ];
  1964.         $i 0;
  1965.         foreach ($systems[$type] as $subtype => $systems) {
  1966.             $i++;
  1967.             $roomsWorkSheet = new Worksheet($spreadsheet$translateSubtypes[$subtype]);
  1968.             $spreadsheet->addSheet($roomsWorkSheet$i);
  1969.             $spreadsheet->setActiveSheetIndex($i);
  1970.             $sheet $spreadsheet->getActiveSheet();
  1971.             $sheet->setCellValue('A1''ID');
  1972.             $sheet->setCellValue('B1''Nom');
  1973.             switch ($subtype) {
  1974.                 case "network":
  1975.                     $sheet->setCellValue('C1''Type');
  1976.                     $sheet->setCellValue('D1''Informations complémentaires');
  1977.                     $sheet->setCellValue('E1''Type de Wifi');
  1978.                     $sheet->setCellValue('F1''Protocole Wifi');
  1979.                     break;
  1980.                 case "security":
  1981.                 case "administration":
  1982.                 case "device":
  1983.                 case "software":
  1984.                 case "server":
  1985.                     $sheet->setCellValue('C1''Type');
  1986.                     $sheet->setCellValue('D1''Informations complémentaires');
  1987.                     $sheet->setCellValue('E1''Date d\'achat');
  1988.                     $sheet->setCellValue('F1''N° d\'identification');
  1989.                     break;
  1990.                 case "partitioning":
  1991.                 case "minimization":
  1992.                 case "anonymization":
  1993.                 case "pseudonymization":
  1994.                 case "sensitization":
  1995.                 case "information":
  1996.                 case "supervision":
  1997.                 case "destruction":
  1998.                     $sheet->setCellValue('C1''Description');
  1999.                     $sheet->setCellValue('D1''Informations complémentaires');
  2000.                     break;
  2001.                 case "supplier":
  2002.                     $sheet->setCellValue('C1''Type');
  2003.                     break;
  2004.                 default:
  2005.                     throw new NotFoundHttpException();
  2006.             }
  2007.             $j 1;
  2008.             foreach ($systems as $system) {
  2009.                 $j++;
  2010.                 $sheet->setCellValue('A'.$j$system->getId());
  2011.                 $sheet->setCellValue('B'.$j$system->getName());
  2012.                 switch ($subtype) {
  2013.                     case "network":
  2014.                         $sheet->setCellValue('C'.$j, isset($system->getData()[0])?$system->getData()[0]["value"]:null);
  2015.                         $sheet->setCellValue('D'.$j, isset($system->getData()[1])?$system->getData()[1]["value"]:null);
  2016.                         $sheet->setCellValue('E'.$j, isset($system->getData()[2])?$system->getData()[2]["value"]:null);
  2017.                         $sheet->setCellValue('F'.$j, isset($system->getData()[3])?$system->getData()[3]["value"]:null);
  2018.                         break;
  2019.                     case "security":
  2020.                     case "administration":
  2021.                     case "device":
  2022.                     case "software":
  2023.                     case "server":
  2024.                         $sheet->setCellValue('C'.$j, isset($system->getData()[0])?$system->getData()[0]["value"]:null);
  2025.                         $sheet->setCellValue('D'.$j, isset($system->getData()[1])?$system->getData()[1]["value"]:null);
  2026.                         $sheet->setCellValue('E'.$j, isset($system->getData()[2])?$system->getData()[2]["value"]:null);
  2027.                         $sheet->setCellValue('F'.$j, isset($system->getData()[3])?$system->getData()[3]["value"]:null);
  2028.                         break;
  2029.                     case "partitioning":
  2030.                     case "minimization":
  2031.                     case "anonymization":
  2032.                     case "pseudonymization":
  2033.                     case "sensitization":
  2034.                     case "information":
  2035.                     case "supervision":
  2036.                     case "destruction":
  2037.                         $sheet->setCellValue('C'.$j, isset($system->getData()[0])?$system->getData()[0]["value"]:null);
  2038.                         $sheet->setCellValue('D'.$j, isset($system->getData()[1])?$system->getData()[1]["value"]:null);
  2039.                         break;
  2040.                     case "supplier":
  2041.                         $sheet->setCellValue('C'.$j, isset($system->getData()[0])?$system->getData()[0]["value"]:null);
  2042.                         break;
  2043.                     default:
  2044.                         throw new NotFoundHttpException();
  2045.                 }
  2046.             }
  2047.         }
  2048.         $spreadsheet->removeSheetByIndex(0);
  2049.         $writer = new Xlsx($spreadsheet);
  2050.         $response = new StreamedResponse();
  2051.         $response->setCallback(function () use ($writer) {
  2052.             $writer->save('php://output');
  2053.         });
  2054.         $response->setStatusCode(200);
  2055.         $response->headers->set('Content-Type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  2056.         $response->headers->set('Content-Disposition''attachment;filename="export_cartographie.xlsx"');
  2057.         $response->headers->set('Cache-Control','max-age=0');
  2058.         return $response;
  2059.     }
  2060.     /**
  2061.      * @Route("/systems/add", name="systems_add")
  2062.      */
  2063.     public function systemsAddAction(Request $request)
  2064.     {
  2065.         $types = [
  2066.             "computing" => [
  2067.                 "network" => 4,
  2068.                 "security" => 4,
  2069.                 "administration" => 4,
  2070.                 "device" => 4,
  2071.                 "software" => 4,
  2072.                 "server" => 4,
  2073.             ],
  2074.             "physical" => [
  2075.                 "partitioning" => 2,
  2076.                 "information" => 2,
  2077.             ],
  2078.             "action" => [
  2079.                 "minimization" => 2,
  2080.                 "anonymization" => 2,
  2081.                 "pseudonymization" => 2,
  2082.                 "sensitization" => 2,
  2083.                 "supervision" => 2,
  2084.                 "destruction" => 2,
  2085.             ],
  2086.             "supplier" => [
  2087.                 "supplier" => 1
  2088.             ]
  2089.         ];
  2090.         if (!$_GET['type'] || !$_GET['subtype']) {
  2091.             throw new NotFoundHttpException();
  2092.         }
  2093.         if (!key_exists($_GET['type'], $types)) {
  2094.             throw new NotFoundHttpException();
  2095.         }
  2096.         if (!key_exists($_GET['subtype'], $types[$_GET['type']])) {
  2097.             throw new NotFoundHttpException();
  2098.         }
  2099.         $system = new SystemStd();
  2100.         $form $this->createForm(SystemStdType::class, $system);
  2101.         switch ($_GET['subtype']) {
  2102.             case "network":
  2103.                 $form->add('field1'ChoiceType::class, [
  2104.                     'attr' => [
  2105.                         'placeholder' => 'Type'
  2106.                     ],
  2107.                     'placeholder' => 'Type',
  2108.                     'label' => 'Type',
  2109.                     'choices' => [
  2110.                         "Filaire" => "Filaire",
  2111.                         "Sans-fil" => "Sans-fil",
  2112.                     ],
  2113.                     'required' => false,
  2114.                     'mapped' => false
  2115.                 ])
  2116.                     ->add('field2'TextareaType::class, [
  2117.                         'attr' => [
  2118.                             'placeholder' => 'Informations complémentaires'
  2119.                         ],
  2120.                         'label' => 'Informations complémentaires',
  2121.                         'required' => false,
  2122.                         'mapped' => false
  2123.                     ])
  2124.                     ->add('field3'ChoiceType::class, [
  2125.                         'attr' => [
  2126.                             'placeholder' => 'Type'
  2127.                         ],
  2128.                         'placeholder' => 'Type',
  2129.                         'label' => 'Si Wifi, sélectionnez le type',
  2130.                         'choices' => [
  2131.                             "Privé" => "Privé",
  2132.                             "Public" => "Public",
  2133.                         ],
  2134.                         'required' => false,
  2135.                         'mapped' => false
  2136.                     ])
  2137.                     ->add('field4'TextType::class, [
  2138.                         'attr' => [
  2139.                             'placeholder' => 'Protocole'
  2140.                         ],
  2141.                         'label' => 'Si Wifi, quel protocole ?',
  2142.                         'required' => false,
  2143.                         'mapped' => false
  2144.                     ])
  2145.                 ;
  2146.                 break;
  2147.             case "security":
  2148.             case "administration":
  2149.             case "device":
  2150.             case "software":
  2151.             case "server":
  2152.                 $form->add('field1'TextType::class, [
  2153.                     'attr' => [
  2154.                         'placeholder' => 'Type'
  2155.                     ],
  2156.                     'label' => 'Type',
  2157.                     'required' => false,
  2158.                     'mapped' => false
  2159.                 ])
  2160.                     ->add('field2'TextareaType::class, [
  2161.                         'attr' => [
  2162.                             'placeholder' => 'Informations complémentaires'
  2163.                         ],
  2164.                         'label' => 'Informations complémentaires',
  2165.                         'required' => false,
  2166.                         'mapped' => false
  2167.                     ])
  2168.                     ->add('field3'TextType::class, [
  2169.                         'attr' => [
  2170.                             'placeholder' => '__/__/____',
  2171.                             'data-mask' => '00/00/0000',
  2172.                             'data-mask-clearifnotmatch' => 'true'
  2173.                         ],
  2174.                         'label' => 'Date d\'achat',
  2175.                         'required' => false,
  2176.                         'mapped' => false
  2177.                     ])
  2178.                     ->add('field4'TextType::class, [
  2179.                         'attr' => [
  2180.                             'placeholder' => 'N° d’identification'
  2181.                         ],
  2182.                         'label' => 'N° d’identification',
  2183.                         'required' => false,
  2184.                         'mapped' => false
  2185.                     ]);
  2186.                 break;
  2187.             case "partitioning":
  2188.             case "minimization":
  2189.             case "anonymization":
  2190.             case "pseudonymization":
  2191.             case "sensitization":
  2192.             case "information":
  2193.             case "supervision":
  2194.             case "destruction":
  2195.                 $form->add('field1'TextareaType::class, [
  2196.                     'attr' => [
  2197.                         'placeholder' => 'Description'
  2198.                     ],
  2199.                     'label' => 'Description',
  2200.                     'required' => false,
  2201.                     'mapped' => false
  2202.                 ])
  2203.                     ->add('field2'TextareaType::class, [
  2204.                         'attr' => [
  2205.                             'placeholder' => 'Informations complémentaires'
  2206.                         ],
  2207.                         'label' => 'Informations complémentaires',
  2208.                         'required' => false,
  2209.                         'mapped' => false
  2210.                     ]);
  2211.                 break;
  2212.             case "supplier":
  2213.                 $form->add('field1'TextType::class, [
  2214.                     'attr' => [
  2215.                         'placeholder' => 'Type'
  2216.                     ],
  2217.                     'label' => 'Type',
  2218.                     'required' => false,
  2219.                     'mapped' => false
  2220.                 ]);
  2221.                 break;
  2222.             default:
  2223.                 throw new NotFoundHttpException();
  2224.         }
  2225.         $form->handleRequest($request);
  2226.         if ($form->isSubmitted() && $form->isValid()) {
  2227.             $em $this->getDoctrine()->getManager();
  2228.             $data = [];
  2229.             switch ($_GET['subtype']) {
  2230.                 case "network":
  2231.                     $data[] = [
  2232.                         "title" => 'Type',
  2233.                         "value" => $form['field1']->getData()
  2234.                     ];
  2235.                     $data[] = [
  2236.                         "title" => 'Informations complémentaires',
  2237.                         "value" => $form['field2']->getData()
  2238.                     ];
  2239.                     $data[] = [
  2240.                         "title" => 'Type de Wifi',
  2241.                         "value" => $form['field3']->getData()
  2242.                     ];
  2243.                     $data[] = [
  2244.                         "title" => 'Protocole Wifi',
  2245.                         "value" => $form['field4']->getData()
  2246.                     ];
  2247.                     ;
  2248.                     break;
  2249.                 case "security":
  2250.                 case "administration":
  2251.                 case "device":
  2252.                 case "software":
  2253.                 case "server":
  2254.                     $data[] = [
  2255.                         "title" => 'Type',
  2256.                         "value" => $form['field1']->getData()
  2257.                     ];
  2258.                     $data[] = [
  2259.                         "title" => 'Informations complémentaires',
  2260.                         "value" => $form['field2']->getData()
  2261.                     ];
  2262.                     $data[] = [
  2263.                         "title" => 'Date d\'achat',
  2264.                         "value" => $form['field3']->getData()
  2265.                     ];
  2266.                     $data[] = [
  2267.                         "title" => 'N° d’identification',
  2268.                         "value" => $form['field4']->getData()
  2269.                     ];
  2270.                     break;
  2271.                 case "partitioning":
  2272.                 case "minimization":
  2273.                 case "anonymization":
  2274.                 case "pseudonymization":
  2275.                 case "sensitization":
  2276.                 case "information":
  2277.                 case "supervision":
  2278.                 case "destruction":
  2279.                     $data[] = [
  2280.                         "title" => 'Description',
  2281.                         "value" => $form['field1']->getData()
  2282.                     ];
  2283.                     $data[] = [
  2284.                         "title" => 'Informations complémentaires',
  2285.                         "value" => $form['field2']->getData()
  2286.                     ];
  2287.                     break;
  2288.                 case "supplier":
  2289.                     $data[] = [
  2290.                         "title" => 'Type',
  2291.                         "value" => $form['field1']->getData()
  2292.                     ];
  2293.                     break;
  2294.                 default:
  2295.                     throw new NotFoundHttpException();
  2296.             }
  2297.             $system->setData($data);
  2298.             $system->setType($_GET['type']);
  2299.             $system->setSubtype($_GET['subtype']);
  2300.             $system->setManager($this->getUser()->getManager());
  2301.             $em->persist($system);
  2302.             $em->flush();
  2303.             $this->get('session')->getFlashBag()->add('success''Nouvelle mesure technique standard créée');
  2304.             return $this->redirectToRoute("manager_systems");
  2305.         }
  2306.         return $this->render('manager/systems_add.html.twig', [
  2307.             "form" => $form->createView(),
  2308.             "fields" => $types[$_GET['type']][$_GET['subtype']]
  2309.         ]);
  2310.     }
  2311.     /**
  2312.      * @Route("/systems/{id}/edit", name="systems_edit")
  2313.      */
  2314.     public function systemsEditAction(Request $requestSystemStd $system)
  2315.     {
  2316.         $types = [
  2317.             "computing" => [
  2318.                 "network" => 4,
  2319.                 "security" => 4,
  2320.                 "administration" => 4,
  2321.                 "device" => 4,
  2322.                 "software" => 4,
  2323.                 "server" => 4,
  2324.             ],
  2325.             "physical" => [
  2326.                 "partitioning" => 2,
  2327.                 "information" => 2,
  2328.             ],
  2329.             "action" => [
  2330.                 "minimization" => 2,
  2331.                 "anonymization" => 2,
  2332.                 "pseudonymization" => 2,
  2333.                 "sensitization" => 2,
  2334.                 "supervision" => 2,
  2335.                 "destruction" => 2,
  2336.             ],
  2337.             "supplier" => [
  2338.                 "supplier" => 1
  2339.             ]
  2340.         ];
  2341.         $form $this->createForm(SystemStdType::class, $system);
  2342.         switch ($system->getSubtype()) {
  2343.             case "network":
  2344.                 $form->add('field1'ChoiceType::class, [
  2345.                     'attr' => [
  2346.                         'placeholder' => 'Type'
  2347.                     ],
  2348.                     'placeholder' => 'Type',
  2349.                     'label' => 'Type',
  2350.                     'choices' => [
  2351.                         "Filaire" => "Filaire",
  2352.                         "Sans-fil" => "Sans-fil",
  2353.                     ],
  2354.                     'data' => isset($system->getData()[0])?$system->getData()[0]["value"]:null,
  2355.                     'required' => false,
  2356.                     'mapped' => false
  2357.                 ])
  2358.                     ->add('field2'TextareaType::class, [
  2359.                         'attr' => [
  2360.                             'placeholder' => 'Informations complémentaires'
  2361.                         ],
  2362.                         'label' => 'Informations complémentaires',
  2363.                         'data' => isset($system->getData()[1])?$system->getData()[1]["value"]:null,
  2364.                         'required' => false,
  2365.                         'mapped' => false
  2366.                     ])
  2367.                     ->add('field3'ChoiceType::class, [
  2368.                         'attr' => [
  2369.                             'placeholder' => 'Type'
  2370.                         ],
  2371.                         'placeholder' => 'Type',
  2372.                         'label' => 'Si Wifi, sélectionnez le type',
  2373.                         'choices' => [
  2374.                             "Privé" => "Privé",
  2375.                             "Public" => "Public",
  2376.                         ],
  2377.                         'data' => isset($system->getData()[2])?$system->getData()[2]["value"]:null,
  2378.                         'required' => false,
  2379.                         'mapped' => false
  2380.                     ])
  2381.                     ->add('field4'TextType::class, [
  2382.                         'attr' => [
  2383.                             'placeholder' => 'Protocole'
  2384.                         ],
  2385.                         'label' => 'Si Wifi, quel protocole ?',
  2386.                         'data' => isset($system->getData()[3])?$system->getData()[3]["value"]:null,
  2387.                         'required' => false,
  2388.                         'mapped' => false
  2389.                     ])
  2390.                 ;
  2391.                 break;
  2392.             case "security":
  2393.             case "administration":
  2394.             case "device":
  2395.             case "software":
  2396.             case "server":
  2397.                 $form->add('field1'TextType::class, [
  2398.                     'attr' => [
  2399.                         'placeholder' => 'Type'
  2400.                     ],
  2401.                     'label' => 'Type',
  2402.                     'data' => isset($system->getData()[0])?$system->getData()[0]["value"]:null,
  2403.                     'required' => false,
  2404.                     'mapped' => false
  2405.                 ])
  2406.                     ->add('field2'TextareaType::class, [
  2407.                         'attr' => [
  2408.                             'placeholder' => 'Informations complémentaires'
  2409.                         ],
  2410.                         'label' => 'Informations complémentaires',
  2411.                         'data' => isset($system->getData()[1])?$system->getData()[1]["value"]:null,
  2412.                         'required' => false,
  2413.                         'mapped' => false
  2414.                     ])
  2415.                     ->add('field3'TextType::class, [
  2416.                         'attr' => [
  2417.                             'placeholder' => '__/__/____',
  2418.                             'data-mask' => '00/00/0000',
  2419.                             'data-mask-clearifnotmatch' => 'true'
  2420.                         ],
  2421.                         'label' => 'Date d\'achat',
  2422.                         'data' => isset($system->getData()[2])?$system->getData()[2]["value"]:null,
  2423.                         'required' => false,
  2424.                         'mapped' => false
  2425.                     ])
  2426.                     ->add('field4'TextType::class, [
  2427.                         'attr' => [
  2428.                             'placeholder' => 'N° d’identification'
  2429.                         ],
  2430.                         'label' => 'N° d’identification',
  2431.                         'data' => isset($system->getData()[3])?$system->getData()[3]["value"]:null,
  2432.                         'required' => false,
  2433.                         'mapped' => false
  2434.                     ]);
  2435.                 break;
  2436.             case "partitioning":
  2437.             case "minimization":
  2438.             case "anonymization":
  2439.             case "pseudonymization":
  2440.             case "sensitization":
  2441.             case "information":
  2442.             case "supervision":
  2443.             case "destruction":
  2444.                 $form->add('field1'TextareaType::class, [
  2445.                     'attr' => [
  2446.                         'placeholder' => 'Description'
  2447.                     ],
  2448.                     'label' => 'Description',
  2449.                     'data' => isset($system->getData()[0])?$system->getData()[0]["value"]:null,
  2450.                     'required' => false,
  2451.                     'mapped' => false
  2452.                 ])
  2453.                     ->add('field2'TextareaType::class, [
  2454.                         'attr' => [
  2455.                             'placeholder' => 'Informations complémentaires'
  2456.                         ],
  2457.                         'label' => 'Informations complémentaires',
  2458.                         'data' => isset($system->getData()[1])?$system->getData()[1]["value"]:null,
  2459.                         'required' => false,
  2460.                         'mapped' => false
  2461.                     ]);
  2462.                 break;
  2463.             case "supplier":
  2464.                 $form->add('field1'TextType::class, [
  2465.                     'attr' => [
  2466.                         'placeholder' => 'Type'
  2467.                     ],
  2468.                     'label' => 'Type',
  2469.                     'data' => isset($system->getData()[0])?$system->getData()[0]["value"]:null,
  2470.                     'required' => false,
  2471.                     'mapped' => false
  2472.                 ]);
  2473.                 break;
  2474.             default:
  2475.                 throw new NotFoundHttpException();
  2476.         }
  2477.         $form->handleRequest($request);
  2478.         if ($form->isSubmitted() && $form->isValid()) {
  2479.             $em $this->getDoctrine()->getManager();
  2480.             $data = [];
  2481.             switch ($system->getSubtype()) {
  2482.                 case "network":
  2483.                     $data[] = [
  2484.                         "title" => 'Type',
  2485.                         "value" => $form['field1']->getData()
  2486.                     ];
  2487.                     $data[] = [
  2488.                         "title" => 'Informations complémentaires',
  2489.                         "value" => $form['field2']->getData()
  2490.                     ];
  2491.                     $data[] = [
  2492.                         "title" => 'Type de Wifi',
  2493.                         "value" => $form['field3']->getData()
  2494.                     ];
  2495.                     $data[] = [
  2496.                         "title" => 'Protocole Wifi',
  2497.                         "value" => $form['field4']->getData()
  2498.                     ];
  2499.                     ;
  2500.                     break;
  2501.                 case "security":
  2502.                 case "administration":
  2503.                 case "device":
  2504.                 case "software":
  2505.                 case "server":
  2506.                     $data[] = [
  2507.                         "title" => 'Type',
  2508.                         "value" => $form['field1']->getData()
  2509.                     ];
  2510.                     $data[] = [
  2511.                         "title" => 'Informations complémentaires',
  2512.                         "value" => $form['field2']->getData()
  2513.                     ];
  2514.                     $data[] = [
  2515.                         "title" => 'Date d\'achat',
  2516.                         "value" => $form['field3']->getData()
  2517.                     ];
  2518.                     $data[] = [
  2519.                         "title" => 'N° d’identification',
  2520.                         "value" => $form['field4']->getData()
  2521.                     ];
  2522.                     break;
  2523.                 case "partitioning":
  2524.                 case "minimization":
  2525.                 case "anonymization":
  2526.                 case "pseudonymization":
  2527.                 case "sensitization":
  2528.                 case "information":
  2529.                 case "supervision":
  2530.                 case "destruction":
  2531.                     $data[] = [
  2532.                         "title" => 'Description',
  2533.                         "value" => $form['field1']->getData()
  2534.                     ];
  2535.                     $data[] = [
  2536.                         "title" => 'Informations complémentaires',
  2537.                         "value" => $form['field2']->getData()
  2538.                     ];
  2539.                     break;
  2540.                 case "supplier":
  2541.                     $data[] = [
  2542.                         "title" => 'Type',
  2543.                         "value" => $form['field1']->getData()
  2544.                     ];
  2545.                     break;
  2546.                 default:
  2547.                     throw new NotFoundHttpException();
  2548.             }
  2549.             $system->setData($data);
  2550.             $em->flush();
  2551.             $this->get('session')->getFlashBag()->add('success''Mise à jour de la mesure technique standard');
  2552.             return $this->redirectToRoute("manager_systems");
  2553.         }
  2554.         return $this->render('manager/systems_edit.html.twig', [
  2555.             "form" => $form->createView(),
  2556.             "fields" => $types[$system->getType()][$system->getSubtype()]
  2557.         ]);
  2558.     }
  2559.     /**
  2560.      * @Route("/systems/{id}/delete", name="systems_delete")
  2561.      */
  2562.     public function systemsDeleteAction(Request $requestSystemStd $system)
  2563.     {
  2564.         $em $this->getDoctrine()->getManager();
  2565.         $em->remove($system);
  2566.         $em->flush();
  2567.         $this->get('session')->getFlashBag()->add('success''Suppression de la mesure technique standard');
  2568.         return $this->redirectToRoute("manager_systems");
  2569.     }
  2570.     /**
  2571.      * @Route("/treatments", name="treatments")
  2572.      */
  2573.     public function treatmentsAction(Request $request)
  2574.     {
  2575.         $treatments $this->getDoctrine()->getRepository(TreatmentStd::class)->findBy(["user" => null]);
  2576.         
  2577.         return $this->render('manager/treatments.html.twig', [
  2578.             "treatments" => $treatments
  2579.         ]);
  2580.     }
  2581.     /**
  2582.      * @Route("/treatments/add", name="treatments_add")
  2583.      */
  2584.     public function treatmentsAddAction(Request $request)
  2585.     {
  2586.         $treatment = new TreatmentStd();
  2587.         $form $this->createForm(TreatmentStdType::class, $treatment);
  2588.         $personalDataFields = [
  2589.             [
  2590.                 "title" => "État civil, identité, données d'identification, images...",
  2591.                 "level" => 1,
  2592.             ],
  2593.             [
  2594.                 "title" => "Vie personnelle (habitudes de vie, situation familiale, etc.)",
  2595.                 "level" => 1,
  2596.             ],
  2597.             [
  2598.                 "title" => "Infos d'ordre économique et financier (revenus, situation financière, situation fiscale, etc.)",
  2599.                 "level" => 1,
  2600.             ],
  2601.             [
  2602.                 "title" => "Données de connexion (adress IP, logs, etc.)",
  2603.                 "level" => 1,
  2604.             ],
  2605.             [
  2606.                 "title" => "Données de localisation (déplacements, données GPS, GSM, etc.)",
  2607.                 "level" => 1,
  2608.             ],
  2609.             [
  2610.                 "title" => "Données Bancaires (données courantes « non sensible » mais classifié comme tel au vu des risques financiers)",
  2611.                 "level" => 2,
  2612.             ],
  2613.             [
  2614.                 "title" => "Numéro de Sécurité Sociale (ou NIR)",
  2615.                 "level" => 2,
  2616.             ],
  2617.             [
  2618.                 "title" => "Données révélant l'origine raciale ou ethnique",
  2619.                 "level" => 3,
  2620.             ],
  2621.             [
  2622.                 "title" => "Données révélant les opinions politiques",
  2623.                 "level" => 3,
  2624.             ],
  2625.             [
  2626.                 "title" => "Données révélant les convictions religieuses ou philosophiques",
  2627.                 "level" => 3,
  2628.             ],
  2629.             [
  2630.                 "title" => "Données révélant l'appartenance syndicale",
  2631.                 "level" => 3,
  2632.             ],
  2633.             [
  2634.                 "title" => "Données génétiques",
  2635.                 "level" => 3,
  2636.             ],
  2637.             [
  2638.                 "title" => "Données biométriques aux fins d'identifier une personne physique de manière unique",
  2639.                 "level" => 3,
  2640.             ],
  2641.             [
  2642.                 "title" => "Données concernant la santé",
  2643.                 "level" => 3,
  2644.             ],
  2645.             [
  2646.                 "title" => "Données concernant la vie sexuelle ou l'orientation sexuelle",
  2647.                 "level" => 3,
  2648.             ],
  2649.             [
  2650.                 "title" => "Données relatives à des condamnations pénales ou infractions",
  2651.                 "level" => 3,
  2652.             ],
  2653.         ];
  2654.         foreach ($personalDataFields as $key => $field) {
  2655.             $form->add("field_text_".$keyTextType::class, [
  2656.                 'attr' => [
  2657.                     'placeholder' => 'Zone de saisie'
  2658.                 ],
  2659.                 'label' => 'Zone de saisie',
  2660.                 'required' => false,
  2661.                 'mapped' => false
  2662.             ]);
  2663.             /*    ->add("field_duration_".$key, TextType::class, [
  2664.                 'attr' => [
  2665.                     'placeholder' => 'Durée de conservation'
  2666.                 ],
  2667.                 'label' => 'Durée de conservation',
  2668.                 'required' => false,
  2669.                 'mapped' => false
  2670.             ])*/
  2671.         }
  2672.         $form->handleRequest($request);
  2673.         if ($form->isSubmitted() && $form->isValid()) {
  2674.             $em $this->getDoctrine()->getManager();
  2675.             $now = new \DateTime("now");
  2676.             $personalData = [];
  2677.             $sensitiveData false;
  2678.             foreach ($personalDataFields as $key => $field) {
  2679.                 $personalData[] = [
  2680.                     "title" => $field['title'],
  2681.                     "level" => $field['level'],
  2682.                     "text" => $form["field_text_".$key]->getData(),
  2683.                     //"duration" => $form["field_duration_".$key]->getData(),
  2684.                 ];
  2685.                 if (($field['level'] == || $field['level'] == 3) && ($form["field_text_".$key]->getData()/* || $form["field_duration_".$key]->getData()*/)) {
  2686.                     $sensitiveData true;
  2687.                 }
  2688.             }
  2689.             $treatment->setPersonalData($personalData);
  2690.             $treatment->setSensitiveData($sensitiveData);
  2691.             $treatment->setCreationDate($now);
  2692.             $treatment->setEditDate($now);
  2693.             $treatment->setManager($this->getUser()->getManager());
  2694.             if ($treatment->isSensitiveData()) {
  2695.                 if (!in_array(1$treatment->getPiaCriteria())) {
  2696.                     $treatment->addPiaCriteria(1);
  2697.                 }
  2698.             } else {
  2699.                 $treatment->setInsufficientCriteria(true);
  2700.             }
  2701.             if (count($treatment->getPiaCriteria()) >= 2) {
  2702.                 $treatment->setPiaNeeded(true);
  2703.             } else {
  2704.                 $treatment->setPiaNeeded(false);
  2705.             }
  2706.             $em->persist($treatment);
  2707.             $em->flush();
  2708.             $this->get('session')->getFlashBag()->add('success''Nouveau traitement standard ajouté');
  2709.             return $this->redirectToRoute("manager_treatments");
  2710.         }
  2711.         return $this->render('manager/treatments_add.html.twig', [
  2712.             "form" => $form->createView(),
  2713.             "personalDataFields" => $personalDataFields
  2714.         ]);
  2715.     }
  2716.     /**
  2717.      * @Route("/treatments/{id}/edit", name="treatments_edit")
  2718.      */
  2719.     public function treatmentsEditAction(Request $requestTreatmentStd $treatment)
  2720.     {
  2721.         if (count($treatment->getPiaCriteria()) == 0) {
  2722.             if ($treatment->isAutomatedDecision()) {
  2723.                 $em $this->getDoctrine()->getManager();
  2724.                 $treatment->setPiaCriteria([4]);
  2725.                 $treatment->setAutomatedDecision(false);
  2726.                 $em->flush();
  2727.                 return $this->redirectToRoute("manager_treatments_edit", ["id" => $treatment->getId()]);
  2728.             }
  2729.         }
  2730.         $form $this->createForm(TreatmentStdType::class, $treatment);
  2731.         foreach ($treatment->getPersonalData() as $key => $field) {
  2732.             $form->add("field_text_".$keyTextType::class, [
  2733.                 'attr' => [
  2734.                     'placeholder' => 'Zone de saisie'
  2735.                 ],
  2736.                 'label' => 'Zone de saisie',
  2737.                 'data' => $field['text'],
  2738.                 'required' => false,
  2739.                 'mapped' => false
  2740.             ]);
  2741.             /*    ->add("field_duration_".$key, TextType::class, [
  2742.                 'attr' => [
  2743.                     'placeholder' => 'Durée de conservation'
  2744.                 ],
  2745.                 'label' => 'Durée de conservation',
  2746.                 'data' => $field['duration'],
  2747.                 'required' => false,
  2748.                 'mapped' => false
  2749.             ]);*/
  2750.         }
  2751.         $form->handleRequest($request);
  2752.         if ($form->isSubmitted() && $form->isValid()) {
  2753.             $em $this->entityManager;
  2754.             $now = new \DateTime("now");
  2755.             $personalData = [];
  2756.             $sensitiveData false;
  2757.             foreach ($treatment->getPersonalData() as $key => $field) {
  2758.                 $personalData[] = [
  2759.                     "title" => $field['title'],
  2760.                     "level" => $field['level'],
  2761.                     "text" => $form["field_text_".$key]->getData(),
  2762.                     //"duration" => $form["field_duration_".$key]->getData(),
  2763.                 ];
  2764.                 if (($field['level'] == || $field['level'] == 3) && ($form["field_text_".$key]->getData()/* || $form["field_duration_".$key]->getData()*/)) {
  2765.                     $sensitiveData true;
  2766.                 }
  2767.             }
  2768.             $treatment->setPersonalData($personalData);
  2769.             $treatment->setSensitiveData($sensitiveData);
  2770.             if ($treatment->isSensitiveData()) {
  2771.                 if (!in_array(1$treatment->getPiaCriteria())) {
  2772.                     $treatment->addPiaCriteria(1);
  2773.                 }
  2774.             } else {
  2775.                 $treatment->setInsufficientCriteria(true);
  2776.             }
  2777.             $treatment->setEditDate($now);
  2778.             if (count($treatment->getPiaCriteria()) >= 2) {
  2779.                 $treatment->setPiaNeeded(true);
  2780.             } else {
  2781.                 $treatment->setPiaNeeded(false);
  2782.             }
  2783.             $em->flush();
  2784.             $this->get('session')->getFlashBag()->add('success''Traitement standard mis à jour');
  2785.             return $this->redirectToRoute("manager_treatments");
  2786.         }
  2787.         return $this->render('manager/treatments_edit.html.twig', [
  2788.             "form" => $form->createView(),
  2789.             "treatment" => $treatment,
  2790.             "personalDataFields" => $treatment->getPersonalData()
  2791.         ]);
  2792.     }
  2793.     /**
  2794.      * @Route("/treatments/{id}/translate/{_locale}", name="treatments_translate")
  2795.      */
  2796.     public function treatmentsTranslateAction(Request $requestTreatmentStd $treatment)
  2797.     {
  2798.         $em $this->entityManager;
  2799.         $repository $em->getRepository('Gedmo\Translatable\Entity\Translation');
  2800.         $translations $repository->findTranslations($treatment);
  2801.         if (!isset($translations[$request->get("_locale")])) {
  2802.             return $this->redirectToRoute("manager_treatments_gen_translate", ["id" => $treatment->getId(), "locale" => 'en']);
  2803.         }
  2804.         $treatment $em->find(TreatmentStd::class, $request->get("id"));
  2805.         $form $this->createForm(TreatmentStdTranslateType::class, $treatment);
  2806.         foreach ($treatment->getPersonalData() as $key => $field) {
  2807.             $form->add("field_text_".$keyTextType::class, [
  2808.                 'attr' => [
  2809.                     'placeholder' => 'Zone de saisie'
  2810.                 ],
  2811.                 'label' => 'Zone de saisie',
  2812.                 'data' => $field['text'],
  2813.                 'required' => false,
  2814.                 'mapped' => false
  2815.             ]);
  2816.         }
  2817.         $form->handleRequest($request);
  2818.         if ($form->isSubmitted() && $form->isValid()) {
  2819.             $personalData = [];
  2820.             foreach ($treatment->getPersonalData() as $key => $field) {
  2821.                 $personalData[] = [
  2822.                     "title" => $field['title'],
  2823.                     "level" => $field['level'],
  2824.                     "text" => $form["field_text_".$key]->getData(),
  2825.                 ];
  2826.             }
  2827.             $treatment->setPersonalData($personalData);
  2828.             $em->persist($treatment);
  2829.             $em->flush();
  2830.             $this->get('session')->getFlashBag()->add('success''Traduction du traitement standard mise à jour');
  2831.             return $this->redirectToRoute("manager_treatments");
  2832.         }
  2833.         return $this->render('manager/treatments_edit.html.twig', [
  2834.             "form" => $form->createView(),
  2835.             "treatment" => $treatment,
  2836.             "personalDataFields" => $treatment->getPersonalData()
  2837.         ]);
  2838.     }
  2839.     /**
  2840.      * @Route("/treatments/{id}/gentranslate/{locale}", name="treatments_gen_translate")
  2841.      */
  2842.     public function treatmentsGanTranslateAction(Request $requestTreatmentStd $treatment$locale)
  2843.     {
  2844.         $em $this->getDoctrine()->getManager();
  2845.         $repository $em->getRepository('Gedmo\Translatable\Entity\Translation');
  2846.         $translations $repository->findTranslations($treatment);
  2847.         if (!isset($translations[$locale])) {
  2848.             $repository
  2849.                 ->translate($treatment'name''en'$treatment->getName())
  2850.                 ->translate($treatment'mainPurpose''en'$treatment->getMainPurpose())
  2851.                 ->translate($treatment'purpose1''en'$treatment->getPurpose1())
  2852.                 ->translate($treatment'purpose2''en'$treatment->getPurpose2())
  2853.                 ->translate($treatment'purpose3''en'$treatment->getPurpose3())
  2854.                 ->translate($treatment'purpose4''en'$treatment->getPurpose4())
  2855.                 ->translate($treatment'purpose5''en'$treatment->getPurpose5())
  2856.                 ->translate($treatment'othersPurpose''en'$treatment->getOthersPurpose())
  2857.                 ->translate($treatment'description''en'$treatment->getDescription())
  2858.                 ->translate($treatment'personalData''en'$treatment->getPersonalData())
  2859.                 ->translate($treatment'peopleData''en'$treatment->getPeopleData())
  2860.                 ->translate($treatment'transferOutsideUeCountries''en'$treatment->getTransferOutsideUeCountries())
  2861.                 ->translate($treatment'consentHow''en'$treatment->getConsentHow())
  2862.                 ->translate($treatment'legalBasis''en'$treatment->getLegalBasis())
  2863.                 ->translate($treatment'dataSource''en'$treatment->getDataSource())
  2864.             ;
  2865.             $em->persist($treatment);
  2866.             $em->flush();
  2867.             return $this->redirectToRoute("manager_treatments_translate", ["id" => $treatment->getId(), "_locale" => 'en']);
  2868.         }
  2869.         return $this->redirectToRoute("manager_treatments_translate", ["id" => $treatment->getId(), "_locale" => 'en']);
  2870.     }
  2871.     /**
  2872.      * @Route("/treatments/{id}/delete", name="treatments_delete")
  2873.      */
  2874.     public function treatmentsDeleteAction(Request $requestTreatmentStd $treatment)
  2875.     {
  2876.         $em $this->entityManager;
  2877.         $em->remove($treatment);
  2878.         $em->flush();
  2879.         $this->get('session')->getFlashBag()->add('success''Traitement standard supprimé');
  2880.         return $this->redirectToRoute("manager_treatments");
  2881.     }
  2882.     /**
  2883.      * @Route("/subcontractors", name="subcontractors")
  2884.      */
  2885.     public function subcontractorsAction(Request $request)
  2886.     {
  2887.         $subcontractors $this->entityManager->getRepository(SubcontractorStd::class)->findBy([], ["name" => "ASC"]);
  2888.         return $this->render('manager/subcontractors.html.twig', [
  2889.             "subcontractors" => $subcontractors
  2890.         ]);
  2891.     }
  2892.     /**
  2893.      * @Route("/subcontractors/add", name="subcontractors_add")
  2894.      */
  2895.     public function subcontractorsAddAction(Request $request)
  2896.     {
  2897.         $subcontractor = new SubcontractorStd();
  2898.         $form $this->createForm(SubcontractorStdType::class, $subcontractor);
  2899.         $form->handleRequest($request);
  2900.         if ($form->isSubmitted() && $form->isValid()) {
  2901.             $em $this->entityManager;
  2902.             $now = new \DateTime("now");
  2903.             $subcontractor->setDate($now);
  2904.             $subcontractor->setEditDate($now);
  2905.             $subcontractor->setManager($this->getUser()->getManager());
  2906.             $em->persist($subcontractor);
  2907.             $em->flush();
  2908.             if (isset($_FILES['appbundle_subcontractor_documents'])) {
  2909.                 $files $_FILES['appbundle_subcontractor_documents'];
  2910.                 $fileNames $_POST['appbundle_subcontractor_documents_names'];
  2911.                 for ($i=0;$i<count($files['name']);$i++) {
  2912.                     if ( is_uploaded_file$files["tmp_name"][$i] ) && file_exists($files["tmp_name"][$i]) && $files["error"][$i] === 0) {
  2913.                         $name $files["name"][$i];
  2914.                         $parts explode("."$name);
  2915.                         $extension end($parts);
  2916.                         $fileName $subcontractor->getId()."_".md5(uniqid()) . '.' $extension;
  2917.                         move_uploaded_file($files["tmp_name"][$i], $this->getParameter('documents_directory') . $fileName);
  2918.                         $docTitle = (isset($fileNames[$i]) && !empty($fileNames[$i]))?$fileNames[$i]:$files["name"][$i];
  2919.                         $document = new SubcontractorStdDocument();
  2920.                         $document->setName($docTitle);
  2921.                         $document->setFilename($fileName);
  2922.                         $document->setUserFilename($files["name"][$i]);
  2923.                         $document->setManager($this->getUser()->getManager());
  2924.                         $document->setSubcontractorStd($subcontractor);
  2925.                         $em->persist($document);
  2926.                         $em->flush();
  2927.                     }
  2928.                 }
  2929.             }
  2930.             $this->get('session')->getFlashBag()->add('success''Nouveau sous-traitant standard ajouté');
  2931.             return $this->redirectToRoute("manager_subcontractors");
  2932.         }
  2933.         return $this->render('manager/subcontractors_add.html.twig', [
  2934.             "form" => $form->createView()
  2935.         ]);
  2936.     }
  2937.     /**
  2938.      * @Route("/subcontractors/{id}/edit", name="subcontractors_edit")
  2939.      */
  2940.     public function subcontractorsEditAction(Request $requestSubcontractorStd $subcontractor)
  2941.     {
  2942.         $form $this->createForm(SubcontractorStdType::class, $subcontractor);
  2943.         $form->handleRequest($request);
  2944.         if ($form->isSubmitted() && $form->isValid()) {
  2945.             $em $this->entityManager;
  2946.             $subcontractor->setEditDate(new \DateTime("now"));
  2947.             $em->flush();
  2948.             foreach ($subcontractor->getDocuments() as $document) {
  2949.                 if (isset($_POST["appbundle_subcontractor_documents_".$document->getId()]) && !empty($_POST["appbundle_subcontractor_documents_".$document->getId()])) {
  2950.                     if ($document->getName() != $_POST["appbundle_subcontractor_documents_".$document->getId()]) {
  2951.                         $document->setTitle($_POST["appbundle_subcontractor_documents_".$document->getId()]);
  2952.                         $em->flush();
  2953.                     }
  2954.                 }
  2955.             }
  2956.             if (isset($_FILES['appbundle_subcontractor_documents'])) {
  2957.                 $files $_FILES['appbundle_subcontractor_documents'];
  2958.                 $fileNames $_POST['appbundle_subcontractor_documents_names'];
  2959.                 for ($i=0;$i<count($files['name']);$i++) {
  2960.                     if ( is_uploaded_file$files["tmp_name"][$i] ) && file_exists($files["tmp_name"][$i]) && $files["error"][$i] === 0) {
  2961.                         $name $files["name"][$i];
  2962.                         $parts explode("."$name);
  2963.                         $extension end($parts);
  2964.                         $fileName $subcontractor->getId()."_".md5(uniqid()) . '.' $extension;
  2965.                         move_uploaded_file($files["tmp_name"][$i], $this->getParameter('documents_directory') . $fileName);
  2966.                         $docTitle = (isset($fileNames[$i]) && !empty($fileNames[$i]))?$fileNames[$i]:$files["name"][$i];
  2967.                         $document = new SubcontractorStdDocument();
  2968.                         $document->setName($docTitle);
  2969.                         $document->setFilename($fileName);
  2970.                         $document->setUserFilename($files["name"][$i]);
  2971.                         $document->setManager($this->getUser()->getManager());
  2972.                         $document->setSubcontractorStd($subcontractor);
  2973.                         $em->persist($document);
  2974.                         $em->flush();
  2975.                     }
  2976.                 }
  2977.             }
  2978.             $this->get('session')->getFlashBag()->add('success''Sous-traitant standard mis à jour');
  2979.             return $this->redirectToRoute("manager_subcontractors");
  2980.         }
  2981.         return $this->render('manager/subcontractors_edit.html.twig', [
  2982.             "subcontractor" => $subcontractor,
  2983.             "form" => $form->createView()
  2984.         ]);
  2985.     }
  2986.     /**
  2987.      * @Route("/subcontractors/{id}/translate/{_locale}", name="subcontractors_translate")
  2988.      */
  2989.     public function subcontractorsTranslateAction(Request $requestSubcontractorStd $subcontractor)
  2990.     {
  2991.         $em $this->entityManager;
  2992.         $repository $em->getRepository('Gedmo\Translatable\Entity\Translation');
  2993.         $translations $repository->findTranslations($subcontractor);
  2994.         if (!isset($translations[$request->get("_locale")])) {
  2995.             return $this->redirectToRoute("manager_subcontractors_gen_translate", ["id" => $subcontractor->getId(), "_locale" => "fr""locale" => $request->get("_locale")]);
  2996.         }
  2997.         $subcontractor $em->find(SubcontractorStd::class, $request->get("id"));
  2998.         $form $this->createForm(SubcontractorStdTranslateType::class, $subcontractor);
  2999.         $form->handleRequest($request);
  3000.         if ($form->isSubmitted() && $form->isValid()) {
  3001.             $em->persist($subcontractor);
  3002.             $em->flush();
  3003.             $this->get('session')->getFlashBag()->add('success''Traduction du sous-traitant standard mis à jour');
  3004.             return $this->redirectToRoute("manager_subcontractors");
  3005.         }
  3006.         return $this->render('manager/subcontractors_translate.html.twig', [
  3007.             "form" => $form->createView(),
  3008.             "subcontractor" => $subcontractor,
  3009.         ]);
  3010.     }
  3011.     /**
  3012.      * @Route("/subcontractors/{id}/gentranslate/{locale}_{_locale}", name="subcontractors_gen_translate")
  3013.      */
  3014.     public function subcontractorsGanTranslateAction(Request $requestSubcontractorStd $subcontractor$locale$_locale)
  3015.     {
  3016.         $em $this->entityManager;
  3017.         $repository $em->getRepository('Gedmo\Translatable\Entity\Translation');
  3018.         $translations $repository->findTranslations($subcontractor);
  3019.         if (!isset($translations[$locale])) {
  3020.             $repository
  3021.                 ->translate($subcontractor'type'$locale$subcontractor->getType())
  3022.             ;
  3023.             $em->persist($subcontractor);
  3024.             $em->flush();
  3025.             return $this->redirectToRoute("manager_subcontractors_translate", ["id" => $subcontractor->getId(), "_locale" => $locale]);
  3026.         }
  3027.         return $this->redirectToRoute("manager_subcontractors");
  3028.     }
  3029.     /**
  3030.      * @Route("/subcontractors/{id}/delete", name="subcontractors_delete")
  3031.      */
  3032.     public function subcontractorsDeleteAction(Request $requestSubcontractorStd $subcontractor)
  3033.     {
  3034.         $em $this->entityManager;
  3035.         $em->remove($subcontractor);
  3036.         $em->flush();
  3037.         $this->get('session')->getFlashBag()->add('success''Sous-traitant standard supprimé');
  3038.         return $this->redirectToRoute("manager_subcontractors");
  3039.     }
  3040.     /**
  3041.      * @Route("/subcontractors/deletedoc/{subcontractor}/{document}", name="subcontractor_deletedoc")
  3042.      */
  3043.     public function subcontractorsDeleteDocAction(Request $requestSubcontractorStd $subcontractorSubcontractorStdDocument $subcontractorStdDocument)
  3044.     {
  3045.         $em $this->entityManager;
  3046.         $em->remove($subcontractorStdDocument);
  3047.         $em->flush();
  3048.         $this->get('session')->getFlashBag()->add('success''Document supprimé');
  3049.         return $this->redirectToRoute('manager_subcontractors_edit', ['id' => $subcontractor->getId()]);
  3050.     }
  3051.     /**
  3052.      * @Route("/actions", name="actions")
  3053.      */
  3054.     public function actionsAction(Request $request)
  3055.     {
  3056.         $actions $this->entityManager->getRepository(ActionStd::class)->findBy([], ["name" => "ASC"]);
  3057.         return $this->render('manager/actions.html.twig', [
  3058.             "actions" => $actions
  3059.         ]);
  3060.     }
  3061.     /**
  3062.      * @Route("/actions/add", name="actions_add")
  3063.      */
  3064.     public function actionsAddAction(Request $request)
  3065.     {
  3066.         $action = new ActionStd();
  3067.         $form $this->createForm(ActionStdType::class, $action)
  3068.             ->add('sheets'EntityType::class, [
  3069.                 'attr' => array(
  3070.                     'placeholder' => 'Annexer des fiches pratiques',
  3071.                 ),
  3072.                 'placeholder' => 'Annexer des fiches pratiques',
  3073.                 'label' => 'Annexer des fiches pratiques',
  3074.                 'expanded' => false,
  3075.                 'multiple' => true,
  3076.                 'required' => false,
  3077.                 'class' => Document::class,
  3078.                 'query_builder' => function (EntityRepository $er) {
  3079.                     return $er->createQueryBuilder('d')
  3080.                         ->leftJoin("d.type""t")
  3081.                         ->leftJoin("t.parent""pt")
  3082.                         ->where('t.id = 2')
  3083.                         ->orWhere('pt.id = 2')
  3084.                         ->addOrderBy("d.name""ASC")
  3085.                         ->addOrderBy("d.filename""ASC");
  3086.                 }
  3087.             ]);
  3088.         $form->handleRequest($request);
  3089.         if ($form->isSubmitted() && $form->isValid()) {
  3090.             $em $this->entityManager;
  3091.             $now = new \DateTime("now");
  3092.             $action->setDate($now);
  3093.             $action->setEditDate($now);
  3094.             $action->setManager($this->getUser()->getManager());
  3095.             $em->persist($action);
  3096.             $em->flush();
  3097.             if (isset($_FILES['appbundle_action_documents'])) {
  3098.                 $files $_FILES['appbundle_action_documents'];
  3099.                 $fileNames $_POST['appbundle_action_documents_names'];
  3100.                 for ($i=0;$i<count($files['name']);$i++) {
  3101.                     if ( is_uploaded_file$files["tmp_name"][$i] ) && file_exists($files["tmp_name"][$i]) && $files["error"][$i] === 0) {
  3102.                         $name $files["name"][$i];
  3103.                         $parts explode("."$name);
  3104.                         $extension end($parts);
  3105.                         $fileName $action->getId()."_".md5(uniqid()) . '.' $extension;
  3106.                         move_uploaded_file($files["tmp_name"][$i], $this->getParameter('documents_directory') . $fileName);
  3107.                         $docTitle = (isset($fileNames[$i]) && !empty($fileNames[$i]))?$fileNames[$i]:$files["name"][$i];
  3108.                         $document = new ActionStdDocument();
  3109.                         $document->setName($docTitle);
  3110.                         $document->setFilename($fileName);
  3111.                         $document->setUserFilename($files["name"][$i]);
  3112.                         $document->setManager($this->getUser()->getManager());
  3113.                         $document->setActionStd($action);
  3114.                         $em->persist($document);
  3115.                         $em->flush();
  3116.                     }
  3117.                 }
  3118.             }
  3119.             $this->get('session')->getFlashBag()->add('success''Nouvelle action standard ajoutée');
  3120.             return $this->redirectToRoute("manager_actions");
  3121.         }
  3122.         return $this->render('manager/actions_add.html.twig', [
  3123.             "form" => $form->createView()
  3124.         ]);
  3125.     }
  3126.     /**
  3127.      * @Route("/actions/{id}/edit", name="actions_edit")
  3128.      */
  3129.     public function actionsEditAction(Request $requestActionStd $action)
  3130.     {
  3131.         $form $this->createForm(ActionStdType::class, $action)
  3132.             ->add('sheets'EntityType::class, [
  3133.                 'attr' => array(
  3134.                     'placeholder' => 'Annexer des fiches pratiques',
  3135.                 ),
  3136.                 'placeholder' => 'Annexer des fiches pratiques',
  3137.                 'label' => 'Annexer des fiches pratiques',
  3138.                 'expanded' => false,
  3139.                 'multiple' => true,
  3140.                 'required' => false,
  3141.                 'class' => Document::class,
  3142.                 'query_builder' => function (EntityRepository $er) {
  3143.                     return $er->createQueryBuilder('d')
  3144.                         ->leftJoin("d.type""t")
  3145.                         ->leftJoin("t.parent""pt")
  3146.                         ->where('t.id = 2')
  3147.                         ->orWhere('pt.id = 2')
  3148.                         ->addOrderBy("d.name""ASC")
  3149.                         ->addOrderBy("d.filename""ASC");
  3150.                 }
  3151.             ]);
  3152.         $form->handleRequest($request);
  3153.         if ($form->isSubmitted() && $form->isValid()) {
  3154.             $em $this->entityManager;
  3155.             $action->setEditDate(new \DateTime("now"));
  3156.             $em->flush();
  3157.             foreach ($action->getDocuments() as $document) {
  3158.                 if (isset($_POST["appbundle_action_documents_".$document->getId()]) && !empty($_POST["appbundle_action_documents_".$document->getId()])) {
  3159.                     if ($document->getName() != $_POST["appbundle_action_documents_".$document->getId()]) {
  3160.                         $document->setTitle($_POST["appbundle_action_documents_".$document->getId()]);
  3161.                         $em->flush();
  3162.                     }
  3163.                 }
  3164.             }
  3165.             if (isset($_FILES['appbundle_action_documents'])) {
  3166.                 $files $_FILES['appbundle_action_documents'];
  3167.                 $fileNames $_POST['appbundle_action_documents_names'];
  3168.                 for ($i=0;$i<count($files['name']);$i++) {
  3169.                     if ( is_uploaded_file$files["tmp_name"][$i] ) && file_exists($files["tmp_name"][$i]) && $files["error"][$i] === 0) {
  3170.                         $name $files["name"][$i];
  3171.                         $parts explode("."$name);
  3172.                         $extension end($parts);
  3173.                         $fileName $action->getId()."_".md5(uniqid()) . '.' $extension;
  3174.                         move_uploaded_file($files["tmp_name"][$i], $this->getParameter('documents_directory') . $fileName);
  3175.                         $docTitle = (isset($fileNames[$i]) && !empty($fileNames[$i]))?$fileNames[$i]:$files["name"][$i];
  3176.                         $document = new ActionStdDocument();
  3177.                         $document->setName($docTitle);
  3178.                         $document->setFilename($fileName);
  3179.                         $document->setUserFilename($files["name"][$i]);
  3180.                         $document->setManager($this->getUser()->getManager());
  3181.                         $document->setActionStd($action);
  3182.                         $em->persist($document);
  3183.                         $em->flush();
  3184.                     }
  3185.                 }
  3186.             }
  3187.             $this->get('session')->getFlashBag()->add('success''Action standard mise à jour');
  3188.             return $this->redirectToRoute("manager_actions");
  3189.         }
  3190.         return $this->render('manager/actions_edit.html.twig', [
  3191.             "action" => $action,
  3192.             "form" => $form->createView()
  3193.         ]);
  3194.     }
  3195.     /**
  3196.      * @Route("/actions/{id}/translate/{_locale}", name="actions_translate")
  3197.      */
  3198.     public function actionsTranslateAction(Request $requestActionStd $action)
  3199.     {
  3200.         $em $this->entityManager;
  3201.         $repository $em->getRepository('Gedmo\Translatable\Entity\Translation');
  3202.         $translations $repository->findTranslations($action);
  3203.         if (!isset($translations[$request->get("_locale")])) {
  3204.             return $this->redirectToRoute("manager_actions_gen_translate", ["id" => $action->getId(), "_locale" => "fr""locale" => $request->get("_locale")]);
  3205.         }
  3206.         $action $em->find(ActionStd::class, $request->get("id"));
  3207.         $form $this->createForm(ActionStdTranslateType::class, $action);
  3208.         $form->handleRequest($request);
  3209.         if ($form->isSubmitted() && $form->isValid()) {
  3210.             $em->persist($action);
  3211.             $em->flush();
  3212.             $this->get('session')->getFlashBag()->add('success''Traduction de l\'action standard mise à jour');
  3213.             return $this->redirectToRoute("manager_actions");
  3214.         }
  3215.         return $this->render('manager/actions_translate.html.twig', [
  3216.             "form" => $form->createView(),
  3217.             "action" => $action,
  3218.         ]);
  3219.     }
  3220.     /**
  3221.      * @Route("/actions/{id}/gentranslate/{locale}_{_locale}", name="actions_gen_translate")
  3222.      */
  3223.     public function actionsGanTranslateAction(Request $requestActionStd $action$locale$_locale)
  3224.     {
  3225.         $em $this->entityManager;
  3226.         $repository $em->getRepository('Gedmo\Translatable\Entity\Translation');
  3227.         $translations $repository->findTranslations($action);
  3228.         if (!isset($translations[$locale])) {
  3229.             $repository
  3230.                 ->translate($action'name'$locale$action->getName())
  3231.                 ->translate($action'goal'$locale$action->getGoal())
  3232.                 ->translate($action'information'$locale$action->getInformation())
  3233.             ;
  3234.             $em->persist($action);
  3235.             $em->flush();
  3236.             return $this->redirectToRoute("manager_actions_translate", ["id" => $action->getId(), "_locale" => $locale]);
  3237.         }
  3238.         return $this->redirectToRoute("manager_actions");
  3239.     }
  3240.     /**
  3241.      * @Route("/actions/{id}/delete", name="actions_delete")
  3242.      */
  3243.     public function actionsDeleteAction(Request $requestActionStd $action)
  3244.     {
  3245.         $em $this->entityManager;
  3246.         $em->remove($action);
  3247.         $em->flush();
  3248.         $this->get('session')->getFlashBag()->add('success''Action standard supprimée');
  3249.         return $this->redirectToRoute("manager_actions");
  3250.     }
  3251.   /**
  3252.  * @Route("/actions/deletedoc/{action}/{document}", name="actions_deletedoc")
  3253.  */
  3254. public function actionsDeleteDocAction(Request $requestActionStd $action$documentEntityManagerInterface $em)
  3255. {
  3256.     // Manually fetch the ActionStdDocument using the ID
  3257.     $actionStdDocument $em->getRepository(ActionStdDocument::class)->find($document);
  3258.     if (!$actionStdDocument) {
  3259.         throw $this->createNotFoundException('Document not found.');
  3260.     }
  3261.     $em->remove($actionStdDocument);
  3262.     $em->flush();
  3263.     $this->addFlash('success''Document supprimé');
  3264.     return $this->redirectToRoute('manager_actions_edit', ['id' => $action->getId()]);
  3265. }
  3266.     /**
  3267.      * @Route("/infos", name="infos")
  3268.      */
  3269.     public function infosAction(Request $request)
  3270.     {
  3271.         if (!$this->isGranted("ROLE_DPO")) {
  3272.             throw new NotFoundHttpException();
  3273.         }
  3274.         $infos $this->entityManager->getRepository(Info::class)->findAll();
  3275.         return $this->render('manager/infos.html.twig', [
  3276.             "infos" => $infos
  3277.         ]);
  3278.     }
  3279.     /**
  3280.      * @Route("/infos/add", name="infos_add")
  3281.      */
  3282.     public function infosAddAction(Request $request)
  3283.     {
  3284.         if (!$this->isGranted("ROLE_DPO")) {
  3285.             throw new NotFoundHttpException();
  3286.         }
  3287.         $info = new Info();
  3288.         $form $this->createForm(InfoType::class, $info);
  3289.         $form->handleRequest($request);
  3290.         if ($form->isSubmitted() && $form->isValid()) {
  3291.             $em $this->entityManager;
  3292.             $em->persist($info);
  3293.             $em->flush();
  3294.             /**
  3295.              * @var UploadedFile $file
  3296.              */
  3297.             $file $form->get('filePicture')->getData();
  3298.             if ($file != NULL) {
  3299.                 $fileName $info->getId()."_".md5(uniqid()) . '.' $file->guessExtension();
  3300.                 $file->move(
  3301.                     $this->getParameter('pictures_directory'), $fileName
  3302.                 );
  3303.                 $info->setPicture($fileName);
  3304.                 $em->flush();
  3305.             }
  3306.             $this->get('session')->getFlashBag()->add('success''Nouvelle info ajoutée');
  3307.             return $this->redirectToRoute("manager_infos");
  3308.         }
  3309.         return $this->render('manager/infos_add.html.twig', [
  3310.             "form" => $form->createView(),
  3311.         ]);
  3312.     }
  3313.     /**
  3314.      * @Route("/infos/{id}/edit", name="infos_edit")
  3315.      */
  3316.     public function infosEditAction(Request $requestInfo $info)
  3317.     {
  3318.         if (!$this->isGranted("ROLE_DPO")) {
  3319.             throw new NotFoundHttpException();
  3320.         }
  3321.         $form $this->createForm(InfoType::class, $info);
  3322.         $form->handleRequest($request);
  3323.         if ($form->isSubmitted() && $form->isValid()) {
  3324.             $em $this->entityManager;
  3325.             $em->flush();
  3326.             /**
  3327.              * @var UploadedFile $file
  3328.              */
  3329.             $file $form->get('filePicture')->getData();
  3330.             if ($file != NULL) {
  3331.                 $fileName $info->getId()."_".md5(uniqid()) . '.' $file->guessExtension();
  3332.                 $file->move(
  3333.                     $this->getParameter('pictures_directory'), $fileName
  3334.                 );
  3335.                 $info->setPicture($fileName);
  3336.                 $em->flush();
  3337.             }
  3338.             $this->get('session')->getFlashBag()->add('success''Info mise à jour');
  3339.             return $this->redirectToRoute("manager_infos");
  3340.         }
  3341.         return $this->render('manager/infos_edit.html.twig', [
  3342.             "form" => $form->createView(),
  3343.             "info" => $info
  3344.         ]);
  3345.     }
  3346.     /**
  3347.      * @Route("/infos/{id}/delete", name="infos_delete")
  3348.      */
  3349.     public function infosDeleteAction(Request $requestInfo $info)
  3350.     {
  3351.         if (!$this->isGranted("ROLE_DPO")) {
  3352.             throw new NotFoundHttpException();
  3353.         }
  3354.         $em $this->entityManager;
  3355.         $em->remove($info);
  3356.         $em->flush();
  3357.         $this->get('session')->getFlashBag()->add('success''Info supprimée');
  3358.         return $this->redirectToRoute("manager_infos");
  3359.     }
  3360.     /**
  3361.      * @Route("/loginlogs/{user}", name="login_logs")
  3362.      */
  3363.     public function loginLogsAction(Request $requestUser $user)
  3364.     {
  3365.         $loginLogs $this->entityManager->getRepository(LoginLog::class)->findLast3Months($user);
  3366.         return $this->render('manager/login_logs.html.twig', [
  3367.             "loginLogs" => $loginLogs
  3368.         ]);
  3369.     }
  3370.     /**
  3371.      * @Route("/subscriptions", name="subscriptions")
  3372.      */
  3373.     public function subscriptionsAction(Request $request)
  3374.     {
  3375.         if (!$this->isGranted("ROLE_DPO")) {
  3376.             throw new NotFoundHttpException();
  3377.         }
  3378.         $subscriptions $this->entityManager->getRepository(Subscription::class)->findAll();
  3379.         return $this->render('manager/subscriptions.html.twig', [
  3380.             "subscriptions" => $subscriptions
  3381.         ]);
  3382.     }
  3383.     /**
  3384.      * @Route("/subscriptions/export", name="subscriptions_export")
  3385.      */
  3386.     public function subscriptionsExportAction(Request $request)
  3387.     {
  3388.         if (!$this->isGranted("ROLE_DPO")) {
  3389.             throw new NotFoundHttpException();
  3390.         }
  3391.         $now = new \DateTime("now");
  3392.         $users $this->entityManager->getRepository(User::class)->findBy([], ["companyName" => "ASC"]);
  3393.         $spreadsheet = new Spreadsheet();
  3394.         $spreadsheet->setActiveSheetIndex(0);
  3395.         $sheet $spreadsheet->getActiveSheet();
  3396.         $sheet->setCellValue('A1''Société');
  3397.         $sheet->setCellValue('B1''Abonnement');
  3398.         $sheet->setCellValue('C1''Début');
  3399.         $sheet->setCellValue('D1''Fin');
  3400.         $sheet->setCellValue('E1''A facturer');
  3401.         $sheet->setCellValue('F1''Informations abonnement');
  3402.         $sheet->setCellValue('G1''Informations facturation');
  3403.         $sheet->setCellValue('H1''Echéance');
  3404.         $sheet->setCellValue('I1''Tarif');
  3405.         $i 2;
  3406.         foreach ($users as $user) {
  3407.             $sheet->setCellValue('A'.$i$user->getCompanyName());
  3408.             if ($user->getCurrentSubscription()) {
  3409.                 $subscription $user->getCurrentSubscription();
  3410.                 $sheet->setCellValue('B'.$i$subscription->getType()?$subscription->getType()->getLibelle():"-");
  3411.                 $sheet->setCellValue('C'.$i$subscription->getBeginDate()?$subscription->getBeginDate()->format("d/m/Y"):"-");
  3412.                 $sheet->setCellValue('D'.$i$subscription->getEndDate()?$subscription->getEndDate()->format("d/m/Y"):"-");
  3413.                 if ($subscription->isActive() && ($subscription->getPaymentUntil() == null || $subscription->getPaymentUntil() < $now)) {
  3414.                     $sheet->setCellValue('E'.$i'OUI');
  3415.                 } else {
  3416.                     $sheet->setCellValue('E'.$i'NON');
  3417.                 }
  3418.                 $sheet->setCellValue('F'.$i$subscription->getOffer());
  3419.                 $sheet->setCellValue('G'.$i$subscription->getBilling());
  3420.                 if ($subscription->getBillingMonths() == 12) {
  3421.                     $sheet->setCellValue('H'.$i'Annuelle');
  3422.                 } elseif ($subscription->getBillingMonths() == 3) {
  3423.                     $sheet->setCellValue('H'.$i'Trimestrielle');
  3424.                 } elseif ($subscription->getBillingMonths() == 1) {
  3425.                     $sheet->setCellValue('H'.$i'Mensuelle');
  3426.                 }
  3427.                 $sheet->setCellValue('I'.$i$subscription->getUnitBillingPrice());
  3428.             }
  3429.             $i++;
  3430.         }
  3431.         $writer = new Xlsx($spreadsheet);
  3432.         $response = new StreamedResponse();
  3433.         $response->setCallback(function () use ($writer) {
  3434.             $writer->save('php://output');
  3435.         });
  3436.         $response->setStatusCode(200);
  3437.         $response->headers->set('Content-Type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  3438.         $response->headers->set('Content-Disposition''attachment;filename="export_abonnements.xlsx"');
  3439.         $response->headers->set('Cache-Control','max-age=0');
  3440.         return $response;
  3441.     }
  3442.     /**
  3443.      * @Route("/subscriptions/{id}", name="subscriptions_user")
  3444.      */
  3445.     public function subscriptionsUserAction(Request $requestUser $user)
  3446.     {
  3447.         if (!$this->isGranted("ROLE_DPO")) {
  3448.             throw new NotFoundHttpException();
  3449.         }
  3450.         $form $this->createFormBuilder()
  3451.             ->add("type"EntityType::class, [
  3452.                 'class' => \App\Entity\SubscriptionType::class,
  3453.                 'attr' => array(
  3454.                     'placeholder' => 'Type d\'abonnement',
  3455.                 ),
  3456.                 'label' => 'Type d\'abonnement',
  3457.                 'expanded' => false,
  3458.                 'multiple' => false,
  3459.                 'required' => true,
  3460.             ])
  3461.             ->getForm();
  3462.         $form->handleRequest($request);
  3463.         if ($form->isSubmitted() && $form->isValid()) {
  3464.             return $this->redirectToRoute("manager_subscriptions_user_add", ["user" => $user->getId(), "subscriptionType" => $form["type"]->getData()->getId()]);
  3465.         }
  3466.         $subscriptions $this->entityManager->getRepository(Subscription::class)->findBy(["user" => $user]);
  3467.         return $this->render('manager/subscriptions_user.html.twig', [
  3468.             "user" => $user,
  3469.             "subscriptions" => $subscriptions,
  3470.             "form" => $form->createView(),
  3471.             "now" => new \DateTime("now")
  3472.         ]);
  3473.     }
  3474.     /**
  3475.      * @Route("/subscriptions/{user}/add/{subscriptionType}", name="subscriptions_user_add")
  3476.      */
  3477.     public function subscriptionsUserAddAction(Request $requestUser $user\App\Entity\SubscriptionType $subscriptionType)
  3478.     {
  3479.         if (!$this->isGranted("ROLE_DPO")) {
  3480.             throw new NotFoundHttpException();
  3481.         }
  3482.         $hasBillingType false;
  3483.         $hasBillingPrice false;
  3484.         $subscription = new Subscription();
  3485.         $subscription->setUser($user);
  3486.         $subscription->setType($subscriptionType);
  3487.         $form $this->createForm(SubscriptionUserType::class, $subscription);
  3488.         $form["subscriptionType"]->setData($subscriptionType->getLibelle());
  3489.         switch ($subscriptionType->getCode()) {
  3490.             case "ABOPLS":
  3491.             case "ABOSTD":
  3492.                 $form->add('billingType'ChoiceType::class, [
  3493.                         'attr' => [
  3494.                             'placeholder' => 'Type de facturation'
  3495.                         ],
  3496.                         'label' => 'Type de facturation',
  3497.                         'choices' => [
  3498.                             "Au mois" => "m",
  3499.                             "Au trimestre" => "t",
  3500.                             "A l'année" => "y",
  3501.                         ],
  3502.                         "data" => "y",
  3503.                         'required' => true,
  3504.                         'mapped' => false
  3505.                     ])
  3506.                     ->add('unitBillingPrice'NumberType::class, [
  3507.                         'attr' => [
  3508.                             'placeholder' => 'Montant HT facturé'
  3509.                         ],
  3510.                         'label' => 'Montant HT facturé (selon type de facturation)',
  3511.                         'data' => 0
  3512.                     ]);
  3513.                 $hasBillingType true;
  3514.                 $hasBillingPrice true;
  3515.                 break;
  3516.             case "ABOLIB":
  3517.                 $form->add('unitBillingPrice'NumberType::class, [
  3518.                         'attr' => [
  3519.                             'placeholder' => 'Montant HT facturé'
  3520.                         ],
  3521.                         'label' => 'Montant HT facturé au mois',
  3522.                         'data' => 0
  3523.                     ]);
  3524.                 $hasBillingPrice true;
  3525.                 break;
  3526.         }
  3527.         $form->handleRequest($request);
  3528.         if ($form->isSubmitted() && $form->isValid()) {
  3529.             $em $this->entityManager;
  3530.             $now = new \DateTime("now");
  3531.             $subscription->setCreationDate($now);
  3532.             $beginDateInput $form['beginDate']->getData();
  3533.             // ✅ Ensure `beginDate` is set to today if empty or null
  3534.             if ($beginDateInput === null || empty($beginDateInput)) {
  3535.                 $beginDate = new \DateTime(); // ✅ Default to today
  3536.             } else {
  3537.                 $beginDate \DateTime::createFromFormat("d/m/Y"$beginDateInput);
  3538.                 if (!$beginDate) {
  3539.                     // If parsing fails, default to today
  3540.                     $beginDate = new \DateTime();
  3541.                 }
  3542.             }
  3543.             
  3544.             // ✅ Set the correct time and assign it to the subscription
  3545.             $beginDate->setTime(000);
  3546.             $subscription->setBeginDate($beginDate);
  3547.             $endDate = clone $beginDate;
  3548.             $endDate->sub(new \DateInterval("P1D"));
  3549.             
  3550.             // ✅ Handle end date based on subscription type
  3551.             switch ($subscriptionType->getCode()) {
  3552.                 case "ABOPLS":
  3553.                 case "ABOSTD":
  3554.                     $subscription->setInvolvementMonths(12);
  3555.                     $endDate->add(new \DateInterval("P1Y"));
  3556.                     break;
  3557.                 case "PARTEN":
  3558.                     $subscription->setInvolvementMonths(12);
  3559.                     $endDate->add(new \DateInterval("P1Y"));
  3560.                     break;
  3561.                 case "ABOLIB":
  3562.                     $subscription->setInvolvementMonths(1);
  3563.                     $endDate->add(new \DateInterval("P1M"));
  3564.                     break;
  3565.                 case "FREE30D":
  3566.                 case "DEMO":
  3567.                     $subscription->setInvolvementMonths(0);
  3568.                     $endDate->add(new \DateInterval("P30D"));
  3569.                     break;
  3570.             }
  3571.             
  3572.             $subscription->setEndDate($endDate);
  3573.             
  3574.             // ✅ Handle billing
  3575.             if ($hasBillingType) {
  3576.                 if ($form['billingType']->getData() == "m") {
  3577.                     $subscription->setBillingMonths(1);
  3578.                 } elseif ($form['billingType']->getData() == "t") {
  3579.                     $subscription->setBillingMonths(3);
  3580.                 } else {
  3581.                     $subscription->setBillingMonths(12);
  3582.                 }
  3583.             } else {
  3584.                 $subscription->setBillingMonths(0);
  3585.             }
  3586.             
  3587.             if (!$hasBillingPrice) {
  3588.                 $subscription->setUnitBillingPrice(0);
  3589.             }
  3590.             
  3591.             $subscription->setActive(true);
  3592.             $em->persist($subscription);
  3593.             $em->flush();
  3594.             
  3595.             // ✅ Update user's current subscription
  3596.             if ($user->getCurrentSubscription()) {
  3597.                 $user->getCurrentSubscription()->setActive(false);
  3598.                 $em->flush();
  3599.             }
  3600.             $user->setCurrentSubscription($subscription);
  3601.             $em->flush();
  3602.             
  3603.             // ✅ Set payment until if unitBillingPrice is 0
  3604.             if ($user->getCurrentSubscription()->getUnitBillingPrice() == 0) {
  3605.                 switch ($user->getCurrentSubscription()->getType()->getCode()) {
  3606.                     case "ABOPLS":
  3607.                     case "ABOSTD":
  3608.                     case "PARTEN":
  3609.                     case "ABOLIB":
  3610.                         $paymentUntil = clone $user->getCurrentSubscription()->getBeginDate();
  3611.                         $paymentUntil->sub(new \DateInterval("P1D"));
  3612.             
  3613.                         if ($user->getCurrentSubscription()->getBillingMonths()) {
  3614.                             $paymentUntil->add(new \DateInterval("P".$user->getCurrentSubscription()->getBillingMonths()."M"));
  3615.                         } else {
  3616.                             $paymentUntil->add(new \DateInterval("P".$user->getCurrentSubscription()->getInvolvementMonths()."M"));
  3617.                         }
  3618.             
  3619.                         $user->getCurrentSubscription()->setPaymentUntil($paymentUntil);
  3620.                         $em->flush();
  3621.                         break;
  3622.                 }
  3623.             }
  3624.             
  3625.             $this->get('session')->getFlashBag()->add('success''Nouvel abonnement ajouté');
  3626.             return $this->redirectToRoute("manager_subscriptions_user", ["id" => $user->getId()]);
  3627.             
  3628.         }
  3629.         return $this->render('manager/subscriptions_user_add.html.twig', [
  3630.             "form" => $form->createView(),
  3631.             "hasBillingType" => $hasBillingType,
  3632.             "hasBillingPrice" => $hasBillingPrice,
  3633.         ]);
  3634.     }
  3635.     /**
  3636.      * @Route("/subscriptions/{user}/disable/{subscription}", name="subscriptions_user_disable")
  3637.      */
  3638.     public function subscriptionsUserDisableAction(Request $requestUser $userSubscription $subscription)
  3639.     {
  3640.         if (!$this->isGranted("ROLE_DPO")) {
  3641.             throw new NotFoundHttpException();
  3642.         }
  3643.         $em $this->entityManager;
  3644.         $subscription->setActive(false);
  3645.         $subscription->setEndDate(new \DateTime("now"));
  3646.         $em->flush();
  3647.         return $this->redirectToRoute("manager_subscriptions_user", ["id" => $user->getId()]);
  3648.     }
  3649.     /**
  3650.      * @Route("/subscriptions/{user}/payment/{subscription}", name="subscriptions_user_payment")
  3651.      */
  3652.     public function subscriptionsUserPaymentAction(Request $requestUser $userSubscription $subscription)
  3653.     {
  3654.         if (!$this->isGranted("ROLE_DPO")) {
  3655.             throw new NotFoundHttpException();
  3656.         }
  3657.     
  3658.         $em $this->entityManager;
  3659.     
  3660.         if ($subscription->getPaymentUntil() === null) {
  3661.             $subscription->setPaymentUntil($subscription->getEndDate());
  3662.             switch ($subscription->getType()->getCode()) {
  3663.                 case "ABOPLS":
  3664.                 case "ABOSTD":
  3665.                 case "PARTEN":
  3666.                     $subscription->getPaymentUntil()->sub(new \DateInterval("P1Y"));
  3667.                     break;
  3668.                 case "ABOLIB":
  3669.                     $subscription->getPaymentUntil()->sub(new \DateInterval("P1M"));
  3670.                     break;
  3671.             }
  3672.         }
  3673.     
  3674.         // Clone current paymentUntil date
  3675.         $paymentUntil = clone $subscription->getPaymentUntil();
  3676.     
  3677.         // Add the billing period (either BillingMonths or InvolvementMonths)
  3678.         if ($subscription->getBillingMonths()) {
  3679.             $paymentUntil->add(new \DateInterval("P".$subscription->getBillingMonths()."M"));
  3680.         } else {
  3681.             $paymentUntil->add(new \DateInterval("P".$subscription->getInvolvementMonths()."M"));
  3682.         }
  3683.     
  3684.         // Update both `paymentUntil` and `endDate`
  3685.         $subscription->setPaymentUntil($paymentUntil);
  3686.         $subscription->setEndDate($paymentUntil); // ✅ Setting `endDate` to next billing date
  3687.     
  3688.         $em->flush();
  3689.     
  3690.         return $this->redirectToRoute("manager_subscriptions_user", ["id" => $user->getId()]);
  3691.     }
  3692.     
  3693.     /**
  3694.      * @Route("/subscriptions/add", name="subscriptions_add")
  3695.      */
  3696.     public function subscriptionsAddAction(Request $request)
  3697.     {
  3698.         if (!$this->isGranted("ROLE_DPO")) {
  3699.             throw new NotFoundHttpException();
  3700.         }
  3701.         $subscription = new Subscription();
  3702.         $form $this->createForm(SubscriptionType::class, $subscription);
  3703.         $form->handleRequest($request);
  3704.         if ($form->isSubmitted() && $form->isValid()) {
  3705.             $em $this->entityManager;
  3706.             $now = new \DateTime("now");
  3707.             $subscription->setCreationDate($now);
  3708.             $endDate = clone $subscription->getBeginDate();
  3709.             $endDate->sub(new \DateInterval("P1D"));
  3710.             if ($form['billingType']->getData() == "m") {
  3711.                 $endDate->add(new \DateInterval("P1M"));
  3712.             } else {
  3713.                 $endDate->add(new \DateInterval("P12M"));
  3714.             }
  3715.             $subscription->setEndDate($endDate);
  3716.             $em->persist($subscription);
  3717.             $em->flush();
  3718.             $this->get('session')->getFlashBag()->add('success''Nouvel abonnement ajouté');
  3719.             return $this->redirectToRoute("manager_subscriptions");
  3720.         }
  3721.         return $this->render('manager/subscriptions_add.html.twig', [
  3722.             "form" => $form->createView(),
  3723.         ]);
  3724.     }
  3725.     /**
  3726.      * @Route("/subscriptions/{id}/edit", name="subscriptions_edit")
  3727.      */
  3728.     public function subscriptionsEditAction(Request $requestSubscription $subscription)
  3729.     {
  3730.         if (!$this->isGranted("ROLE_DPO")) {
  3731.             throw new NotFoundHttpException();
  3732.         }
  3733.         $form $this->createForm(SubscriptionType::class, $subscription);
  3734.         if ($subscription->getBeginDate()->format('Y') != $subscription->getEndDate()->format('Y')) {
  3735.             $form['billingType']->setData('y');
  3736.         } else {
  3737.             $form['billingType']->setData('m');
  3738.         }
  3739.         $form->handleRequest($request);
  3740.         if ($form->isSubmitted() && $form->isValid()) {
  3741.             $em $this->entityManager;
  3742.             $endDate = clone $subscription->getBeginDate();
  3743.             $endDate->sub(new \DateInterval("P1D"));
  3744.             if ($form['billingType']->getData() == "m") {
  3745.                 $endDate->add(new \DateInterval("P1M"));
  3746.             } else {
  3747.                 $endDate->add(new \DateInterval("P12M"));
  3748.             }
  3749.             $subscription->setEndDate($endDate);
  3750.             $em->flush();
  3751.             $this->get('session')->getFlashBag()->add('success''Abonnement modifié');
  3752.             return $this->redirectToRoute("manager_subscriptions");
  3753.         }
  3754.         return $this->render('manager/subscriptions_edit.html.twig', [
  3755.             "form" => $form->createView(),
  3756.         ]);
  3757.     }
  3758.     /**
  3759.      * @Route("/subscriptions/{id}/delete", name="subscriptions_delete")
  3760.      */
  3761.     public function subscriptionsDeleteAction(Request $requestSubscription $subscription)
  3762.     {
  3763.         if (!$this->isGranted("ROLE_DPO")) {
  3764.             throw new NotFoundHttpException();
  3765.         }
  3766.         $em $this->entityManager;
  3767.         $em->remove($subscription);
  3768.         $em->flush();
  3769.         return $this->redirectToRoute("manager_subscriptions");
  3770.     }
  3771.     /**
  3772.      * @Route("/credits/{id}", name="credits_user")
  3773.      */
  3774.     public function creditsUserAction(Request $requestUser $user)
  3775.     {
  3776.         if (!$this->isGranted("ROLE_MANAGER")) {
  3777.             throw new NotFoundHttpException();
  3778.         }
  3779.         $credit = new Credit();
  3780.         $form $this->createFormBuilder($credit)
  3781.             ->add("title"TextType::class, [
  3782.                 'attr' => array(
  3783.                     'placeholder' => 'Action',
  3784.                 ),
  3785.                 'label' => 'Action',
  3786.                 'required' => true,
  3787.             ])
  3788.             ->add("stock"NumberType::class, [
  3789.                 'attr' => array(
  3790.                     'placeholder' => 'Stock',
  3791.                 ),
  3792.                 'label' => 'Stock',
  3793.                 'required' => true,
  3794.             ])
  3795.             ->getForm();
  3796.         $form->handleRequest($request);
  3797.         if ($form->isSubmitted() && $form->isValid()) {
  3798.             $em $this->entityManager;
  3799.             $credit->convertToDecimal(true);
  3800.             $credit->setUser($user);
  3801.             $credit->setManager($this->getUser()->getManager());
  3802.             $credit->setCreationDate(new \DateTime("now"));
  3803.             $em->persist($credit);
  3804.             $em->flush();
  3805.             $user->setCredit($user->getCredit() + $credit->getStock());
  3806.             $em->flush();
  3807.             $this->get('session')->getFlashBag()->add('success''Crédits modifiés');
  3808.             return $this->redirectToRoute("manager_credits_user", ["id" => $user->getId()]);
  3809.         }
  3810.         $credits $this->entityManager->getRepository(Credit::class)->findBy(["user" => $user]);
  3811.         return $this->render('manager/credits_user.html.twig', [
  3812.             "user" => $user,
  3813.             "credits" => $credits,
  3814.             "form" => $form->createView()
  3815.         ]);
  3816.     }
  3817.     /**
  3818.      * @Route("/trainings", name="trainings")
  3819.      */
  3820.     public function trainingsAction(Request $request)
  3821.     {
  3822.         $trainings $this->entityManager->getRepository(Training::class)->findAll();
  3823.         return $this->render('manager/trainings.html.twig', [
  3824.             "trainings" => $trainings
  3825.         ]);
  3826.     }
  3827.     /**
  3828.      * @Route("/trainings/stats", name="trainings_requests_stats")
  3829.      */
  3830.     public function trainingsStatsAction(Request $request)
  3831.     {
  3832.         $training $this->entityManager->getRepository(Training::class)->findOneBy(["id" => $request->get("training")]);
  3833.         if (!$training) {
  3834.             return new JsonResponse([
  3835.                 "success" => false
  3836.             ]);
  3837.         }
  3838.         $questionsChoices = [];
  3839.         $questionsChoicesTotal = [];
  3840.         $questionsCount = [];
  3841.         foreach ($training->getQuestions() as $questionKey => $question) {
  3842.             $questionsChoices[$questionKey] = $question["choices"];
  3843.             $questionsCount[$questionKey] = 0;
  3844.             $questionsChoicesTotal[$questionKey] = [];
  3845.             foreach ($question["choices"] as $choiceKey => $choice) {
  3846.                 $questionsChoicesTotal[$questionKey][$choiceKey] = 0;
  3847.             }
  3848.         }
  3849.         $trainingRequests $this->entityManager->getRepository(TrainingRequest::class)->findForTraining($training);
  3850.         foreach ($trainingRequests as $trainingRequest) {
  3851.             if ($trainingRequest->getAnswerDate()) {
  3852.                 foreach ($training->getQuestions() as $key => $item) {
  3853.                     if (isset($questionsChoices[$key])) {
  3854.                         if ($item["choices"] == $questionsChoices[$key]) {
  3855.                             if (isset($trainingRequest->getUserAnswers()[$key])) {
  3856.                                 $questionsCount[$key] = $questionsCount[$key]+1;
  3857.                                 foreach ($item["choices"] as $choiceKey => $choice) {
  3858.                                     if ($item["multiple"]) {
  3859.                                         if (in_array($choiceKey$trainingRequest->getUserAnswers()[$key])) {
  3860.                                             $questionsChoicesTotal[$key][$choiceKey] = $questionsChoicesTotal[$key][$choiceKey]+1;
  3861.                                         }
  3862.                                     } else {
  3863.                                         if ($choiceKey == $trainingRequest->getUserAnswers()[$key]) {
  3864.                                             $questionsChoicesTotal[$key][$choiceKey] = $questionsChoicesTotal[$key][$choiceKey]+1;
  3865.                                         }
  3866.                                     }
  3867.                                 }
  3868.                             }
  3869.                         }
  3870.                     }
  3871.                 }
  3872.             }
  3873.         }
  3874.         return new JsonResponse([
  3875.             "success" => true,
  3876.             "html" => $this->renderView('manager/includes/training_stats.html.twig', [
  3877.                 "training" => $training,
  3878.                 "questionsChoices" => $questionsChoices,
  3879.                 "questionsChoicesTotal" => $questionsChoicesTotal,
  3880.                 "questionsCount" => $questionsCount,
  3881.             ])
  3882.         ]);
  3883.     }
  3884.     
  3885.     /**
  3886.      * @Route("/trainings/add", name="trainings_add")
  3887.      */
  3888.     public function trainingsAddAction(Request $request)
  3889.     {
  3890.         $training = new Training();
  3891.         $form $this->createForm(TrainingType::class, $training)
  3892.             ->add('users'EntityType::class, [
  3893.                 'attr' => array(
  3894.                     'placeholder' => 'Clients',
  3895.                 ),
  3896.                 'placeholder' => 'Clients',
  3897.                 'label' => 'Clients',
  3898.                 'expanded' => true,
  3899.                 'multiple' => true,
  3900.                 'required' => false,
  3901.                 'class' => User::class,
  3902.                 'query_builder' => function (EntityRepository $er) {
  3903.                     return $er->createQueryBuilder('u')
  3904.                         ->addOrderBy('u.companyName'"ASC");
  3905.                 },
  3906.                 'choice_label' => function(User $user) {
  3907.                     return $user->getCompanyName();
  3908.                 },
  3909.             ]);
  3910.         $form->handleRequest($request);
  3911.         if ($form->isSubmitted() && $form->isValid()) {
  3912.             $em $this->entityManager;
  3913.             $em->persist($training);
  3914.             $training->setAnswered(false);
  3915.             $content = [];
  3916.             $questions $_POST['form_items']??[];
  3917.             $questions array_values($questions);
  3918.             if (count($questions)) {
  3919.                 foreach ($questions as $question) {
  3920.                     $content[] = [
  3921.                         'title' => $question[0]??null,
  3922.                         'choices' => explode("\n"str_replace("\r"""$question[1]??null)),
  3923.                      'multiple' => isset($question[2]) && $question[2] == true false,
  3924.                         'links' => explode("\n"str_replace("\r"""$question[3]??null)),
  3925.                         'explanations' => $question[4]??null,
  3926.                     ];
  3927.                 }
  3928.             }
  3929.             $training->setQuestions($content);
  3930.             $em->flush();
  3931.             /**
  3932.              * @var UploadedFile $file
  3933.              */
  3934.             $file $form->get('pictureFile')->getData();
  3935.             if ($file != NULL) {
  3936.                 $fileName "t".$training->getId()."_".md5(uniqid()) . '.' $file->guessExtension();
  3937.                 $file->move(
  3938.                     $this->getParameter('pictures_directory'), $fileName
  3939.                 );
  3940.                 $training->setPicture($fileName);
  3941.                 $em->flush();
  3942.             }
  3943.             $this->get('session')->getFlashBag()->add('success''Nouveau questionnaire créé');
  3944.             return $this->redirectToRoute("manager_trainings");
  3945.         }
  3946.         $users = [];
  3947.         $usersStr = [];
  3948.         foreach ($training->getUsers() as $user) {
  3949.             $users[] = $user->getId();
  3950.             $usersStr[] = $user->getCompanyName();
  3951.         }
  3952.         sort($usersStr);
  3953.         return $this->render('manager/trainings_add.html.twig', [
  3954.             "form" => $form->createView(),
  3955.             "users" => $users,
  3956.             "usersStr" => $usersStr,
  3957.         ]);
  3958.     }
  3959.     /**
  3960.      * @Route("/trainings/{id}/edit", name="trainings_edit")
  3961.      */
  3962.     public function trainingsEditAction(Request $requestTraining $training)
  3963.     {
  3964.         $form $this->createForm(TrainingType::class, $training)
  3965.             ->add('users'EntityType::class, [
  3966.                 'attr' => array(
  3967.                     'placeholder' => 'Clients',
  3968.                 ),
  3969.                 'placeholder' => 'Clients',
  3970.                 'label' => 'Clients',
  3971.                 'expanded' => true,
  3972.                 'multiple' => true,
  3973.                 'required' => false,
  3974.                 'class' => User::class,
  3975.                 'query_builder' => function (EntityRepository $er) {
  3976.                     return $er->createQueryBuilder('u')
  3977.                         ->addOrderBy('u.companyName'"ASC");
  3978.                 },
  3979.                 'choice_label' => function(User $user) {
  3980.                     return $user->getCompanyName();
  3981.                 },
  3982.             ]);
  3983.     
  3984.         $form->handleRequest($request);
  3985.     
  3986.         if ($form->isSubmitted() && $form->isValid()) {
  3987.             $em $this->entityManager;
  3988.     
  3989.             $existingQuestions $training->getQuestions(); // Store existing questions
  3990.             $newQuestions $existingQuestions// Start with existing questions
  3991.     
  3992.             $questions_edit $_POST['form_e_items'] ?? [];
  3993.             $questions_edit array_values($questions_edit);
  3994.     
  3995.             $questionsModified false// Track if questions were modified
  3996.     
  3997.             foreach ($newQuestions as $keyItem => $question) {
  3998.                 if (isset($questions_edit[$keyItem])) {
  3999.                     $updatedQuestion = [
  4000.                         'title' => $questions_edit[$keyItem][0] ?? null,
  4001.                         'choices' => explode("\n"str_replace("\r"""$questions_edit[$keyItem][1] ?? null)),
  4002.                         'multiple' => $questions_edit[$keyItem][2] == true false,
  4003.                         'links' => explode("\n"str_replace("\r"""$questions_edit[$keyItem][3] ?? null)),
  4004.                         'explanations' => $questions_edit[$keyItem][4] ?? null,
  4005.                     ];
  4006.     
  4007.                     if (count($updatedQuestion['links']) == && $updatedQuestion['links'][0] == "") {
  4008.                         $updatedQuestion['links'] = [];
  4009.                     }
  4010.     
  4011.                     // Use helper function to check for modifications
  4012.                     if ($this->isQuestionModified($question$updatedQuestion)) {
  4013.                         $newQuestions[$keyItem] = $updatedQuestion;
  4014.                         $questionsModified true;
  4015.                     }
  4016.                 } else {
  4017.                     unset($newQuestions[$keyItem]); // Remove question
  4018.                     $questionsModified true;
  4019.                 }
  4020.             }
  4021.     
  4022.             $questions $_POST['form_items'] ?? [];
  4023.             $questions array_values($questions);
  4024.     
  4025.             if (count($questions)) {
  4026.                 foreach ($questions as $question) {
  4027.                     $newQuestions[] = [
  4028.                         'title' => $question[0] ?? null,
  4029.                         'choices' => explode("\n"str_replace("\r"""$question[1] ?? null)),
  4030.                         'multiple' => $question[2] == true false,
  4031.                         'links' => explode("\n"str_replace("\r"""$question[3] ?? null)),
  4032.                         'explanations' => $question[4] ?? null,
  4033.                     ];
  4034.                 }
  4035.                 $questionsModified true;
  4036.             }
  4037.     
  4038.             // **Only update questions if something actually changed**
  4039.             if ($questionsModified) {
  4040.                 $training->setQuestions($newQuestions);
  4041.                
  4042.             } else {
  4043.                 $training->setQuestions($existingQuestions); // Keep old questions if unchanged
  4044.             }
  4045.     
  4046.             $em->flush();
  4047.     
  4048.             /**
  4049.              * @var UploadedFile $file
  4050.              */
  4051.             $file $form->get('pictureFile')->getData();
  4052.             if ($file != NULL) {
  4053.                 $fileName "t" $training->getId() . "_" md5(uniqid()) . '.' $file->guessExtension();
  4054.     
  4055.                 $file->move(
  4056.                     $this->getParameter('pictures_directory'), $fileName
  4057.                 );
  4058.     
  4059.                 $training->setPicture($fileName);
  4060.                 $training->setAnswered(true);
  4061.                 $em->flush();
  4062.             }
  4063.     
  4064.             $this->get('session')->getFlashBag()->add('success''Questionnaire mis à jour');
  4065.             return $this->redirectToRoute("manager_trainings");
  4066.         }
  4067.     
  4068.         $users = [];
  4069.         $usersStr = [];
  4070.     
  4071.         foreach ($training->getUsers() as $user) {
  4072.             $users[] = $user->getId();
  4073.             $usersStr[] = $user->getCompanyName();
  4074.         }
  4075.     
  4076.         sort($usersStr);
  4077.     
  4078.         return $this->render('manager/trainings_edit.html.twig', [
  4079.             "form" => $form->createView(),
  4080.             "training" => $training,
  4081.             "users" => $users,
  4082.             "usersStr" => $usersStr,
  4083.         ]);
  4084.     }
  4085.     
  4086.     
  4087.     
  4088.     /**
  4089.      * @Route("/trainings/{id}/answer", name="trainings_answer")
  4090.      */
  4091.     public function trainingsAnswerAction(Request $requestTraining $training)
  4092.     {
  4093.         $form $this->createFormBuilder();
  4094.         foreach ($training->getQuestions() as $key => $question) {
  4095.             $choices = [];
  4096.             foreach ($question["choices"] as $choiceKey => $choiceValue) {
  4097.                 $choices[$choiceValue] = $choiceKey;
  4098.             }
  4099.             $answerData $training->getAnswers()[$key]??null;
  4100.             if ($question["multiple"]) {
  4101.                 if ($answerData != null) {
  4102.                     if (!is_array($answerData)) {
  4103.                         $answerData = [$answerData];
  4104.                     }
  4105.                 } else {
  4106.                     $answerData = [];
  4107.                 }
  4108.             } else {
  4109.                 if (is_array($answerData)) {
  4110.                     $answerData $answerData[0];
  4111.                 }
  4112.             }
  4113.             $form->add("question_".$keyChoiceType::class, [
  4114.                 "choices" => $choices,
  4115.                 "expanded" => true,
  4116.                 "multiple" => $question["multiple"],
  4117.                 "data" => $answerData
  4118.             ]);
  4119.         }
  4120.         $form $form->getForm();
  4121.         $form->handleRequest($request);
  4122.         if ($form->isSubmitted() && $form->isValid()) {
  4123.             $em $this->entityManager;
  4124.             $training->setAnswered(true);
  4125.             $answers = [];
  4126.             foreach ($training->getQuestions() as $key => $question) {
  4127.                 $answers[$key] = $form["question_".$key]->getData();
  4128.             }
  4129.             $training->setAnswers($answers);
  4130.             $em->flush();
  4131.             $this->get('session')->getFlashBag()->add('success''Questionnaire répondu');
  4132.             return $this->redirectToRoute("manager_trainings");
  4133.         }
  4134.         return $this->render('manager/trainings_answer.html.twig', [
  4135.             "form" => $form->createView(),
  4136.             "training" => $training
  4137.         ]);
  4138.     }
  4139.     /**
  4140.      * @Route("/trainings/{id}/translate/{_locale}", name="trainings_translate")
  4141.      */
  4142.     public function trainingsTranslateAction(Request $requestTraining $training)
  4143.     {
  4144.         $em $this->entityManager;
  4145.         $repository $em->getRepository('Gedmo\Translatable\Entity\Translation');
  4146.         $translations $repository->findTranslations($training);
  4147.         if (!isset($translations[$request->get("_locale")])) {
  4148.             return $this->redirectToRoute("manager_trainings_gen_translate", ["id" => $training->getId(), "_locale" => "fr""locale" => $request->get("_locale")]);
  4149.         }
  4150.         $training $em->find(Training::class, $request->get("id"));
  4151.         $form $this->createForm(TrainingTranslateType::class, $training);
  4152.         $form->handleRequest($request);
  4153.         if ($form->isSubmitted() && $form->isValid()) {
  4154.             $content $training->getQuestions();
  4155.             $questions_edit $_POST['form_e_items']??[];
  4156.             $questions_edit array_values($questions_edit);
  4157.             foreach ($content as $keyItem => $question) {
  4158.                 if (count($questions_edit)) {
  4159.                     if (isset($questions_edit[$keyItem])) {
  4160.                         $content[$keyItem]['title'] = $questions_edit[$keyItem][0]??null;
  4161.                         $content[$keyItem]['choices'] = explode("\n"str_replace("\r"""$questions_edit[$keyItem][1]??null));
  4162.                         $content[$keyItem]['links'] = explode("\n"str_replace("\r"""$questions_edit[$keyItem][3]??null));
  4163.                         $content[$keyItem]['explanations'] = $questions_edit[$keyItem][4]??null;
  4164.                         if (count($content[$keyItem]['links']) == 1) {
  4165.                             if ($content[$keyItem]['links'][0] == "") {
  4166.                                 $content[$keyItem]['links'] = [];
  4167.                             }
  4168.                         }
  4169.                     }
  4170.                 }
  4171.             }
  4172.             $training->setQuestions($content);
  4173.             $em->persist($training);
  4174.             $em->flush();
  4175.             $this->get('session')->getFlashBag()->add('success''Traduction du questionnaire mis à jour');
  4176.             return $this->redirectToRoute("manager_trainings");
  4177.         }
  4178.         return $this->render('manager/trainings_translate.html.twig', [
  4179.             "form" => $form->createView(),
  4180.             "training" => $training,
  4181.         ]);
  4182.     }
  4183.     /**
  4184.      * @Route("/trainings/{id}/gentranslate/{locale}_{_locale}", name="trainings_gen_translate")
  4185.      */
  4186.     public function trainingsGanTranslateAction(Request $requestTraining $training$locale$_locale)
  4187.     {
  4188.         $em $this->entityManager;
  4189.         $repository $em->getRepository('Gedmo\Translatable\Entity\Translation');
  4190.         $translations $repository->findTranslations($training);
  4191.         if (!isset($translations[$locale])) {
  4192.             $repository
  4193.                 ->translate($training'title'$locale$training->getTitle())
  4194.                 ->translate($training'questions'$locale$training->getQuestions())
  4195.             ;
  4196.             $em->persist($training);
  4197.             $em->flush();
  4198.             return $this->redirectToRoute("manager_trainings_translate", ["id" => $training->getId(), "_locale" => $locale]);
  4199.         }
  4200.         return $this->redirectToRoute("manager_trainings");
  4201.     }
  4202.     /**
  4203.      * @Route("/trainings/{id}/delete", name="trainings_delete")
  4204.      */
  4205.     public function trainingsDeleteAction(Request $requestTraining $training)
  4206.     {
  4207.         $em $this->getDoctrine()->getManager();
  4208.         $em->remove($training);
  4209.         $em->flush();
  4210.         $this->get('session')->getFlashBag()->add('success''Questionnaire supprimé');
  4211.         return $this->redirectToRoute("manager_trainings");
  4212.     }
  4213.     /**
  4214.      * @Route("/treatments/gentranslations/{locale}", name="treatments_gen_translations")
  4215.      */
  4216.     public function treatmentsGanTranslationsAction(Request $request$locale)
  4217.     {
  4218.         $em $this->getDoctrine()->getManager();
  4219.         $treatments $em->getRepository(TreatmentStd::class)->findBy(["user" => null]);
  4220.         foreach ($treatments as $treatment) {
  4221.             $repository $em->getRepository('Gedmo\Translatable\Entity\Translation');
  4222.             $translations $repository->findTranslations($treatment);
  4223.             if (!isset($translations[$locale])) {
  4224.                 $repository
  4225.                     ->translate($treatment'name''en'$treatment->getName())
  4226.                     ->translate($treatment'mainPurpose''en'$treatment->getMainPurpose())
  4227.                     ->translate($treatment'purpose1''en'$treatment->getPurpose1())
  4228.                     ->translate($treatment'purpose2''en'$treatment->getPurpose2())
  4229.                     ->translate($treatment'purpose3''en'$treatment->getPurpose3())
  4230.                     ->translate($treatment'purpose4''en'$treatment->getPurpose4())
  4231.                     ->translate($treatment'purpose5''en'$treatment->getPurpose5())
  4232.                     ->translate($treatment'othersPurpose''en'$treatment->getOthersPurpose())
  4233.                     ->translate($treatment'description''en'$treatment->getDescription())
  4234.                     ->translate($treatment'personalData''en'$treatment->getPersonalData())
  4235.                     ->translate($treatment'peopleData''en'$treatment->getPeopleData())
  4236.                     ->translate($treatment'transferOutsideUeCountries''en'$treatment->getTransferOutsideUeCountries())
  4237.                     ->translate($treatment'consentHow''en'$treatment->getConsentHow())
  4238.                     ->translate($treatment'legalBasis''en'$treatment->getLegalBasis())
  4239.                     ->translate($treatment'dataSource''en'$treatment->getDataSource())
  4240.                 ;
  4241.                 $em->persist($treatment);
  4242.                 $em->flush();
  4243.             }
  4244.         }
  4245.         return $this->redirectToRoute("manager_treatments");
  4246.     }
  4247.     /**
  4248.      * @Route("/substitute/{account}", name="substitute")
  4249.      */
  4250.     public function substituteAction(Request $requestAccount $account)
  4251.     {
  4252.         if ($this->getUser()->getId() == 1) {
  4253.             $session $this->get('session');
  4254.             $firewall 'main';
  4255.             $token = new UsernamePasswordToken($accountnull$firewall$account->getRoles());
  4256.             $this->get('security.token_storage')->setToken($token);
  4257.             $session->set('_security_'.$firewallserialize($token));
  4258.             $event = new InteractiveLoginEvent($request$token);
  4259.             $this->get("event_dispatcher")->dispatch("security.interactive_login"$event);
  4260.             return $this->redirectToRoute("default_homepage");
  4261.         }
  4262.         throw new NotFoundHttpException();
  4263.     }
  4264.     /**
  4265.      * @Route("/json/users", name="json_users")
  4266.      */
  4267.     public function jsonUsersAction(Request $request)
  4268.     {
  4269.         $users $this->getDoctrine()->getRepository(User::class)->findBy([], ["companyName" => "ASC"]);
  4270.         $returnResponse = [];
  4271.         foreach ($users as $user) {
  4272.             $returnResponse[] = [
  4273.                 "id" => $user->getId(),
  4274.                 "text" => $user->getCompanyName(),
  4275.             ];
  4276.         }
  4277.         return new JsonResponse($returnResponse);
  4278.     }
  4279. }