src/Service/UserService.php line 104

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: rostandnj
  5.  * Date: 13/3/19
  6.  * Time: 2:02 PM
  7.  */
  8. namespace App\Service;
  9. use App\Entity\ActeurExterne;
  10. use App\Entity\ArchiveLocation;
  11. use App\Entity\Article;
  12. use App\Entity\Boite;
  13. use App\Entity\Bordereau;
  14. use App\Entity\CadreClassement;
  15. use App\Entity\Comment;
  16. use App\Entity\Courrier;
  17. use App\Entity\CourrierCollaborateur;
  18. use App\Entity\Courtier;
  19. use App\Entity\DemandeArchive;
  20. use App\Entity\Document;
  21. use App\Entity\DocumentPartage;
  22. use App\Entity\Dossier;
  23. use App\Entity\DossierDemande;
  24. use App\Entity\DossierWorkgroup;
  25. use App\Entity\DureeDossier;
  26. use App\Entity\Elimination;
  27. use App\Entity\EmpruntArchive;
  28. use App\Entity\Etagere;
  29. use App\Entity\Fichier;
  30. use App\Entity\Log;
  31. use App\Entity\Message;
  32. use App\Entity\News;
  33. use App\Entity\Notification;
  34. use App\Entity\Operation;
  35. use App\Entity\PieceJointe;
  36. use App\Entity\PieceJointeAjoutee;
  37. use App\Entity\Priorite;
  38. use App\Entity\Rayon;
  39. use App\Entity\RegisterItem;
  40. use App\Entity\RegleConservation;
  41. use App\Entity\Relance;
  42. use App\Entity\Repertoire;
  43. use App\Entity\RepertoirePartage;
  44. use App\Entity\Salle;
  45. use App\Entity\Save;
  46. use App\Entity\Service;
  47. use App\Entity\Statut;
  48. use App\Entity\System;
  49. use App\Entity\Tache;
  50. use App\Entity\TypeActeur;
  51. use App\Entity\TypeConfidentialite;
  52. use App\Entity\TypeCourrier;
  53. use App\Entity\TypeDossier;
  54. use App\Entity\TypeTache;
  55. use App\Entity\UserWorkgroup;
  56. use App\Entity\Workgroup;
  57. use BackupManager\Filesystems\Destination;
  58. use BackupManager\Manager;
  59. use Doctrine\DBAL\ConnectionException;
  60. use Doctrine\ORM\EntityManagerInterface;
  61. use Firebase\JWT\JWT;
  62. use Lcobucci\JWT\Builder;
  63. use Lcobucci\JWT\Signer\Hmac\Sha256;
  64. use Symfony\Component\DependencyInjection\ContainerInterface;
  65. use Symfony\Component\HttpFoundation\RequestStack;
  66. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  67. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  68. use Symfony\Component\Security\Core\Security;
  69. use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface;
  70. use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
  71. use Symfony\Component\Filesystem\Filesystem;
  72. use FOS\ElasticaBundle\Persister\ObjectPersister;
  73. use App\Entity\User;
  74. use App\Entity\Role;
  75. use App\Entity\File;
  76. use Webklex\PHPIMAP\ClientManager;
  77. use Webklex\PHPIMAP\Folder;
  78. use App\Service\OpenProjectService;
  79. class UserService
  80. {
  81.     private $em;
  82.     private $container;
  83.     private $encoder;
  84.     private $jwt;
  85.     private $currenUser;
  86.     private $currentUser;
  87.     private $hash;
  88.     private $backupManager;
  89.     private  $indexer;
  90.     private Security $security;
  91.     private UrlGeneratorInterface $urlGenerator;
  92.     private RequestStack $requestStack;
  93.     private OpenProjectService $openProjectService;
  94.     private UserPasswordHasherInterface $passwordHasher;
  95.     public function __construct(EntityManagerInterface $em,ContainerInterface $c,Manager $backupManager,
  96.                                 UserPasswordHasherInterface $passwordEncoder,JWTTokenManagerInterface $jwt, Security $security,RequestStack $requestStack,
  97.                                 OpenProjectService $openProjectService, UserPasswordHasherInterface $passwordHasher)
  98.     {
  99.         $this->hash = new HashService($c);
  100.         $this->backupManager = $backupManager;
  101.         $this->em = $em;
  102.         $this->container = $c;
  103.         $this->encoder = $passwordEncoder;
  104.         $this->jwt = $jwt;
  105.         $this->security = $security;
  106.         $this->currenUser = $this->security->getUser();
  107.         $this->currentUser = $this->security->getUser();
  108.         if(is_string($this->currenUser)) $this->currenUser = null;
  109.         $this->indexer = $this->container->get("fos_elastica.object_persister.app.dossiers");
  110.         $this->urlGenerator = $this->container->get('router');
  111.         $this->requestStack = $requestStack;
  112.         $this->openProjectService = $openProjectService;
  113.         $this->passwordHasher = $passwordHasher;
  114.     }
  115.     public function getRandom(int $n)
  116.     {
  117.         $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  118.         $numbers='0123456789';
  119.         $maj='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  120.         $randomString = '';
  121.         for ($i = 0; $i < $n; $i++) {
  122.             if($i ==$n-1)
  123.             {
  124.                 $index = rand(0, strlen($numbers) - 1);
  125.                 $randomString .= $numbers[$index];
  126.             }
  127.             else if($i==$n)
  128.             {
  129.                 $index = rand(0, strlen($maj) - 1);
  130.                 $randomString .= $maj[$index];
  131.             }
  132.             else
  133.             {
  134.                 $index = rand(0, strlen($characters) - 1);
  135.                 $randomString .= $characters[$index];
  136.             }
  137.         }
  138.         return $randomString;
  139.     }
  140.     private function passwordStrength(string $password) {
  141.         $returnVal = true;
  142.         if ( strlen($password) < 8 ) {
  143.             $returnVal = false;
  144.         }
  145.         if ( !preg_match("#[0-9]+#", $password) ) {
  146.             $returnVal = false;
  147.         }
  148.         /* if ( !preg_match("#[a-z]+#", $password) ) {
  149.              $returnVal = False;
  150.          }*/
  151.         if ( !preg_match("#[A-Z]+#", $password) ) {
  152.             $returnVal = false;
  153.         }
  154.         /*if ( !preg_match("/[\'^£$%&*()}{@#~?><>,|=_+!-]/", $password) ) {
  155.             $returnVal = False;
  156.         }*/
  157.         return $returnVal;
  158.     }
  159.     private function verifyBasicInfo(array $data)
  160.     {
  161.         $requireField =["nom","prenom","fonction","telephone","email","gender","service_id","role","level"];
  162.         foreach ($requireField as $el)
  163.         {
  164.             if(!array_key_exists($el,$data))
  165.             {
  166.                 return ["message"=>$el." field is required","statut"=>false,"code"=>"FIELD_REQUIRED"];
  167.             }
  168.         }
  169.         if(!filter_var($data["email"], FILTER_VALIDATE_EMAIL))
  170.         {
  171.             return ["message"=>"invalid_email","statut"=>false,"code"=>"EMAIL_INVALID"];
  172.         }
  173.         /* if($this->passwordStrength($data["password"])==false)
  174.          {
  175.              return ["message"=>"invalid_password","statut"=>false,"code"=>"PASSWORD_PATTERN"];
  176.          }*/
  177.         if(strlen($data["nom"])<1)
  178.         {
  179.             return ["message"=>"name field empty","statut"=>false,"code"=>"NAME_SHORT"];
  180.         }
  181.         if(strlen($data["fonction"])<1)
  182.         {
  183.             return ["message"=>"fonction field empty","statut"=>false,"code"=>"FONCTION_SHORT"];
  184.         }
  185.         if(strlen($data["telephone"])<1)
  186.         {
  187.             return ["message"=>"invalid_phone","statut"=>false,"code"=>"PHONE_LENGTH"];
  188.         }
  189.        /* if (!preg_match('/^[0-9]+$/', $data["telephone"]))
  190.         {
  191.             return ["message"=>"invalid_phone","statut"=>false,"code"=>"PHONE_NUMBER"];
  192.         }*/
  193.         if(!in_array($data["gender"],[0,1]))
  194.         {
  195.             return ["message"=>"invalid_gender","statut"=>false,"code"=>"GENDER_INVALID"];
  196.         }
  197.         if(!in_array($data["role"],[0,1,2,3,4]))
  198.         {
  199.             return ["message"=>"invalid_role","statut"=>false,"code"=>"ROLE_INVALID"];
  200.         }
  201.         $user = $this->em->getRepository(User::class)->findOneBy(array("email"=>$data["email"]));
  202.         if(!is_null($user))  return ["message"=>$this->container->get('translator')->trans("email_already_used"),"statut"=>false,"code"=>"EMAIL_USED"];
  203.         $user = $this->em->getRepository(User::class)->findOneBy(array("telephone"=>$data["telephone"]));
  204.         if(!is_null($user))  return ["message"=>$this->container->get('translator')->trans("phone_already_used"),"statut"=>false,"code"=>"PHONE_USED"];
  205.         $service = $this->em->getRepository(Service::class)->findOneBy(array("id"=>$data["service_id"]));
  206.         if(is_null($service)) return ["message"=>"service not found","statut"=>false,"code"=>"SERVICE_NOT_FOUND"];
  207.         else{
  208.             $data["service"] = $service;
  209.         }
  210.         return ["message"=>"","statut"=>true,"data"=>$data];
  211.     }
  212.     private function verifyBasicInfo2(array $data)
  213.     {
  214.         $requireField =["id","nom","prenom","fonction","telephone","email","gender","service_id","role","level"];
  215.         foreach ($requireField as $el)
  216.         {
  217.             if(!array_key_exists($el,$data))
  218.             {
  219.                 return ["message"=>$el." field is required","statut"=>false,"code"=>"FIELD_REQUIRED"];
  220.             }
  221.         }
  222.         if(!filter_var($data["email"], FILTER_VALIDATE_EMAIL))
  223.         {
  224.             return ["message"=>"invalid_email","statut"=>false,"code"=>"EMAIL_INVALID"];
  225.         }
  226.         /* if($this->passwordStrength($data["password"])==false)
  227.          {
  228.              return ["message"=>"invalid_password","statut"=>false,"code"=>"PASSWORD_PATTERN"];
  229.          }*/
  230.         if(strlen($data["nom"])<1)
  231.         {
  232.             return ["message"=>"name field empty","statut"=>false,"code"=>"NAME_SHORT"];
  233.         }
  234.         if(strlen($data["fonction"])<1)
  235.         {
  236.             return ["message"=>"fonction field empty","statut"=>false,"code"=>"FONCTION_SHORT"];
  237.         }
  238.         if(strlen($data["telephone"])==0)
  239.         {
  240.             return ["message"=>"invalid_phone","statut"=>false,"code"=>"PHONE_LENGTH"];
  241.         }
  242.         /*if (!preg_match('/^[0-9]+$/', $data["telephone"]))
  243.         {
  244.             return ["message"=>"invalid_phone","statut"=>false,"code"=>"PHONE_NUMBER"];
  245.         }*/
  246.         if(!in_array($data["gender"],[0,1]))
  247.         {
  248.             return ["message"=>"invalid_gender","statut"=>false,"code"=>"GENDER_INVALID"];
  249.         }
  250.         if(!in_array($data["role"],[0,1,2,3,4]))
  251.         {
  252.             return ["message"=>"invalid_role","statut"=>false,"code"=>"ROLE_INVALID"];
  253.         }
  254.         $user = $this->em->getRepository(User::class)->findOneBy(array("email"=>$data["email"]));
  255.         if(!is_null($user) && $user->getEmail()!=$data["email"])  return ["message"=>"email_already_used","statut"=>false,"code"=>"EMAIL_USED"];
  256.         $user = $this->em->getRepository(User::class)->findOneBy(array("telephone"=>$data["telephone"]));
  257.         if(!is_null($user) && $user->getTelephone()!=$data["telephone"])  return ["message"=>"phone_already_used","statut"=>false,"code"=>"PHONE_USED"];
  258.         $service = $this->em->getRepository(Service::class)->findOneBy(array("id"=>$data["service_id"]));
  259.         if(is_null($service)) return ["message"=>"service not found","statut"=>false,"code"=>"SERVICE_NOT_FOUND"];
  260.         else{
  261.             $data["service"] = $service;
  262.         }
  263.         $user = $this->em->getRepository(User::class)->findOneBy(array("id"=>$data["id"]));
  264.         if(is_null($user)) return ["message"=>"user_not_found","statut"=>false,"code"=>"USER_NOT_FOUND"];
  265.         return ["message"=>"","statut"=>true,"data"=>$data,"user"=>$user];
  266.     }
  267.     private function hydrateBasicInfo(array $data)
  268.     {
  269.         $user = new User();
  270.         $user->setNom($data["nom"]);
  271.         $user->setPrenom($data["prenom"]);
  272.         $user->setEmail($data["email"]);
  273.         $user->setTelephone($data["telephone"]);
  274.         $user->setFonction($data["fonction"]);
  275.         $user->setGender($data["gender"]);
  276.         $user->setLevel($data["level"]);
  277.         switch ((int)$data["role"])
  278.         {
  279.             case User::ROLE_ADMIN:
  280.                 $user->setType(User::ROLE_ADMIN);
  281.                 break;
  282.             case User::ROLE_USER:
  283.                 $user->setType(User::ROLE_USER);
  284.                 break;
  285.             case User::ROLE_MANAGER:
  286.                 $user->setType(User::ROLE_MANAGER);
  287.                 break;
  288.             case User::ROLE_TRAINEE:
  289.                 $user->setType(User::ROLE_TRAINEE);
  290.                 break;
  291.             default:
  292.                 $user->setType(User::USER);
  293.                 break;
  294.         }
  295.         $user->setIsClose(false);
  296.         $user->setIsActive(true);
  297.         $p = $this->getRandom(8);
  298.         $user->setPassword($this->passwordHasher->hashPassword($user,$p));
  299.         $user->setNewPassword($p);
  300.         $user->setService($data["service"]);
  301.         $user->setGender((boolean)$data["gender"]);
  302.         $user->setNewPassword($p);
  303.         return $user;
  304.     }
  305.     private function hydrateBasicInfo2(array $data,User $user)
  306.     {
  307.         $user->setNom($data["nom"]);
  308.         $user->setPrenom($data["prenom"]);
  309.         $user->setEmail($data["email"]);
  310.         $user->setTelephone($data["telephone"]);
  311.         $user->setFonction($data["fonction"]);
  312.         $user->setGender($data["gender"]);
  313.         $user->setLevel($data["level"]);
  314.         switch ((int)$data["role"])
  315.         {
  316.             case User::ROLE_ADMIN:
  317.                 $user->setType(User::ROLE_ADMIN);
  318.                 break;
  319.             case User::ROLE_USER:
  320.                 $user->setType(User::ROLE_USER);
  321.                 break;
  322.             case User::ROLE_MANAGER:
  323.                 $user->setType(User::ROLE_MANAGER);
  324.                 break;
  325.             case User::ROLE_TRAINEE:
  326.                 $user->setType(User::ROLE_TRAINEE);
  327.                 break;
  328.             default:
  329.                 $user->setType(User::USER);
  330.                 break;
  331.         }
  332.         $user->setIsClose(false);
  333.         $user->setIsActive(true);
  334.         //$p = $this->getRandom(8);
  335.         //$user->setPassword($this->passwordHasher->hashPassword($user,$p));
  336.         //$user->setNewPassword($p);
  337.         $user->setService($data["service"]);
  338.         $user->setGender((boolean)$data["gender"]);
  339.         //$user->setNewPassword($p);
  340.         return $user;
  341.     }
  342.     public function createUser(array $data)
  343.     {
  344.         $result = $this->verifyBasicInfo($data);
  345.         if($result["statut"]==false)
  346.         {
  347.             return $result;
  348.         }
  349.         else
  350.         {
  351.             $user = $this->hydrateBasicInfo($result["data"]);
  352.             $this->em->persist($user);
  353.             $this->em->flush();
  354.             $log = new Log();
  355.             $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT12'));
  356.             if(!is_null($operation))
  357.             {
  358.                 $log->setOperation($operation);
  359.                 $log->setUser($this->currenUser);
  360.                 $log->setObservation($user->getId());
  361.                 $this->em->persist($log);
  362.                 $this->em->flush();
  363.             }
  364.             $filesystem = new Filesystem();
  365.             if(!$filesystem->exists(__DIR__.'/../../public/USER/user'.$user->getId())){
  366.                 try {
  367.                     $filesystem->mkdir(__DIR__.'/../../public/USER/user'.$user->getId(),0777);
  368.                 } catch (IOExceptionInterface $exception) {
  369.                     return ["message"=>"An error occurred while creating your directory at ".$exception->getPath(),"statut"=>false,"code"=>401,"data"=>""];
  370.                 }
  371.             }
  372.             // Create user in OpenProject if integration is enabled
  373.             // The plain password is stored in newPassword during hydrateBasicInfo
  374.             if ($user->getNewPassword()) {
  375.                 $this->syncUserToOpenProject($user, $user->getNewPassword());
  376.             }
  377.             return ["message"=>"","statut"=>true,"data"=>$user->toArray()];
  378.         }
  379.     }
  380.     public function getUserByEmail(string $email)
  381.     {
  382.         $user = $this->em->getRepository(User::class)->findOneBy(array("email"=>$email));
  383.         return $user;
  384.     }
  385.     public function getUserById(int $id)
  386.     {
  387.         $user = $this->em->getRepository(User::class)->findOneBy(array("id"=>$id));
  388.         return $user;
  389.     }
  390.     public function updateProfile(User $user,string $type,array $data)
  391.     {
  392.         switch ($type)
  393.         {
  394.             case "picture":
  395.                 if(!array_key_exists("file",$data)) return ["message"=>"file field is required","statut"=>false,"data"=>"","code"=>401];
  396.                 $required =["name","size","extension","type","path"];
  397.                 foreach ($required as $key=>$el)
  398.                 {
  399.                     if(!array_key_exists($el,$data["file"]))
  400.                     {
  401.                         return ["message"=>$el." field is required","statut"=>false,"data"=>"","code"=>401];
  402.                     }
  403.                 }
  404.                 $file = $user->getPicture();
  405.                 if(is_null($file)) $file = new File();
  406.                 $file->setIsActive(true);
  407.                 $file->setName($data["file"]["name"]);
  408.                 $file->setPath($data["file"]["path"]);
  409.                 $file->setSize($data["file"]["size"]);
  410.                 $file->setType($data["file"]["type"]);
  411.                 $file->setExtension($data["file"]["extension"]);
  412.                 $file->setIsProfile(true);
  413.                 $file->setDate(new \DateTime());
  414.                 $user->setPicture($file);
  415.                 $this->em->persist($user);
  416.                 $this->em->flush();
  417.                 $log = new Log();
  418.                 $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT05'));
  419.                 if(!is_null($operation))
  420.                 {
  421.                     $log->setOperation($operation);
  422.                     $log->setUser($this->currenUser);
  423.                     $log->setObservation($user->getId());
  424.                     $this->em->persist($log);
  425.                     $this->em->flush();
  426.                 }
  427.                 return ["message"=>"picture updated","statut"=>true,"data"=>$user,"code"=>201];
  428.                 break;
  429.             case "password":
  430.                 if(!array_key_exists("c-password",$data)) return ["message"=>"c-password field is required","statut"=>false,"data"=>$user,"code"=>401];
  431.                 if(!array_key_exists("n-password",$data)) return ["message"=>"n-password field is required","statut"=>false,"data"=>$user,"code"=>401];
  432.                 $res=$this->encoder->isPasswordValid($user,$data["c-password"]);
  433.                 if($res ==false) return ["message"=>"current_password_invalid","statut"=>false,"data"=>$user,"code"=>401];
  434.                 $res = $this->passwordStrength($data["n-password"]);
  435.                 if($res ==false) return ["message"=>"new_password_invalid","statut"=>false,"data"=>$user,"code"=>401];
  436.                 $user->setPassword($this->passwordHasher->hashPassword($user,$data["n-password"] ));
  437.                 $this->em->persist($user);
  438.                 $this->em->flush();
  439.                 $log = new Log();
  440.                 $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT04'));
  441.                 if(!is_null($operation))
  442.                 {
  443.                     $log->setOperation($operation);
  444.                     $log->setUser($user);
  445.                     $log->setObservation($user->getId());
  446.                     $this->em->persist($log);
  447.                     $this->em->flush();
  448.                 }
  449.                 return ["message"=>"profile_updated","statut"=>true,"data"=>$user,"code"=>201];
  450.                 break;
  451.             default:
  452.                 return ["message"=>"no type added","statut"=>false,"data"=>"","code"=>401];
  453.                 break;
  454.         }
  455.     }
  456.     public function getSimpleProfile(int $id)
  457.     {
  458.         $user = $this->em->getRepository(User::class)->findOneBy(array("id"=>$id));
  459.         if(is_null($user)) return["message"=>"user not found","statut"=>false,"code"=>404,"data"=>""];
  460.         return ["message"=>"","statut"=>true,"code"=>201,"data"=>["user"=>$user->toArray()]];
  461.     }
  462.     public function lockAccount(User $user,int $id)
  463.     {
  464.         $cr = $user->getRole();
  465.         $u = $this->em->getRepository(User::class)->findOneBy(array("id"=>$id));
  466.         if(is_null($u)) return ["message"=>"user not found","statut"=>false,"code"=>404,"data"=>""];
  467.         $role = $u->getRole();
  468.         if($role->getCode() =="ROLE_ADMIN") return ["message"=>"operation_denied","statut"=>false,"code"=>401,"data"=>""];
  469.         if($user->getId()==$u->getId())
  470.         {
  471.             $user->setIsClose(true);
  472.             $this->em->persist($user);
  473.             $this->em->flush();
  474.             $this->container->get("mail_manager")->accountLocked($user->getUsername(),$user->getEmail());
  475.             return ["message"=>"account locked","statut"=>true,"code"=>201,"data"=>$user->toArray()];
  476.         }
  477.         else
  478.         {
  479.             if($cr->getCode()!="ROLE_ADMIN") {
  480.                 return ["message" => "operation_denied", "statut" => false, "code" => 401, "data" => ""];
  481.             }
  482.             else
  483.             {
  484.                 $u->setIsClose(true);
  485.                 $this->em->persist($u);
  486.                 $this->em->flush();
  487.                 $this->container->get("mail_manager")->accountLocked($u->getUsername(),$u->getEmail());
  488.                 return ["message"=>"account_locked","statut"=>true,"code"=>201,"data"=>$u->toArray()];
  489.             }
  490.         }
  491.     }
  492.     public function login(string $email,string $password)
  493.     {
  494.         $user = $this->em->getRepository(User::class)->findOneBy(array('email' =>$email));
  495.         if($user === null) return ['message' =>"user_not_found","statut"=>false,"code"=>401,"data"=>""];
  496.         if($user->getIsClose()==true) return ["message"=>"account_locked","statut"=>false,"code"=>401,"data"=>""];
  497.         $res=$this->encoder->isPasswordValid($user,$password);
  498.         if($res == false)
  499.         {
  500.             if($user->getAttemptLogin()<3)
  501.             {
  502.                 $user->setAttemptLogin($user->getAttemptLogin()+1);
  503.                 if($user->getAttemptLogin()>=3) $user->setIsClose(true);
  504.                 $this->em->persist($user);
  505.                 $this->em->flush();
  506.             }
  507.             $log = new Log();
  508.             $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT01'));
  509.             if($operation !== null)
  510.             {
  511.                 $log->setOperation($operation);
  512.                 $log->setUser($user);
  513.                 $log->setObservation("echec de connexion");
  514.                 $this->em->persist($log);
  515.                 $this->em->flush();
  516.             }
  517.             return ["message"=>"login_incorrect","statut"=>false,"code"=>401,"data"=>""];
  518.         }
  519.         else{
  520.             if($user->getIsActive()==0)
  521.             {
  522.                 $log = new Log();
  523.                 $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT01'));
  524.                 if($operation !== null)
  525.                 {
  526.                     $log->setOperation($operation);
  527.                     $log->setUser($user);
  528.                     $log->setObservation("echec de connexion");
  529.                     $this->em->persist($log);
  530.                     $this->em->flush();
  531.                 }
  532.                 return ["message"=>"account_not_activated","statut"=>false,"code"=>401,"data"=>""];
  533.             }
  534.             $token = $this->jwt->create($user);
  535.             $user->setAttemptLogin(0);
  536.             $this->em->persist($user);
  537.             $this->em->flush();
  538.             $log = new Log();
  539.             $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT01'));
  540.             if($operation !== null)
  541.             {
  542.                 $log->setOperation($operation);
  543.                 $log->setUser($user);
  544.                 $log->setObservation("connexion ok");
  545.                 $this->em->persist($log);
  546.                 $this->em->flush();
  547.             }
  548.             $filesystem = new Filesystem();
  549.             if(!$filesystem->exists(__DIR__.'/../../public/USER/user'.$user->getId())){
  550.                 try {
  551.                     $filesystem->mkdir(__DIR__.'/../../public/USER/user'.$user->getId(),0777);
  552.                 } catch (IOExceptionInterface $exception) {
  553.                     return ["message"=>"An error occurred while creating your directory at ".$exception->getPath(),"statut"=>false,"code"=>401,"data"=>""];
  554.                 }
  555.             }
  556.             // Create user in OpenProject if integration is enabled
  557.             $this->syncUserToOpenProject($user, $password);
  558.             return ["message"=>"","statut"=>true,"code"=>201,"data"=>["user"=>$user,"token"=>$token]];
  559.         }
  560.     }
  561.     /**
  562.      * Sync user to OpenProject (create if not exists)
  563.      *
  564.      * @param User $user The Symfony user
  565.      * @param string $password Plain text password
  566.      * @return void
  567.      */
  568.     private function syncUserToOpenProject(User $user, string $password): void
  569.     {
  570.         if (!$this->openProjectService->isEnabled()) {
  571.             return;
  572.         }
  573.         // Check if user already exists in OpenProject by email
  574.         $existingUser = $this->openProjectService->findUserByEmail($user->getEmail());
  575.         if ($existingUser !== null) {
  576.             return; // User already exists
  577.         }
  578.         // Create user in OpenProject
  579.         // nom = lastName, prenom = firstName
  580.        $this->openProjectService->createUserFromSymfony(
  581.             $user->getPrenom() ?? '',
  582.             $user->getNom() ?? '',
  583.             $user->getEmail(),
  584.             $password,
  585.             $user->getType() === User::ROLE_ADMIN
  586.         );
  587.     }
  588.     public function resetPassword1(string $email)
  589.     {
  590.         $user = $this->em->getRepository(User::class)->findOneBy(array("email"=>$email));
  591.         if(is_null($user)) return ["message"=>"user not found","statut"=>false,"code"=>404,"data"=>""];
  592.         $pass = $this->getRandom(10);
  593.         $user2 =new User();
  594.         $user2->setPassword($this->passwordHasher->hashPassword($user2,$pass ));
  595.         $user->setRpassword($user2->getPassword());
  596.         $this->em->persist($user);
  597.         $this->em->flush();
  598.         $this->container->get("mail_manager")->resetPassword($user->getUsername(),$user->getEmail(),$pass);
  599.         return ["message"=>"","statut"=>true,"code"=>201,"data"=>$user];
  600.     }
  601.     public function usersList(int $limit,int $offset)
  602.     {
  603.         $users = $this->em->getRepository(User::class)->loadUsers($limit,$offset);
  604.         return $users;
  605.     }
  606.     public function createService(array $data)
  607.     {
  608.         $req=["code","nom_fr","nom_en","parent","cadre"];
  609.         $reqObli=["code","nom_fr","nom_en"];
  610.         foreach ($req as $val)
  611.         {
  612.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  613.             else{
  614.                 if(in_array($val,$reqObli))
  615.                 {
  616.                     if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  617.                 }
  618.             }
  619.         }
  620.         $old = $this->em->getRepository(Service::class)->findOneBy(array("code"=>$data["code"],"isActive"=>1));
  621.         if(!is_null($old)) return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  622.         $service = new Service();
  623.         $service->setCode($data["code"]);
  624.         $service->setNomEn($data["nom_en"]);
  625.         $service->setNomFr($data["nom_fr"]);
  626.         if(strlen($data["parent"])>0)
  627.         {
  628.             $p = $this->em->getRepository(Service::class)->findOneBy(array("id"=>$data["parent"]));
  629.             if(is_null($p)) return ["message"=>"parent service not found","statut"=>false,"code"=>""];
  630.             $service->setService($p);
  631.         }
  632.         $cadres = $this->em->getRepository(CadreClassement::class)->findMultiple($data["cadre"]);
  633.         foreach ($cadres as $c){
  634.             $service->addCadre($c);
  635.         }
  636.         $this->em->persist($service);
  637.         $this->em->flush();
  638.         $log = new Log();
  639.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT09'));
  640.         if(!is_null($operation))
  641.         {
  642.             $log->setOperation($operation);
  643.             $log->setUser($this->currenUser);
  644.             $log->setObservation($service->getId());
  645.             $this->em->persist($log);
  646.             $this->em->flush();
  647.         }
  648.         return ["message"=>"","statut"=>true,"data"=>$service->toArray()];
  649.     }
  650.     public function createNews(array $data)
  651.     {
  652.         $req=["titre_fr","titre_en","type","desc_fr","desc_en"];
  653.         $reqObli=["titre_fr","titre_en","type"];
  654.         foreach ($req as $val)
  655.         {
  656.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  657.             else{
  658.                 if(in_array($val,$reqObli))
  659.                 {
  660.                     if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  661.                 }
  662.             }
  663.         }
  664.         $news = new News();
  665.         $news->setTitreEn($data["titre_en"]);
  666.         $news->setTitreFr($data["titre_fr"]);
  667.         $news->setType(boolval($data["type"]));
  668.         $news->setDescFr($data["desc_fr"]);
  669.         $news->setDescEn($data["desc_en"]);
  670.         $this->em->persist($news);
  671.         $this->em->flush();
  672.         $log = new Log();
  673.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT63'));
  674.         if(!is_null($operation))
  675.         {
  676.             $log->setOperation($operation);
  677.             $log->setUser($this->currenUser);
  678.             $log->setObservation($news->getId());
  679.             $this->em->persist($log);
  680.             $this->em->flush();
  681.         }
  682.         return ["message"=>"","statut"=>true,"data"=>$news->toArray()];
  683.     }
  684.     public function editNews(array $data)
  685.     {
  686.         $req=["titre_fr","titre_en","type","desc_fr","desc_en","id"];
  687.         $reqObli=["titre_fr","titre_en","type","id"];
  688.         foreach ($req as $val)
  689.         {
  690.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  691.             else{
  692.                 if(in_array($val,$reqObli))
  693.                 {
  694.                     if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  695.                 }
  696.             }
  697.         }
  698.         $news = $this->em->getRepository(News::class)->findOneBy(array("id"=>$data["id"]));
  699.         if(is_null($news)) return ["message"=>"news not found","statut"=>false,"code"=>""];
  700.         $news->setTitreEn($data["titre_en"]);
  701.         $news->setTitreFr($data["titre_fr"]);
  702.         $news->setType(boolval($data["type"]));
  703.         $news->setDescFr($data["desc_fr"]);
  704.         $news->setDescEn($data["desc_en"]);
  705.         $this->em->persist($news);
  706.         $this->em->flush();
  707.         $log = new Log();
  708.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT64'));
  709.         if(!is_null($operation))
  710.         {
  711.             $log->setOperation($operation);
  712.             $log->setUser($this->currenUser);
  713.             $log->setObservation($news->getId());
  714.             $this->em->persist($log);
  715.             $this->em->flush();
  716.         }
  717.         return ["message"=>"","statut"=>true,"data"=>$news->toArray()];
  718.     }
  719.     public function editNewsContent(array $data)
  720.     {
  721.         $req=["contenu_fr","contenu_en","id"];
  722.         $reqObli=["id"];
  723.         foreach ($req as $val)
  724.         {
  725.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  726.             else{
  727.                 if(in_array($val,$reqObli))
  728.                 {
  729.                     if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  730.                 }
  731.             }
  732.         }
  733.         $news = $this->em->getRepository(News::class)->findOneBy(array("id"=>$data["id"]));
  734.         if(is_null($news)) return ["message"=>"news not found","statut"=>false,"code"=>""];
  735.         $news->setContenuEn($data["contenu_en"]);
  736.         $news->setContenuFr($data["contenu_fr"]);
  737.         $this->em->persist($news);
  738.         $this->em->flush();
  739.         $log = new Log();
  740.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT64'));
  741.         if(!is_null($operation))
  742.         {
  743.             $log->setOperation($operation);
  744.             $log->setUser($this->currenUser);
  745.             $log->setObservation($news->getId());
  746.             $this->em->persist($log);
  747.             $this->em->flush();
  748.         }
  749.         return ["message"=>"","statut"=>true,"data"=>$news->toArray()];
  750.     }
  751.     public function createRayon(array $data)
  752.     {
  753.         $req=["code","salle","nb"];
  754.         $reqObli=["code","salle","nb"];
  755.         foreach ($req as $val)
  756.         {
  757.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  758.             else{
  759.                 if(in_array($val,$reqObli))
  760.                 {
  761.                     if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  762.                 }
  763.             }
  764.         }
  765.         $salle = $this->em->getRepository(Salle::class)->findOneBy(['id'=>$data['salle']]);
  766.         if($salle === null) return ["message"=>$this->container->get('translator')->trans('room_not_found'),"statut"=>false,"code"=>401];
  767.         $old = $this->em->getRepository(Rayon::class)->findOneBy(array("code"=>$data["code"],"isActive"=>1,'salle'=>$salle));
  768.         if($old !== null) return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  769.         $rayon = new Rayon();
  770.         $rayon->setCode($data["code"]);
  771.         $rayon->setSalle($salle);
  772.         $rayon->setNbFace((int)$data["nb"]);
  773.         $this->em->persist($rayon);
  774.         $this->em->flush();
  775.         $log = new Log();
  776.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT65'));
  777.         if(!is_null($operation))
  778.         {
  779.             $log->setOperation($operation);
  780.             $log->setUser($this->currenUser);
  781.             $log->setObservation($rayon->getId());
  782.             $this->em->persist($log);
  783.             $this->em->flush();
  784.         }
  785.         return ["message"=>"","statut"=>true,"data"=>$rayon->toArray()];
  786.     }
  787.     public function createWorkgroup(array $data)
  788.     {
  789.         $req=["code","type","title","start_date","end_date","reason"];
  790.         $reqObli=["code","type","title"];
  791.         foreach ($req as $val)
  792.         {
  793.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  794.             else{
  795.                 if(in_array($val,$reqObli))
  796.                 {
  797.                     if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  798.                 }
  799.             }
  800.         }
  801.         $old = $this->em->getRepository(Workgroup::class)->findOneBy(array("code"=>$data["code"],"isActive"=>1));
  802.         if(!is_null($old)) return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  803.         $wkg = new Workgroup();
  804.         $wkg->setCode($data["code"]);
  805.         $wkg->setTitle($data["title"]);
  806.         $wkg->setMotif($data["reason"]);
  807.         if($data["type"]==1)
  808.         {
  809.             $wkg->setType(true);
  810.         }
  811.         else
  812.         {
  813.             $wkg->setType(false);
  814.             $wkg->setDateDebut(\DateTime::createFromFormat('d/m/Y',$data["start_date"]));
  815.             $wkg->setDateFin(\DateTime::createFromFormat('d/m/Y',$data["end_date"]));
  816.         }
  817.         $this->em->persist($wkg);
  818.         $this->em->flush();
  819.         $log = new Log();
  820.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT66'));
  821.         if(!is_null($operation))
  822.         {
  823.             $log->setOperation($operation);
  824.             $log->setUser($this->currenUser);
  825.             $log->setObservation($wkg->getId());
  826.             $this->em->persist($log);
  827.             $this->em->flush();
  828.         }
  829.         return ["message"=>"","statut"=>true,"data"=>$wkg->toArray()];
  830.     }
  831.     public function editRayon(array $data)
  832.     {
  833.         $req=["code","salle","nb","id"];
  834.         $reqObli=["code","salle","nb","id"];
  835.         foreach ($req as $val)
  836.         {
  837.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  838.             else{
  839.                 if(in_array($val,$reqObli))
  840.                 {
  841.                     if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  842.                 }
  843.             }
  844.         }
  845.         $rayon = $this->em->getRepository(Rayon::class)->findOneBy(array("id"=>$data["id"]));
  846.         if($rayon === null) return ["message"=>"rayon not found","statut"=>false,"code"=>""];
  847.         $salle = $this->em->getRepository(Salle::class)->findOneBy(['id'=>$data['salle']]);
  848.         if($salle === null) return ["message"=>$this->container->get('translator')->trans('room_not_found'),"statut"=>false,"code"=>401];
  849.         $old = $this->em->getRepository(Rayon::class)->findOneBy(array("code"=>$data["code"],"isActive"=>1,'salle'=>$salle));
  850.         if($old !== null) {
  851.             if($old->getId()!=$rayon->getId())return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  852.         }
  853.         $rayon->setCode($data["code"]);
  854.         $rayon->setSalle($salle);
  855.         $rayon->setNbFace((int)$data["nb"]);
  856.         $this->em->persist($rayon);
  857.         $this->em->flush();
  858.         $log = new Log();
  859.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT67'));
  860.         if(!is_null($operation))
  861.         {
  862.             $log->setOperation($operation);
  863.             $log->setUser($this->currenUser);
  864.             $log->setObservation($rayon->getId());
  865.             $this->em->persist($log);
  866.             $this->em->flush();
  867.         }
  868.         return ["message"=>"","statut"=>true,"data"=>$rayon->toArray()];
  869.     }
  870.     public function createRole(array $data)
  871.     {
  872.         $req=["code","nom_fr","nom_en"];
  873.         foreach ($req as $val)
  874.         {
  875.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  876.             else
  877.             {
  878.                 if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  879.             }
  880.         }
  881.         $r = new Role();
  882.         $r->setCode($data["code"]);
  883.         $r->setNomEn($data["nom_en"]);
  884.         $r->setNomFr($data["nom_fr"]);
  885.         $this->em->persist($r);
  886.         $this->em->flush();
  887.         return ["message"=>"","statut"=>true,"data"=>$r->toArray()];
  888.     }
  889.     public function createActorType(array $data)
  890.     {
  891.         $req=["nom_fr","nom_en"];
  892.         foreach ($req as $val)
  893.         {
  894.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  895.             else
  896.             {
  897.                 if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  898.             }
  899.         }
  900.         $t = new TypeActeur();
  901.         $t->setNomEn($data["nom_en"]);
  902.         $t->setNomFr($data["nom_fr"]);
  903.         $this->em->persist($t);
  904.         $this->em->flush();
  905.         return ["message"=>"","statut"=>true,"data"=>$t->toArray()];
  906.     }
  907.     public function createConfidentialityType(array $data)
  908.     {
  909.         $req=["nom_fr","nom_en","niveau"];
  910.         foreach ($req as $val)
  911.         {
  912.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  913.             else
  914.             {
  915.                 if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  916.             }
  917.         }
  918.         $t = new TypeConfidentialite();
  919.         $t->setNomEn($data["nom_en"]);
  920.         $t->setNomFr($data["nom_fr"]);
  921.         $t->setNiveau($data["niveau"]);
  922.         $this->em->persist($t);
  923.         $this->em->flush();
  924.         return ["message"=>"","statut"=>true,"data"=>$t->toArray()];
  925.     }
  926.     public function createFolderType(array $data)
  927.     {
  928.         $req=["code","nom_fr","nom_en"];
  929.         foreach ($req as $val)
  930.         {
  931.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  932.             else{
  933.                 if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  934.             }
  935.         }
  936.         $old = $this->em->getRepository(TypeDossier::class)->findOneBy(array("code"=>$data["code"],"isActive"=>1));
  937.         if(!is_null($old)) return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  938.         $d = new TypeDossier();
  939.         $d->setCode($data["code"]);
  940.         $d->setNomEn($data["nom_en"]);
  941.         $d->setNomFr($data["nom_fr"]);
  942.         $this->em->persist($d);
  943.         $this->em->flush();
  944.         $log = new Log();
  945.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT17'));
  946.         if(!is_null($operation))
  947.         {
  948.             $log->setOperation($operation);
  949.             $log->setUser($this->currenUser);
  950.             $log->setObservation($d->getId());
  951.             $this->em->persist($log);
  952.             $this->em->flush();
  953.         }
  954.         return ["message"=>"","statut"=>true,"data"=>$d->toArray()];
  955.     }
  956.     public function createExternalActor(array $data)
  957.     {
  958.         $req=["nom","phone","type","email","category"];
  959.         foreach ($req as $val)
  960.         {
  961.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  962.         }
  963.         if(strlen($data["nom"])<1) return ["message"=>"nom field is empty","statut"=>false,"code"=>""];
  964.         if(strlen($data["phone"])===0) return ["message"=>"phone field is empty","statut"=>false,"code"=>""];
  965.         $ty = $data["type"];
  966.         $actor = new ActeurExterne();
  967.         $actor->setNom($data["nom"]);
  968.         $actor->setType($ty);
  969.         $actor->setTelephone($data["phone"]);
  970.         $actor->setCategory($data["category"]);
  971.         /*if($data["email"]!='')
  972.         {
  973.             if(!filter_var($data["email"], FILTER_VALIDATE_EMAIL))
  974.             {
  975.                 return ["message"=>"invalid_email","statut"=>false,"code"=>"EMAIL_INVALID"];
  976.             }
  977.         }*/
  978.         $actor->setEmail($data["email"]);
  979.         $this->em->persist($actor);
  980.         $this->em->flush();
  981.         return ["message"=>"","statut"=>true,"data"=>$actor->toArray()];
  982.     }
  983.     public function createDureeDossier(array $data)
  984.     {
  985.         $req=["dua","type_dua","conservation","type_conservation","communication","type_communication"];
  986.         foreach ($req as $el)
  987.         {
  988.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>""];
  989.         }
  990.         foreach ($req as $el)
  991.         {
  992.             if(empty($data[$el])) return ["message"=>$el." field is empty","statut"=>false,"code"=>""];
  993.         }
  994.         $d = new DureeDossier();
  995.         $d->setDua($data["dua"]);
  996.         $d->setTypeDua($data["type_dua"]);
  997.         $d->setConservation($data["conservation"]);
  998.         $d->setTypeConsevation($data["type_conservation"]);
  999.         $d->setCommunication($data["communication"]);
  1000.         $d->setTypeCommunication($data["type_communication"]);
  1001.         $this->em->persist($d);
  1002.         $this->em->flush();
  1003.         return ["message"=>"","statut"=>true,"data"=>$d->toArray()];
  1004.     }
  1005.     public function createCadreClassement(array $data)
  1006.     {
  1007.         $req=["niveau","ordre","code","nom_en","nom_fr","desc_fr","desc_en","url_sys","parent"];
  1008.         $reqObli=["niveau","ordre","code","nom_en","nom_fr","parent"];
  1009.         foreach ($req as $el)
  1010.         {
  1011.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>""];
  1012.         }
  1013.         foreach ($reqObli as $el)
  1014.         {
  1015.             if(empty($el)) return ["message"=>$el." field is empty","statut"=>false,"code"=>""];
  1016.         }
  1017.         $c = new CadreClassement();
  1018.         $old = $this->em->getRepository(CadreClassement::class)->findOneBy(array("code"=>$data["code"],"isActive"=>1));
  1019.         if(!is_null($old)) return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  1020.         $c->setNiveau($data["niveau"]);
  1021.         $c->setOrdre($data["ordre"]);
  1022.         $c->setCode($data["code"]);
  1023.         $c->setNomEn($data["nom_en"]);
  1024.         $c->setNomFr($data["nom_fr"]);
  1025.         $c->setDescEn($data["desc_en"]);
  1026.         $c->setDescFr($data["desc_fr"]);
  1027.         $c->setUrlSys($data["url_sys"]);
  1028.         $c->setLocalisation("");
  1029.         if($data["parent"]!='')
  1030.         {
  1031.             $p = $this->em->getRepository(CadreClassement::class)->findOneBy(array("id"=>$data["parent"]));
  1032.             if(is_null($p)) return ["message"=>"parent not found","statut"=>false,"code"=>""];
  1033.             else
  1034.             {
  1035.                 $c->setCardreClassement($p);
  1036.             }
  1037.         }
  1038.         $this->em->persist($c);
  1039.         $this->em->flush();
  1040.         $log = new Log();
  1041.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT23'));
  1042.         if(!is_null($operation))
  1043.         {
  1044.             $log->setOperation($operation);
  1045.             $log->setUser($this->currenUser);
  1046.             $log->setObservation($c->getId());
  1047.             $this->em->persist($log);
  1048.             $this->em->flush();
  1049.         }
  1050.         return ["message"=>"","statut"=>true,"data"=>$c->toArray()];
  1051.     }
  1052.     public function createBordereau(array $data)
  1053.     {
  1054.         $req=["numero","du","file","boite","cote","cadre"];
  1055.         foreach ($req as $el)
  1056.         {
  1057.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>""];
  1058.         }
  1059.         if(strlen($data["numero"])===0) return ["message"=>"numero field is empty","statut"=>false,"code"=>""];
  1060.         if(strlen($data["du"])===0) return ["message"=>"du field is empty","statut"=>false,"code"=>""];
  1061.         if(strlen($data["boite"])===0) return ["message"=>"boite field is empty","statut"=>false,"code"=>""];
  1062.         if(strlen($data["cote"])===0) return ["message"=>"cote field is empty","statut"=>false,"code"=>""];
  1063.         if(strlen($data["cadre"])===0) return ["message"=>"cadre field is empty","statut"=>false,"code"=>""];
  1064.         if(count($data["file"])==0) return ["message"=>"file is empty","statut"=>false,"code"=>""];
  1065.         $old = $this->em->getRepository(Bordereau::class)->findOneBy(['numero'=>$data['numero'],"isActive"=>1]);
  1066.         if($old !== null) return ["message"=>$this->container->get('translator')->trans('error_slip_number'),"statut"=>false,"code"=>""];
  1067.         $cadre = $this->em->getRepository(CadreClassement::class)->findOneBy(['id'=>$data['cadre']]);
  1068.         if($cadre === null) return ["message"=>$this->container->get('translator')->trans('cadre_not_found'),"statut"=>false,"code"=>""];
  1069.         $boite = $this->em->getRepository(Boite::class)->findOneBy(['id'=>$data['boite']]);
  1070.         if($boite === null) return ["message"=>$this->container->get('translator')->trans('box_not_found'),"statut"=>false,"code"=>""];
  1071.         $b= new Bordereau();
  1072.         $b->setNumero($data["numero"]);
  1073.         $b->setDu(\DateTime::createFromFormat('d/m/Y',$data["du"]));
  1074.         $b->setFichier($data["file"]["name"]);
  1075.         $b->setBoite($boite);
  1076.         $b->setCadreClassement($cadre);
  1077.         $b->setCote($cadre->getCode());
  1078.         $this->em->persist($b);
  1079.         $this->em->flush();
  1080.         return ["message"=>"","statut"=>true,"data"=>$b->toArray()];
  1081.     }
  1082.     public function listObject(string $object,$limit=10,$offset=0)
  1083.     {
  1084.         $req =["role","service","type-acteur","type-confidentialite","type-dossier","duree-dossier","utilisateur","bordereau","dossier","acteur","salle"];
  1085.         if(!in_array($object,$req)) return ["message"=>"bad object for looking list","statut"=>false,"code"=>""];
  1086.         switch ($object)
  1087.         {
  1088.             case 'role':
  1089.                 $res = $this->em->getRepository(Role::class)->findBy(array(),array("nomFr"=>"ASC"),100,$offset);
  1090.                 break;
  1091.             case 'service':
  1092.                 $res = $this->em->getRepository(Service::class)->findBy(array("isActive"=>true),array("nomFr"=>"ASC"),$limit,$offset);
  1093.                 break;
  1094.             case 'salle':
  1095.                 $res = $this->em->getRepository(Salle::class)->findBy(array("isActive"=>true),array("code"=>"ASC"),$limit,$offset);
  1096.                 break;
  1097.             case 'archive_location':
  1098.                 $res = $this->em->getRepository(ArchiveLocation::class)->findBy(array("isActive"=>true),array("code"=>"ASC"),$limit,$offset);
  1099.                 break;
  1100.             case 'type-acteur':
  1101.                 $res = $this->em->getRepository(TypeActeur::class)->findBy(array("isActive"=>true),array("nomFr"=>"ASC"),$limit,$offset);
  1102.                 break;
  1103.             case 'type-confidentialite':
  1104.                 $res = $this->em->getRepository(TypeConfidentialite::class)->findBy(array("isActive"=>true),array("niveau"=>"ASC"),$limit,$offset);
  1105.                 break;
  1106.             case 'type-dossier':
  1107.                 $res = $this->em->getRepository(TypeDossier::class)->findBy(array("isActive"=>true),array("nomFr"=>"ASC"),$limit,$offset);
  1108.                 break;
  1109.             case 'duree-dossier':
  1110.                 $res = $this->em->getRepository(DureeDossier::class)->findBy(array("isActive"=>true),array("dua"=>"ASC"),$limit,$offset);
  1111.                 break;
  1112.             case 'utilisateur':
  1113.                 $res = $this->em->getRepository(User::class)->listUsers($limit,$offset);
  1114.                 break;
  1115.             case 'bordereau':
  1116.                 $res = $this->em->getRepository(Bordereau::class)->findBy(array("isActive"=>true),array("numero"=>"ASC"),$limit,$offset);
  1117.                 break;
  1118.             case 'dossier':
  1119.                 $res = $this->em->getRepository(Dossier::class)->findBy(array("isActive"=>true),array("id"=>"ASC"),$limit,$offset);
  1120.                 break;
  1121.             case 'acteur':
  1122.                 $res = $this->em->getRepository(ActeurExterne::class)->findBy(array("isActive"=>true),array("id"=>"ASC"),$limit,$offset);
  1123.                 break;
  1124.             default:
  1125.                 $res=[];
  1126.                 break;
  1127.         }
  1128.         $data=[];
  1129.         foreach ($res as $el)
  1130.         {
  1131.             $data[]=$el->toArray();
  1132.         }
  1133.         return ["message"=>"","statut"=>true,"data"=>$data];
  1134.     }
  1135.     public function generateCode(array $data)
  1136.     {
  1137.         if(!array_key_exists("id",$data)) return ["message"=>"id field is required","statut"=>false,"code"=>""];
  1138.         $u = $this->em->getRepository(User::class)->findOneBy(array("id"=>$data["id"]));
  1139.         if(is_null($u)) return ["message"=>"user not found","statut"=>false,"code"=>""];
  1140.         $u->setPasswordCode($this->getRandom(5));
  1141.         $this->em->persist($u);
  1142.         $this->em->flush();
  1143.         return ["message"=>"","statut"=>true,"data"=>$u->getPasswordCode()];
  1144.     }
  1145.     public function resetPassword(array $data)
  1146.     {
  1147.         if(!array_key_exists("email",$data)) return ["message"=>"email field is required","statut"=>false,"code"=>""];
  1148.         if(!array_key_exists("code",$data)) return ["message"=>"code field is required","statut"=>false,"code"=>""];
  1149.         if(!array_key_exists("password",$data)) return ["message"=>"password field is required","statut"=>false,"code"=>""];
  1150.         if(strlen($data["password"])<6) return ["message"=>"password is shot min 6 characters","statut"=>false,"code"=>""];
  1151.         if(strlen($data["code"])!=5) return ["message"=>"incorrect email/code","statut"=>false,"code"=>""];
  1152.         $user = $this->em->getRepository(User::class)->findOneBy(array("email"=>$data["email"]));
  1153.         if(is_null($user)) return ["message"=>"incorrect email/code","statut"=>false,"code"=>""];
  1154.         if($user->getPasswordCode()!=$data["code"]) return ["message"=>"incorrect email/code","statut"=>false,"code"=>""];
  1155.         $user->setPassword($this->passwordHasher->hashPassword($user,$data["password"]));
  1156.         $user->setPasswordCode(null);
  1157.         $user->setIsClose(0);
  1158.         $user->setAttemptLogin(0);
  1159.         $this->em->persist($user);
  1160.         $this->em->flush();
  1161.         return ["message"=>"","statut"=>true,"data"=>$user->toArray()];
  1162.     }
  1163.     public function addRole(array $data)
  1164.     {
  1165.         if(!array_key_exists("role_id",$data)) return ["message"=>"role_id field is required","statut"=>false,"code"=>""];
  1166.         if(!array_key_exists("user_id",$data)) return ["message"=>"user_id field is required","statut"=>false,"code"=>""];
  1167.         $r = $this->em->getRepository(Role::class)->findOneBy(array("id"=>$data["role_id"]));
  1168.         if(is_null($r)) return ["message"=>"role not found","statut"=>false,"code"=>""];
  1169.         $u = $this->em->getRepository(User::class)->findOneBy(array("id"=>$data["user_id"]));
  1170.         if(is_null($u)) return ["message"=>"user not found","statut"=>false,"code"=>""];
  1171.         if($data["current_user"]->getId()==$u->getId()) return ["message"=>"operation denied because same user","statut"=>false,"code"=>""];
  1172.         if($u->getUserRoles()->contains($r)) return ["message"=>"role already added","statut"=>true,"data"=>$u->toArray()];
  1173.         $u->addRole($r);
  1174.         $this->em->persist($u);
  1175.         $this->em->flush();
  1176.         return ["message"=>"","statut"=>true,"data"=>$u->toArray()];
  1177.     }
  1178.     public function removeRole(array $data)
  1179.     {
  1180.         if(!array_key_exists("role_id",$data)) return ["message"=>"role_id field is required","statut"=>false,"code"=>""];
  1181.         if(!array_key_exists("user_id",$data)) return ["message"=>"user_id field is required","statut"=>false,"code"=>""];
  1182.         $r = $this->em->getRepository(Role::class)->findOneBy(array("id"=>$data["role_id"]));
  1183.         if(is_null($r)) return ["message"=>"role not found","statut"=>false,"code"=>""];
  1184.         $u = $this->em->getRepository(User::class)->findOneBy(array("id"=>$data["user_id"]));
  1185.         if(is_null($u)) return ["message"=>"user not found","statut"=>false,"code"=>""];
  1186.         if($data["current_user"]->getId()==$u->getId()) return ["message"=>"operation denied because same user","statut"=>false,"code"=>""];
  1187.         if(!$u->getUserRoles()->contains($r)) return ["message"=>"user not having this role","statut"=>false,"data"=>$u->toArray()];
  1188.         $u->removeRole($r);
  1189.         $this->em->persist($u);
  1190.         $this->em->flush();
  1191.         return ["message"=>"","statut"=>true,"data"=>$u->toArray()];
  1192.     }
  1193.     public function validCode(array $data)
  1194.     {
  1195.         if(!array_key_exists("email",$data)) return ["message"=>"email field is required","statut"=>false,"code"=>""];
  1196.         if(!array_key_exists("code",$data)) return ["message"=>"code field is required","statut"=>false,"code"=>""];
  1197.         if(strlen($data["code"])!=5) return ["message"=>"incorrect_email_code","statut"=>false,"code"=>""];
  1198.         $user = $this->em->getRepository(User::class)->findOneBy(array("email"=>$data["email"]));
  1199.         if(is_null($user)) return ["message"=>"incorrect_email_code","statut"=>false,"code"=>""];
  1200.         if($user->getPasswordCode()!=$data["code"]) return ["message"=>"incorrect_email_code","statut"=>false,"code"=>""];
  1201.         return ["message"=>"","statut"=>true,"data"=>$user->toArray()];
  1202.     }
  1203.     public function editUserSatus(array $data)
  1204.     {
  1205.         if(!array_key_exists("user_id",$data)) return ["message"=>"user_id field is required","statut"=>false,"code"=>""];
  1206.         if(!array_key_exists("status",$data)) return ["message"=>"status field is required","statut"=>false,"code"=>""];
  1207.         $user = $this->em->getRepository(User::class)->findOneBy(array("id"=>$data["user_id"]));
  1208.         if(is_null($user)) return ["message"=>"user not found","statut"=>false,"code"=>""];
  1209.         if($user->getEmail()=="admin@admin.cm") return ["message"=>"operation denied","statut"=>false,"code"=>""];
  1210.         $user->setIsClose((bool)$data["status"]);
  1211.         if($user->getIsClose()==0)
  1212.         {
  1213.             $user->setAttemptLogin(0);
  1214.         }
  1215.         $this->em->persist($user);
  1216.         $this->em->flush();
  1217.         $log = new Log();
  1218.         if((bool)$data["status"]==true)$operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT03'));
  1219.         else $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT15'));
  1220.         if(!is_null($operation))
  1221.         {
  1222.             $log->setOperation($operation);
  1223.             $log->setUser($this->currenUser);
  1224.             $log->setObservation($user->getId());
  1225.             $this->em->persist($log);
  1226.             $this->em->flush();
  1227.         }
  1228.         return ["message"=>"","statut"=>true,"code"=>"","data"=>$user->toArray()];
  1229.     }
  1230.     public function updateUserRole(array $data)
  1231.     {
  1232.         if(!array_key_exists("user_id",$data)) return ["message"=>"user_id field is required","statut"=>false,"code"=>""];
  1233.         if(!array_key_exists("roles",$data)) return ["message"=>"roles field is required","statut"=>false,"code"=>""];
  1234.         $user = $this->em->getRepository(User::class)->findOneBy(array("id"=>$data["user_id"]));
  1235.         if(is_null($user)) return ["message"=>"user not found","statut"=>false,"code"=>""];
  1236.         if($user->getEmail()=="admin@admin.cm") return ["message"=>"operation denied","statut"=>false,"code"=>""];
  1237.         $roles = $user->getUserRoles();
  1238.         if(count($data["roles"])==0)
  1239.         {
  1240.             foreach ($roles as $el)
  1241.             {
  1242.                 $user->removeRole($el);
  1243.             }
  1244.             $this->em->persist($user);
  1245.             $this->em->flush();
  1246.             $log = new Log();
  1247.             $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT14'));
  1248.             if(!is_null($operation))
  1249.             {
  1250.                 $log->setOperation($operation);
  1251.                 $log->setUser($this->currenUser);
  1252.                 $log->setObservation($user->getId());
  1253.                 $this->em->persist($log);
  1254.                 $this->em->flush();
  1255.             }
  1256.             return ["message"=>"","statut"=>true,"code"=>"","data"=>$user->toArray()];
  1257.         }
  1258.         else
  1259.         {   $alreadyHere=[];
  1260.             foreach ($roles as $el)
  1261.             {
  1262.                 if(!in_array($el->getId(),$data["roles"]))
  1263.                 {
  1264.                     $user->removeRole($el);
  1265.                 }
  1266.                 else{
  1267.                     $alreadyHere[]=$el->getId();
  1268.                 }
  1269.             }
  1270.             foreach ($data["roles"] as $el)
  1271.             {
  1272.                 if(!in_array($el,$alreadyHere))
  1273.                 {
  1274.                     $r = $this->em->getRepository(Role::class)->findOneBy(array("id"=>$el));
  1275.                     if(!is_null($r))
  1276.                     {
  1277.                         $user->addRole($r);
  1278.                     }
  1279.                 }
  1280.             }
  1281.             $this->em->persist($user);
  1282.             $this->em->flush();
  1283.             $log = new Log();
  1284.             $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT14'));
  1285.             if(!is_null($operation))
  1286.             {
  1287.                 $log->setOperation($operation);
  1288.                 $log->setUser($this->currenUser);
  1289.                 $log->setObservation($user->getId());
  1290.                 $this->em->persist($log);
  1291.                 $this->em->flush();
  1292.             }
  1293.             return ["message"=>"","statut"=>true,"code"=>"","data"=>$user->toArray()];
  1294.         }
  1295.     }
  1296.     public function editService(array $data)
  1297.     {
  1298.         $req=["code","nom_fr","nom_en","parent","id","cadres"];
  1299.         $reqObli=["code","nom_fr","nom_en"];
  1300.         foreach ($req as $val)
  1301.         {
  1302.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  1303.             else{
  1304.                 if(in_array($val,$reqObli))
  1305.                 {
  1306.                     if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  1307.                 }
  1308.             }
  1309.         }
  1310.         $service = $this->em->getRepository(Service::class)->findOneBy(array("id"=>$data["id"]));
  1311.         if(is_null($service)) return ["message"=>"service not found","statut"=>false,"code"=>""];
  1312.         $old = $this->em->getRepository(Service::class)->findOneBy(array("code"=>$data["code"]));
  1313.         if(!is_null($old)) {
  1314.             if($old->getId()!=$service->getId())return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  1315.         }
  1316.         $service->setCode($data["code"]);
  1317.         $service->setNomEn($data["nom_en"]);
  1318.         $service->setNomFr($data["nom_fr"]);
  1319.         if(strlen($data["parent"])>0)
  1320.         {
  1321.             $p = $this->em->getRepository(Service::class)->findOneBy(array("id"=>$data["parent"]));
  1322.             if(is_null($p)) return ["message"=>"parent service not found","statut"=>false,"code"=>""];
  1323.             if($p->getCode()!=$service->getCode())
  1324.             {
  1325.                 $service->setService($p);
  1326.             }
  1327.         }
  1328.         else{
  1329.             $service->setService(null);
  1330.         }
  1331.         $oldCa = $service->getCadres();
  1332.         foreach ($oldCa as $ca){
  1333.             $service->removeCadre($ca);
  1334.         }
  1335.         $cadres = $this->em->getRepository(CadreClassement::class)->findMultiple($data["cadres"]);
  1336.         foreach ($cadres as $c){
  1337.             $service->addCadre($c);
  1338.         }
  1339.         $this->em->persist($service);
  1340.         $this->em->flush();
  1341.         $log = new Log();
  1342.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT10'));
  1343.         if(!is_null($operation))
  1344.         {
  1345.             $log->setOperation($operation);
  1346.             $log->setUser($this->currenUser);
  1347.             $log->setObservation($service->getId());
  1348.             $this->em->persist($log);
  1349.             $this->em->flush();
  1350.         }
  1351.         return ["message"=>"","statut"=>true,"data"=>$service->toArray()];
  1352.     }
  1353.     public function updateServiceRole(array $data)
  1354.     {
  1355.         if(!array_key_exists("service_id",$data)) return ["message"=>"service_id field is required","statut"=>false,"code"=>""];
  1356.         if(!array_key_exists("roles",$data)) return ["message"=>"roles field is required","statut"=>false,"code"=>""];
  1357.         $service = $this->em->getRepository(Service::class)->findOneBy(array("id"=>$data["service_id"]));
  1358.         if(is_null($service)) return ["message"=>"service not found","statut"=>false,"code"=>""];
  1359.         $roles = $service->getRoles();
  1360.         if(count($data["roles"])==0)
  1361.         {
  1362.             foreach ($roles as $el)
  1363.             {
  1364.                 $service->removeRole($el);
  1365.             }
  1366.             $this->em->persist($service);
  1367.             $this->em->flush();
  1368.             $log = new Log();
  1369.             $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT11'));
  1370.             if(!is_null($operation))
  1371.             {
  1372.                 $log->setOperation($operation);
  1373.                 $log->setUser($this->currenUser);
  1374.                 $log->setObservation($service->getId());
  1375.                 $this->em->persist($log);
  1376.                 $this->em->flush();
  1377.             }
  1378.             return ["message"=>"","statut"=>true,"code"=>"","data"=>$service->toArray()];
  1379.         }
  1380.         else
  1381.         {   $alreadyHere=[];
  1382.             foreach ($roles as $el)
  1383.             {
  1384.                 if(!in_array($el->getId(),$data["roles"]))
  1385.                 {
  1386.                     $service->removeRole($el);
  1387.                 }
  1388.                 else{
  1389.                     $alreadyHere[]=$el->getId();
  1390.                 }
  1391.             }
  1392.             foreach ($data["roles"] as $el)
  1393.             {
  1394.                 if(!in_array($el,$alreadyHere))
  1395.                 {
  1396.                     $r = $this->em->getRepository(Role::class)->findOneBy(array("id"=>$el));
  1397.                     if(!is_null($r))
  1398.                     {
  1399.                         $service->addRole($r);
  1400.                     }
  1401.                 }
  1402.             }
  1403.             $this->em->persist($service);
  1404.             $this->em->flush();
  1405.             $log = new Log();
  1406.             $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT11'));
  1407.             if(!is_null($operation))
  1408.             {
  1409.                 $log->setOperation($operation);
  1410.                 $log->setUser($this->currenUser);
  1411.                 $log->setObservation($service->getId());
  1412.                 $this->em->persist($log);
  1413.                 $this->em->flush();
  1414.             }
  1415.             return ["message"=>"","statut"=>true,"code"=>"","data"=>$service->toArray()];
  1416.         }
  1417.     }
  1418.     public function editFolderType(array $data)
  1419.     {
  1420.         $req=["code","nom_fr","nom_en","id"];
  1421.         foreach ($req as $val)
  1422.         {
  1423.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  1424.             else{
  1425.                 if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  1426.             }
  1427.         }
  1428.         $type = $this->em->getRepository(TypeDossier::class)->findOneBy(array("id"=>$data["id"]));
  1429.         if(is_null($type)) return ["message"=>"type dossier not found","statut"=>false,"code"=>""];
  1430.         $old = $this->em->getRepository(TypeDossier::class)->findOneBy(array("code"=>$data["code"]));
  1431.         if(!is_null($old)) {
  1432.             if($old->getId()!=$type->getId())return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  1433.         }
  1434.         $type->setCode($data["code"]);
  1435.         $type->setNomEn($data["nom_en"]);
  1436.         $type->setNomFr($data["nom_fr"]);
  1437.         $this->em->persist($type);
  1438.         $this->em->flush();
  1439.         $log = new Log();
  1440.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT18'));
  1441.         if(!is_null($operation))
  1442.         {
  1443.             $log->setOperation($operation);
  1444.             $log->setUser($this->currenUser);
  1445.             $log->setObservation($type->getId());
  1446.             $this->em->persist($log);
  1447.             $this->em->flush();
  1448.         }
  1449.         return ["message"=>"","statut"=>true,"data"=>$type->toArray()];
  1450.     }
  1451.     public function editActorType(array $data)
  1452.     {
  1453.         $req=["nom_fr","nom_en","id"];
  1454.         foreach ($req as $val)
  1455.         {
  1456.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  1457.             else
  1458.             {
  1459.                 if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  1460.             }
  1461.         }
  1462.         $t = $this->em->getRepository(TypeActeur::class)->findOneBy(array("id"=>$data["id"]));
  1463.         if(is_null($t)) return ["message"=>"type acteur not found","statut"=>false,"code"=>""];
  1464.         $t->setNomEn($data["nom_en"]);
  1465.         $t->setNomFr($data["nom_fr"]);
  1466.         $this->em->persist($t);
  1467.         $this->em->flush();
  1468.         return ["message"=>"","statut"=>true,"data"=>$t->toArray()];
  1469.     }
  1470.     public function editDureeDossier(array $data)
  1471.     {
  1472.         $req=["dua","type_dua","conservation","type_conservation","communication","type_communication","id"];
  1473.         foreach ($req as $el)
  1474.         {
  1475.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>""];
  1476.         }
  1477.         foreach ($req as $el)
  1478.         {
  1479.             if(empty($data[$el])) return ["message"=>$el." field is empty","statut"=>false,"code"=>""];
  1480.         }
  1481.         $d = $this->em->getRepository(DureeDossier::class)->findOneBy(array("id"=>$data["id"]));
  1482.         if(is_null($d)) return ["message"=>"duree dossier not found","statut"=>false,"code"=>""];
  1483.         $d->setDua($data["dua"]);
  1484.         $d->setTypeDua($data["type_dua"]);
  1485.         $d->setConservation($data["conservation"]);
  1486.         $d->setTypeConsevation($data["type_conservation"]);
  1487.         $d->setCommunication($data["communication"]);
  1488.         $d->setTypeCommunication($data["type_communication"]);
  1489.         $this->em->persist($d);
  1490.         $this->em->flush();
  1491.         return ["message"=>"","statut"=>true,"data"=>$d->toArray()];
  1492.     }
  1493.     public function createSystemParam(array $data)
  1494.     {
  1495.         $req =["ftp_user", "ftp_password","ftp_directory","database_folder","awiating_folder","orgainsation_name",
  1496.             "orgainsation_logo","orgainsation_sigle"
  1497.         ];
  1498.         foreach ($req as $val)
  1499.         {
  1500.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  1501.         }
  1502.         $sys = new System();
  1503.         $sys->setFtpUser($data["ftp_user"]);
  1504.         $sys->setFtpPassword($data["ftp_password"]);
  1505.         $sys->setFtpDirectory($data["ftp_directory"]);
  1506.         $sys->setDatabaseFolder($data["database_folder"]);
  1507.         $sys->setAwaitingFolder($data["awiating_folder"]);
  1508.         $sys->setOraganisationName($data["orgainsation_name"]);
  1509.         $sys->setOrganisationLogo($data["orgainsation_logo"]);
  1510.         $sys->setOrganisationSigle($data["orgainsation_sigle"]);
  1511.         $this->em->persist($sys);
  1512.         $this->em->flush();
  1513.         return ["message"=>"","statut"=>true,"data"=>$sys->toArray()];
  1514.     }
  1515.     public function editPasswordAndPicture(array $data)
  1516.     {
  1517.         $user = $data["current_user"];
  1518.         switch ($data["type"])
  1519.         {
  1520.             case "picture":
  1521.                 if(!array_key_exists("file",$data)) return ["message"=>"file field is required","statut"=>false,"data"=>"","code"=>401];
  1522.                 $user->setPhoto($data["file"]["path"]);
  1523.                 $this->em->persist($user);
  1524.                 $this->em->flush();
  1525.                 $log = new Log();
  1526.                 $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT05'));
  1527.                 if(!is_null($operation))
  1528.                 {
  1529.                     $log->setOperation($operation);
  1530.                     $log->setUser($this->currenUser);
  1531.                     $log->setObservation($user->getId());
  1532.                     $this->em->persist($log);
  1533.                     $this->em->flush();
  1534.                 }
  1535.                 return ["message"=>"picture updated","statut"=>true,"data"=>$user->toArray(),"code"=>201];
  1536.                 break;
  1537.             case "password":
  1538.                 if(!array_key_exists("c-password",$data)) return ["message"=>"c-password field is required","statut"=>false,"data"=>"","code"=>401];
  1539.                 if(!array_key_exists("n-password",$data)) return ["message"=>"n-password field is required","statut"=>false,"data"=>"","code"=>401];
  1540.                 $res=$this->encoder->isPasswordValid($user,$data["c-password"]);
  1541.                 if($res ==false) return ["message"=>"current_password_invalid","statut"=>false,"data"=>"","code"=>401];
  1542.                 if(strlen($data["n-password"])<6) return ["message"=>"new_password_invalid","statut"=>false,"data"=>"","code"=>401];
  1543.                 $user->setPassword($this->passwordHasher->hashPassword($user,$data["n-password"] ));
  1544.                 $this->em->persist($user);
  1545.                 $this->em->flush();
  1546.                 $log = new Log();
  1547.                 $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT04'));
  1548.                 if(!is_null($operation))
  1549.                 {
  1550.                     $log->setOperation($operation);
  1551.                     $log->setUser($this->currenUser);
  1552.                     $log->setObservation($user->getId());
  1553.                     $this->em->persist($log);
  1554.                     $this->em->flush();
  1555.                 }
  1556.                 return ["message"=>"profile_updated","statut"=>true,"data"=>$user,"code"=>201];
  1557.                 break;
  1558.             default:
  1559.                 return ["message"=>"no type added","statut"=>false,"data"=>"","code"=>401];
  1560.                 break;
  1561.         }
  1562.     }
  1563.     public function searchUser(array $data,int $limit,int $offset)
  1564.     {
  1565.         if(!array_key_exists("keywords",$data))  return ["message"=>"keywords field is required","statut"=>false,"code"=>""];
  1566.         $res = $this->em->getRepository(User::class)->search($data["keywords"],$limit,$offset);
  1567.         $datas=[];
  1568.         foreach ($res as $el)
  1569.         {
  1570.             $e=$el->getMiniArray();
  1571.             $f = $this->container->get("upload_service")->getFile($e["picture"]);
  1572.             $e["picture"] = "data:".$f["data"]["mime"].";base64, ".$f["data"]["file"];
  1573.             $datas[]=$e;
  1574.         }
  1575.         /*$log = new Log();
  1576.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT06'));
  1577.         if(!is_null($operation))
  1578.         {
  1579.             $log->setOperation($operation);
  1580.             $log->setUser($this->currenUser);
  1581.             $log->setObservation($data["keywords"]);
  1582.             $this->em->persist($log);
  1583.             $this->em->flush();
  1584.         }
  1585.         */
  1586.         return ["message"=>"","statut"=>true,"data"=>$datas];
  1587.     }
  1588.     public function searchUser2(array $data,int $limit,int $offset)
  1589.     {
  1590.         if(!array_key_exists("keywords",$data))  return ["message"=>"keywords field is required","statut"=>false,"code"=>""];
  1591.         $res = $this->em->getRepository(User::class)->search2($data["keywords"],$limit,$offset);
  1592.         $datas=[];
  1593.         foreach ($res as $el)
  1594.         {
  1595.             $e=$el->getMiniArray();
  1596.             $f = $this->container->get("upload_service")->getFile($e["picture"]);
  1597.             $e["picture"] = "data:".$f["data"]["mime"].";base64, ".$f["data"]["file"];
  1598.             $datas[]=$e;
  1599.         }
  1600.         /*$log = new Log();
  1601.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT06'));
  1602.         if(!is_null($operation))
  1603.         {
  1604.             $log->setOperation($operation);
  1605.             $log->setUser($this->currenUser);
  1606.             $log->setObservation($data["keywords"]);
  1607.             $this->em->persist($log);
  1608.             $this->em->flush();
  1609.         }
  1610.         */
  1611.         return ["message"=>"","statut"=>true,"data"=>$datas];
  1612.     }
  1613.     public function deleteItem(array $data,string $type)
  1614.     {
  1615.         if(!array_key_exists("id",$data)) return ["message"=>"id field is required","statut"=>false,"code"=>""];
  1616.         if($type=="service")
  1617.         {
  1618.             $service = $this->em->getRepository(Service::class)->findOneBy(array("id"=>$data["id"]));
  1619.             if(is_null($service)) return ["message"=>"service not found","statut"=>false,"code"=>""];
  1620.         }
  1621.         if($type=="article")
  1622.         {
  1623.             $service = $this->em->getRepository(Article::class)->findOneBy(array("id"=>$data["id"]));
  1624.             if(is_null($service)) return ["message"=>"subject not found","statut"=>false,"code"=>""];
  1625.         }
  1626.         if($type=="type_acteur")
  1627.         {
  1628.             $service = $this->em->getRepository(TypeActeur::class)->findOneBy(array("id"=>$data["id"]));
  1629.             if(is_null($service)) return ["message"=>"type acteur not found","statut"=>false,"code"=>""];
  1630.         }
  1631.         if($type=="type_dossier")
  1632.         {
  1633.             $service = $this->em->getRepository(TypeDossier::class)->findOneBy(array("id"=>$data["id"]));
  1634.             if(is_null($service)) return ["message"=>"type dossier not found","statut"=>false,"code"=>""];
  1635.         }
  1636.         if($type=="regle")
  1637.         {
  1638.             $service = $this->em->getRepository(RegleConservation::class)->findOneBy(array("id"=>$data["id"]));
  1639.             if(is_null($service)) return ["message"=>"regle not found","statut"=>false,"code"=>""];
  1640.         }
  1641.         if($type=="cadre")
  1642.         {
  1643.             $service = $this->em->getRepository(CadreClassement::class)->findOneBy(array("id"=>$data["id"]));
  1644.             if(is_null($service)) return ["message"=>"cadre not found","statut"=>false,"code"=>""];
  1645.         }
  1646.         if($type=="rayon")
  1647.         {
  1648.             $service = $this->em->getRepository(Rayon::class)->findOneBy(array("id"=>$data["id"]));
  1649.             if(is_null($service)) return ["message"=>"rayon not found","statut"=>false,"code"=>""];
  1650.         }
  1651.         if($type=="salle")
  1652.         {
  1653.             $service = $this->em->getRepository(Salle::class)->findOneBy(array("id"=>$data["id"]));
  1654.             if($service === null) return ["message"=>"salle not found","statut"=>false,"code"=>""];
  1655.         }
  1656.         if($type=="archive_location")
  1657.         {
  1658.             $service = $this->em->getRepository(ArchiveLocation::class)->findOneBy(array("id"=>$data["id"]));
  1659.             if($service === null) return ["message"=>"Archive location not found","statut"=>false,"code"=>""];
  1660.         }
  1661.         if($type=="etagere")
  1662.         {
  1663.             $service = $this->em->getRepository(Etagere::class)->findOneBy(array("id"=>$data["id"]));
  1664.             if(is_null($service)) return ["message"=>"rack not found","statut"=>false,"code"=>""];
  1665.         }
  1666.         if($type=="boite")
  1667.         {
  1668.             $service = $this->em->getRepository(Boite::class)->findOneBy(array("id"=>$data["id"]));
  1669.             if(is_null($service)) return ["message"=>"box not found","statut"=>false,"code"=>""];
  1670.         }
  1671.         if($type=="redgister_item")
  1672.         {
  1673.             $service = $this->em->getRepository(RegisterItem::class)->findOneBy(array("id"=>$data["id"]));
  1674.             if(is_null($service)) return ["message"=>"Register item not found","statut"=>false,"code"=>""];
  1675.         }
  1676.         $service->setIsActive(false);
  1677.         $this->em->persist($service);
  1678.         $this->em->flush();
  1679.         $operation=null;
  1680.         if($type=="type_dossier")
  1681.         {
  1682.             $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT19'));
  1683.         }
  1684.         if($type=="regle")
  1685.         {
  1686.             $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT22'));
  1687.         }
  1688.         if($type=="cadre")
  1689.         {
  1690.             $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT25'));
  1691.         }
  1692.         $log = new Log();
  1693.         if(!is_null($operation))
  1694.         {
  1695.             $log->setOperation($operation);
  1696.             $log->setUser($this->currenUser);
  1697.             $log->setObservation($service->getId());
  1698.             $this->em->persist($log);
  1699.             $this->em->flush();
  1700.         }
  1701.         return ["message"=>"operation done","statut"=>true,"data"=>""];
  1702.     }
  1703.     public function createRegle(array $data)
  1704.     {
  1705.         $req=["dua","type_dua","conservation","type_conservation","observation_fr","observation_en",
  1706.             "sort_final","code","reference_fr","reference_en","type_dossier"];
  1707.         $reqObli=["dua","type_dua","conservation","type_conservation",
  1708.             "sort_final","code","type_dossier"];
  1709.         foreach ($req as $el)
  1710.         {
  1711.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>""];
  1712.         }
  1713.         foreach ($reqObli as $el)
  1714.         {
  1715.             if(trim($data[$el])=="") return ["message"=>$el." field is empty","statut"=>false,"code"=>""];
  1716.         }
  1717.         $type =$this->em->getRepository(TypeDossier::class)->findOneBy(array("id"=>$data["type_dossier"]));
  1718.         if(is_null($type)) return ["message"=>"typeDossier not found","statut"=>false,"code"=>401];
  1719.         $d = new DureeDossier();
  1720.         $d->setDua($data["dua"]);
  1721.         $d->setTypeDua($data["type_dua"]);
  1722.         $d->setConservation($data["conservation"]);
  1723.         $d->setTypeConsevation($data["type_conservation"]);
  1724.         $regle = new RegleConservation();
  1725.         $regle->setTypeDossier($type);
  1726.         $regle->setDureeDossier($d);
  1727.         $regle->setCode($data["code"]);
  1728.         $regle->setObservationFr($data["observation_fr"]);
  1729.         $regle->setObservationEn($data["observation_en"]);
  1730.         $regle->setSortFinal($data["sort_final"]);
  1731.         $regle->setTexteReferenceFr($data["reference_fr"]);
  1732.         $regle->setTexteReferenceEn($data["reference_en"]);
  1733.         $this->em->persist($regle);
  1734.         $this->em->flush();
  1735.         $log = new Log();
  1736.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT20'));
  1737.         if(!is_null($operation))
  1738.         {
  1739.             $log->setOperation($operation);
  1740.             $log->setUser($this->currenUser);
  1741.             $log->setObservation($regle->getId());
  1742.             $this->em->persist($log);
  1743.             $this->em->flush();
  1744.         }
  1745.         return ["message"=>"","statut"=>true,"data"=>$regle->toArray()];
  1746.     }
  1747.     public function editRegle(array $data)
  1748.     {
  1749.         $req=["id", "dua","type_dua","conservation","type_conservation","observation_fr","observation_en",
  1750.             "sort_final","code","reference_fr","reference_en"];
  1751.         $reqObli=["dua","type_dua","conservation","type_conservation",
  1752.             "sort_final","code","id"];
  1753.         foreach ($req as $el)
  1754.         {
  1755.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>""];
  1756.         }
  1757.         foreach ($reqObli as $el)
  1758.         {
  1759.             if(trim($data[$el])=="") return ["message"=>$el." field is empty","statut"=>false,"code"=>""];
  1760.         }
  1761.         $regle = $this->em->getRepository(RegleConservation::class)->findOneBy(array("id"=>$data["id"]));
  1762.         if(is_null($regle)) return ["message"=>"regle not found","statut"=>false,"code"=>""];
  1763.         $d = $regle->getDureeDossier();
  1764.         $d->setDua($data["dua"]);
  1765.         $d->setTypeDua($data["type_dua"]);
  1766.         $d->setConservation($data["conservation"]);
  1767.         $d->setTypeConsevation($data["type_conservation"]);
  1768.         $regle->setDureeDossier($d);
  1769.         $regle->setCode($data["code"]);
  1770.         $regle->setObservationFr($data["observation_fr"]);
  1771.         $regle->setObservationEn($data["observation_en"]);
  1772.         $regle->setSortFinal($data["sort_final"]);
  1773.         $regle->setTexteReferenceFr($data["reference_fr"]);
  1774.         $regle->setTexteReferenceEN($data["reference_en"]);
  1775.         $this->em->persist($regle);
  1776.         $this->em->flush();
  1777.         $log = new Log();
  1778.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT21'));
  1779.         if(!is_null($operation))
  1780.         {
  1781.             $log->setOperation($operation);
  1782.             $log->setUser($this->currenUser);
  1783.             $log->setObservation($regle->getId());
  1784.             $this->em->persist($log);
  1785.             $this->em->flush();
  1786.         }
  1787.         return ["message"=>"","statut"=>true,"data"=>$regle->toArray()];
  1788.     }
  1789.     public function editCadreClassement(array $data)
  1790.     {
  1791.         $req=["niveau","ordre","code","nom_en","nom_fr","desc_fr","desc_en","url_sys","parent","id"];
  1792.         $reqObli=["niveau","ordre","code","nom_en","nom_fr","parent","id"];
  1793.         foreach ($req as $el)
  1794.         {
  1795.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>""];
  1796.         }
  1797.         foreach ($reqObli as $el)
  1798.         {
  1799.             if(empty($el)) return ["message"=>$el." field is empty","statut"=>false,"code"=>""];
  1800.         }
  1801.         $c = $this->em->getRepository(CadreClassement::class)->findOneBy(array("id"=>$data["id"]));
  1802.         if(is_null($c)) return ["message"=>"cadre not found","statut"=>false,"code"=>""];
  1803.         $old = $this->em->getRepository(CadreClassement::class)->findOneBy(array("code"=>$data["code"],"isActive"=>1));
  1804.         if(!is_null($old)) {
  1805.             if($old->getId()!=$c->getId())return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  1806.         }
  1807.         $c->setOrdre($data["ordre"]);
  1808.         $c->setCode($data["code"]);
  1809.         $c->setNomEn($data["nom_en"]);
  1810.         $c->setNomFr($data["nom_fr"]);
  1811.         $c->setDescEn($data["desc_en"]);
  1812.         $c->setDescFr($data["desc_fr"]);
  1813.         $c->setUrlSys($data["url_sys"]);
  1814.         $c->setLocalisation("");
  1815.         if($data["parent"]!='')
  1816.         {
  1817.             $p = $this->em->getRepository(CadreClassement::class)->findOneBy(array("id"=>$data["parent"]));
  1818.             if(is_null($p)) return ["message"=>"parent not found","statut"=>false,"code"=>""];
  1819.             else
  1820.             {
  1821.                 if($p->getId() != $c->getId()) {
  1822.                     $c->setCardreClassement($p);
  1823.                     $c->setNiveau($data["niveau"]);
  1824.                 }
  1825.             }
  1826.         }
  1827.         else
  1828.         {
  1829.             $c->setNiveau($data["niveau"]);
  1830.         }
  1831.         $this->em->persist($c);
  1832.         $this->em->flush();
  1833.         $log = new Log();
  1834.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT24'));
  1835.         if(!is_null($operation))
  1836.         {
  1837.             $log->setOperation($operation);
  1838.             $log->setUser($this->currenUser);
  1839.             $log->setObservation($c->getId());
  1840.             $this->em->persist($log);
  1841.             $this->em->flush();
  1842.         }
  1843.         return ["message"=>"","statut"=>true,"data"=>$c->toArray()];
  1844.     }
  1845.     public function editBordereau(array $data)
  1846.     {
  1847.         $req=["numero","du","id","boite","cote","cadre"];
  1848.         foreach ($req as $el)
  1849.         {
  1850.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>""];
  1851.         }
  1852.         if(strlen($data["numero"])===0) return ["message"=>"numero field is empty","statut"=>false,"code"=>""];
  1853.         if(strlen($data["du"])===0) return ["message"=>"du field is empty","statut"=>false,"code"=>""];
  1854.          if(strlen($data["boite"])===0) return ["message"=>"boite field is empty","statut"=>false,"code"=>""];
  1855.         if(strlen($data["cote"])===0) return ["message"=>"cote field is empty","statut"=>false,"code"=>""];
  1856.         if(strlen($data["cadre"])===0) return ["message"=>"cadre field is empty","statut"=>false,"code"=>""];
  1857.         $b= $this->em->getRepository(Bordereau::class)->findOneBy(array("id"=>$data["id"]));
  1858.         if($b === null) return ["message"=>"bordereau not found","statut"=>false,"code"=>""];
  1859.         $old = $this->em->getRepository(Bordereau::class)->findBy(['numero'=>$data['numero'],"isActive"=>1]);
  1860.         if(count($old)>=2 ) return ["message"=>$this->container->get('translator')->trans('error_slip_number'),"statut"=>false,"code"=>""];
  1861.         $cadre = $this->em->getRepository(CadreClassement::class)->findOneBy(['id'=>$data['cadre']]);
  1862.         if($cadre === null) return ["message"=>$this->container->get('translator')->trans('cadre_not_found'),"statut"=>false,"code"=>""];
  1863.         $boite = $this->em->getRepository(Boite::class)->findOneBy(['id'=>$data['boite']]);
  1864.         if($boite === null) return ["message"=>$this->container->get('translator')->trans('box_not_found'),"statut"=>false,"code"=>""];
  1865.         $b->setNumero($data["numero"]);
  1866.         $b->setDu(\DateTime::createFromFormat('d/m/Y',$data["du"]));
  1867.         $b->setBoite($boite);
  1868.         $b->setCadreClassement($cadre);
  1869.         $b->setCote($cadre->getCode());
  1870.         if(array_key_exists("file",$data)&&array_key_exists("name",$data["file"]))
  1871.         {
  1872.             $b->setFichier($data["file"]["name"]);
  1873.         }
  1874.         $this->em->persist($b);
  1875.         $this->em->flush();
  1876.         $log = new Log();
  1877.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT35'));
  1878.         if($operation !== null)
  1879.         {
  1880.             $log->setOperation($operation);
  1881.             $log->setUser($this->currenUser);
  1882.             $log->setObservation($b->getId());
  1883.             $this->em->persist($log);
  1884.             $this->em->flush();
  1885.         }
  1886.         return ["message"=>"","statut"=>true,"data"=>$b->toArray()];
  1887.     }
  1888.     public function searchBordereau(array $data,int $limit,int $offset)
  1889.     {
  1890.         if(!array_key_exists("keywords",$data))  return ["message"=>"keywords field is required","statut"=>false,"code"=>""];
  1891.         $res = $this->em->getRepository(Bordereau::class)->search($data["keywords"],$limit,$offset);
  1892.         $datas=[];
  1893.         foreach ($res as $el)
  1894.         {
  1895.             $datas[]=$el->toArray();
  1896.         }
  1897.         /*$log = new Log();
  1898.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT06'));
  1899.         if(!is_null($operation))
  1900.         {
  1901.             $log->setOperation($operation);
  1902.             $log->setUser($this->currenUser);
  1903.             $log->setObservation($data["keywords"]);
  1904.             $this->em->persist($log);
  1905.             $this->em->flush();
  1906.         }
  1907.         */
  1908.         return ["message"=>"","statut"=>true,"data"=>$datas];
  1909.     }
  1910.     public function searchService(array $data,int $limit,int $offset)
  1911.     {
  1912.         if(!array_key_exists("keywords",$data))  return ["message"=>"keywords field is required","statut"=>false,"code"=>""];
  1913.         $res = $this->em->getRepository(Service::class)->search($data["keywords"],$limit,$offset);
  1914.         $datas=[];
  1915.         foreach ($res as $el)
  1916.         {
  1917.             $datas[]=$el->toArray();
  1918.         }
  1919.         /*
  1920.         $log = new Log();
  1921.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT06'));
  1922.         if(!is_null($operation))
  1923.         {
  1924.             $log->setOperation($operation);
  1925.             $log->setUser($this->currenUser);
  1926.             $log->setObservation($data["keywords"]);
  1927.             $this->em->persist($log);
  1928.             $this->em->flush();
  1929.         }
  1930.         */
  1931.         return ["message"=>"","statut"=>true,"data"=>$datas];
  1932.     }
  1933.     public function searchTypeActeur(array $data,int $limit,int $offset)
  1934.     {
  1935.         if(!array_key_exists("keywords",$data))  return ["message"=>"keywords field is required","statut"=>false,"code"=>""];
  1936.         $res = $this->em->getRepository(TypeActeur::class)->search($data["keywords"],$limit,$offset);
  1937.         $datas=[];
  1938.         foreach ($res as $el)
  1939.         {
  1940.             $datas[]=$el->toArray();
  1941.         }
  1942.         return ["message"=>"","statut"=>true,"data"=>$datas];
  1943.     }
  1944.     public function searchTypeDossier(array $data,int $limit,int $offset)
  1945.     {
  1946.         if(!array_key_exists("keywords",$data))  return ["message"=>"keywords field is required","statut"=>false,"code"=>""];
  1947.         $res = $this->em->getRepository(TypeDossier::class)->search($data["keywords"],$limit,$offset);
  1948.         $datas=[];
  1949.         foreach ($res as $el)
  1950.         {
  1951.             $datas[]=$el->toArray();
  1952.         }
  1953.         /*$log = new Log();
  1954.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT06'));
  1955.         if(!is_null($operation))
  1956.         {
  1957.             $log->setOperation($operation);
  1958.             $log->setUser($this->currenUser);
  1959.             $log->setObservation($data["keywords"]);
  1960.             $this->em->persist($log);
  1961.             $this->em->flush();
  1962.         }
  1963.         */
  1964.         return ["message"=>"","statut"=>true,"data"=>$datas];
  1965.     }
  1966.     public function createFolder(array $data)
  1967.     {
  1968.         $req=["type_confidentialite",
  1969.             "bordereau","type","description",
  1970.             "titre","reference",
  1971.             "cote_dossier","observation","date_cloture","date_type",
  1972.             "date_creation","langue","files","location","boite","ref_int"];
  1973.         /* $reqObli=["service_verseur","service_producteur",
  1974.              "bordereau","type",
  1975.              "titre","reference",
  1976.              "cote_dossier","date_cloture",
  1977.              "date_creation","langue","date_depot","date_versement"];*/
  1978.         foreach ($req as $el)
  1979.         {
  1980.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>""];
  1981.         }
  1982.         /* foreach ($reqObli as $el)
  1983.          {
  1984.              if(empty($data[$el])) return ["message"=>$el." field is empty","statut"=>false,"code"=>""];
  1985.          }*/
  1986.         $data['reference']= $this->generateReference()["data"];
  1987.         $type = $this->em->getRepository(TypeDossier::class)->findOneBy(array("id"=>$data["type"]));
  1988.         if(is_null($type)) return ["message"=>"type dossier not found","statut"=>false,"code"=>""];
  1989.         $b = $this->em->getRepository(Bordereau::class)->findOneBy(array("id"=>$data["bordereau"]));
  1990.         if(is_null($b)) return ["message"=>"bordereau not found","statut"=>false,"code"=>""];
  1991.         $conf = $this->em->getRepository(TypeConfidentialite::class)->findOneBy(array("id"=>$data["type_confidentialite"]));
  1992.         if(is_null($conf)) return ["message"=>"type confidentialite not found","statut"=>false,"code"=>""];
  1993.         $cadre = $this->em->getRepository(CadreClassement::class)->findOneBy(array("id"=>$data["cote_dossier"]));
  1994.         if(is_null($cadre)) return ["message"=>"cadre de classement not found","statut"=>false,"code"=>""];
  1995.         $boite = $this->em->getRepository(Boite::class)->findOneBy(array("id"=>$data["boite"]));
  1996.         if(is_null($boite)) return ["message"=>"box not found","statut"=>false,"code"=>""];
  1997.         $old = $this->em->getRepository(Dossier::class)->findOneBy(["reference"=>$data["reference"]]);
  1998.         if($old !== null) return ["message"=>$this->container->get('translator')->trans("reference already used"),"statut"=>false,"code"=>""];
  1999.         $dossier = new Dossier();
  2000.         if(array_key_exists("parent_folder",$data) && strlen($data["parent_folder"])>0){
  2001.             $parentFolder = $this->em->getRepository(Dossier::class)->findOneBy(["reference"=>$data["parent_folder"]]);
  2002.             if($parentFolder===null){
  2003.                 return ["message"=>$this->container->get('translator')->trans("parent_folder_not_found"),"statut"=>false,"code"=>""];
  2004.             }
  2005.             $dossier->setDossierParent($parentFolder);
  2006.         }
  2007.         $dossier->setType($type);
  2008.         $dossier->setBordereau($b);
  2009.         $dossier->setTitre($data["titre"]);
  2010.         $dossier->setObservation($data["observation"]);
  2011.         $dossier->setLocalisation($data["location"]);
  2012.         $dossier->setLangue($data["langue"]);
  2013.         $dossier->setCadreClassement($cadre);
  2014.         $dossier->setBoite($boite);
  2015.         $dossier->setCoteDossier($cadre->getCode());
  2016.         $dossier->setDescription($data["description"]);
  2017.         $dossier->setReference($data["reference"]);
  2018.         $dossier->setRefInterne($data["ref_int"]);
  2019.         $dossier->setTypeConfidentialite($conf);
  2020.         $df = $data["date_cloture"];
  2021.         $dc = $data["date_creation"];
  2022.         switch ($data["date_type"])
  2023.         {
  2024.             case 0:
  2025.                 $df = $data["date_cloture"];
  2026.                 $dc = $data["date_creation"];
  2027.                 break;
  2028.             case 1:
  2029.                 if($data["date_cloture"] != ""){
  2030.                     $df = "01/".$data["date_cloture"];
  2031.                 }
  2032.                 if($data["date_creationloture"] != ""){
  2033.                     $dc = "01/".$data["date_creation"];
  2034.                 }
  2035.                 break;
  2036.             case 2:
  2037.                 if($data["date_cloture"] != ""){
  2038.                     $df = "01/01/".$data["date_cloture"];
  2039.                 }
  2040.                 if($data["date_creation"] != ""){
  2041.                     $dc = "01/01/".$data["date_creation"];
  2042.                 }
  2043.                 break;
  2044.         }
  2045.         $dossier->setDateCreation(\DateTime::createFromFormat('d/m/Y',$dc));
  2046.         if($df != ""){
  2047.             $dossier->setDateCloture(\DateTime::createFromFormat('d/m/Y',$df));
  2048.         }
  2049.         else{
  2050.             $dossier->setDateCloture(null);
  2051.         }
  2052.         if(array_key_exists('category',$data)){
  2053.             $dossier->setCategory((int)$data['category']);
  2054.         }
  2055.         $dossier->setDateType($data["date_type"]);
  2056.         $nb=count($data["files"]);
  2057.         $dossier->setNbPiece($nb);
  2058.         if($nb>0)
  2059.         {
  2060.             foreach ($data["files"] as $f)
  2061.             {
  2062.                 $file = new Fichier();
  2063.                 $file->setNom($f["name"]);
  2064.                 $file->setFolderNameAndName($dossier->getTitre()." | ". $f["name"]);
  2065.                 $file->setExtension($f["extension"]);
  2066.                 $file->setType($f["type"]);
  2067.                 $file->setTaille($f["size"]);
  2068.                 $file->setPath($f["path"]);
  2069.                 $file->setAuteur($data["user"]->getNom()." ".$data["user"]->getPrenom());
  2070.                 $file->setDossier($dossier);
  2071.                 $dossier->addFichier($file);
  2072.             }
  2073.         }
  2074.         $this->em->persist($dossier);
  2075.         $this->em->flush();
  2076.         $log = new Log();
  2077.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT36'));
  2078.         if(!is_null($operation))
  2079.         {
  2080.             $log->setOperation($operation);
  2081.             $log->setUser($this->currenUser);
  2082.             $log->setObservation($dossier->getId());
  2083.             $this->em->persist($log);
  2084.             $this->em->flush();
  2085.         }
  2086.         return ["message"=>"","statut"=>true,"data"=>$dossier->toArray()];
  2087.     }
  2088.     public function generateReference()
  2089.     {
  2090.         $ref="B";
  2091.         $date = new \DateTime();
  2092.         $ref = strtoupper(uniqid('B'.$date->format("Y"), false));
  2093.         return ["message"=>"","statut"=>true,"data"=>$ref];
  2094.     }
  2095.     public function updatePassword(array $data)
  2096.     {
  2097.         $user = $data["user"];
  2098.         if(!array_key_exists("c-password",$data)) return ["message"=>"c-password field is required","statut"=>false,"data"=>$user,"code"=>401];
  2099.         if(!array_key_exists("n-password",$data)) return ["message"=>"n-password field is required","statut"=>false,"data"=>$user,"code"=>401];
  2100.         $res=$this->encoder->isPasswordValid($user,$data["c-password"]);
  2101.         if($res ==false) return ["message"=>"current_password_invalid","statut"=>false,"data"=>$user,"code"=>401];
  2102.         $res = strlen($data["n-password"])>=6;
  2103.         if($res ==false) return ["message"=>"new_password_invalid","statut"=>false,"data"=>$user,"code"=>401];
  2104.         $user->setPassword($this->passwordHasher->hashPassword($user,$data["n-password"] ));
  2105.         $this->em->persist($user);
  2106.         $this->em->flush();
  2107.         $log = new Log();
  2108.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT04'));
  2109.         if(!is_null($operation))
  2110.         {
  2111.             $log->setOperation($operation);
  2112.             $log->setUser($this->currenUser);
  2113.             $log->setObservation($user->getId());
  2114.             $this->em->persist($log);
  2115.             $this->em->flush();
  2116.         }
  2117.         return ["message"=>"profile_updated","statut"=>true,"data"=>$user,"code"=>201];
  2118.     }
  2119.     public function updatePicture(array $data)
  2120.     {
  2121.         $user = $data["user"];
  2122.         $user->setPhoto($data["file"]);
  2123.         $this->em->persist($user);
  2124.         $this->em->flush();
  2125.         $log = new Log();
  2126.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT05'));
  2127.         if(!is_null($operation))
  2128.         {
  2129.             $log->setOperation($operation);
  2130.             $log->setUser($this->currenUser);
  2131.             $log->setObservation($user->getId());
  2132.             $this->em->persist($log);
  2133.             $this->em->flush();
  2134.         }
  2135.         return ["message"=>"profile_updated","statut"=>true,"data"=>$user,"code"=>201];
  2136.     }
  2137.     public function updateSystemInfo(array $data)
  2138.     {
  2139.         $req=["name","country","slogan","phone","fax","bp","ftp_user","ftp_password","ftp_dir","ftp_port","ftp_protocol","ftp_folder"];
  2140.         if(!in_array($data["field"],$req))
  2141.         {
  2142.             return ["message"=>"field_not_available","statut"=>false,"data"=>[],"code"=>401];
  2143.         }
  2144.         else
  2145.         {
  2146.             $sys = $this->em->getRepository(System::class)->findOneBy(array('statut'=>1));
  2147.             if(is_null($sys)) return ["message"=>"system info not available on database","statut"=>false,"data"=>[],"code"=>401];
  2148.             if(strlen($data["value"])==0) return ["message"=>"empty_field","statut"=>false,"data"=>[],"code"=>401];
  2149.             switch ($data["field"])
  2150.             {
  2151.                 case 'name':
  2152.                     $sys->setOrganisationName($data["value"]);
  2153.                     break;
  2154.                 case 'country':
  2155.                     $sys->setCountry($data["value"]);
  2156.                     break;
  2157.                 case 'slogan':
  2158.                     $sys->setSlogan($data["value"]);
  2159.                     break;
  2160.                 case 'phone':
  2161.                     $sys->setPhone($data["value"]);
  2162.                     break;
  2163.                 case 'fax':
  2164.                     $sys->setFax($data["value"]);
  2165.                     break;
  2166.                 case 'bp':
  2167.                     $sys->setBp($data["value"]);
  2168.                     break;
  2169.                 case 'ftp_user':
  2170.                     $sys->setFtpUser($data["value"]);
  2171.                     break;
  2172.                 case 'ftp_password':
  2173.                     $hashed = $this->encoder->hashPassword($sys, $data["value"]);
  2174.                     $sys->setFtpPassword($hashed);
  2175.                     break;
  2176.                 case 'ftp_dir':
  2177.                     $sys->setFtpDirectory($data["value"]);
  2178.                     break;
  2179.                 case 'ftp_port':
  2180.                     $sys->setFtpPort($data["value"]);
  2181.                     break;
  2182.                 case 'ftp_protocol':
  2183.                     $sys->setFtpProtocole($data["value"]);
  2184.                     break;
  2185.                 case 'ftp_folder':
  2186.                     $sys->setFtpFolder($data["value"]);
  2187.                     break;
  2188.                 default:
  2189.                     return ["message"=>"field_not_available","statut"=>false,"data"=>[],"code"=>401];
  2190.                     break;
  2191.             }
  2192.             $this->em->persist($sys);
  2193.             $this->em->flush();
  2194.             $log = new Log();
  2195.             $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT08'));
  2196.             if(!is_null($operation))
  2197.             {
  2198.                 $log->setOperation($operation);
  2199.                 $log->setUser($this->currenUser);
  2200.                 $log->setObservation($data["field"]);
  2201.                 $this->em->persist($log);
  2202.                 $this->em->flush();
  2203.             }
  2204.             return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2205.         }
  2206.     }
  2207.     public function getSystemInfo()
  2208.     {
  2209.         $sys = $this->em->getRepository(System::class)->findOneBy(array('statut'=>1));
  2210.         if($sys!= null){
  2211.            if($sys->getFtpPassword()!==""){
  2212.                $sys->setFtpPassword("xxxxxxx");
  2213.            }
  2214.         }
  2215.         return ["message"=>"","statut"=>true,"data"=>$sys,"code"=>201];
  2216.     }
  2217.     public function getOneObject(array $data)
  2218.     {
  2219.         if(!array_key_exists("type",$data)&&!array_key_exists("id",$data))
  2220.         {
  2221.             return ["message"=>"type or id is missing","statut"=>false,"data"=>[],"code"=>401];
  2222.         }
  2223.         switch ($data["type"])
  2224.         {
  2225.             case 'service':
  2226.                 $e = $this->em->getRepository(Service::class)->findOneBy(array("id"=>$data["id"]));
  2227.                 break;
  2228.             case 'article':
  2229.                 $e = $this->em->getRepository(Article::class)->findOneBy(array("id"=>$data["id"]));
  2230.                 break;
  2231.             case 'news':
  2232.                 $e = $this->em->getRepository(News::class)->findOneBy(array("id"=>$data["id"]));
  2233.                 break;
  2234.             case 'rayon':
  2235.                 $e = $this->em->getRepository(Rayon::class)->findOneBy(array("id"=>$data["id"]));
  2236.                 break;
  2237.             case 'etagere':
  2238.                 $e = $this->em->getRepository(Etagere::class)->findOneBy(array("id"=>$data["id"]));
  2239.                 break;
  2240.             case 'boite':
  2241.                 $e = $this->em->getRepository(Boite::class)->findOneBy(array("id"=>$data["id"]));
  2242.                 break;
  2243.             case 'salle':
  2244.                 $e = $this->em->getRepository(Salle::class)->findOneBy(array("id"=>$data["id"]));
  2245.                 break;
  2246.             case 'archive_location':
  2247.                 $e = $this->em->getRepository(ArchiveLocation::class)->findOneBy(array("id"=>$data["id"]));
  2248.                 break;
  2249.             case 'user':
  2250.                 $e = $this->em->getRepository(User::class)->findOneBy(array("id"=>$data["id"]));
  2251.                 break;
  2252.             case 'regle':
  2253.                 $e = $this->em->getRepository(RegleConservation::class)->findOneBy(array("id"=>$data["id"]));
  2254.                 break;
  2255.             case 'cadre':
  2256.                 $e = $this->em->getRepository(CadreClassement::class)->findOneBy(array("id"=>$data["id"]));
  2257.                 break;
  2258.             case 'bordereau':
  2259.                 $e = $this->em->getRepository(Bordereau::class)->findOneBy(array("id"=>$data["id"]));
  2260.                 break;
  2261.             case 'dossier':
  2262.                 $e = $this->em->getRepository(Dossier::class)->findOneBy(array("id"=>$data["id"]));
  2263.                 if(!is_null($e))
  2264.                 {
  2265.                     $log = new Log();
  2266.                     $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT42'));
  2267.                     if(!is_null($operation))
  2268.                     {
  2269.                         $log->setOperation($operation);
  2270.                         $log->setUser($this->currenUser);
  2271.                         $log->setObservation($e->getId());
  2272.                         $this->em->persist($log);
  2273.                         $this->em->flush();
  2274.                     }
  2275.                 }
  2276.                 break;
  2277.             case 'workgroup':
  2278.                 $e = $this->em->getRepository(Workgroup::class)->findOneBy(array("id"=>$data["id"]));
  2279.                 break;
  2280.             case 'type-courrier':
  2281.                 $e = $this->em->getRepository(TypeCourrier::class)->findOneBy(array("id"=>$data["id"]));
  2282.                 break;
  2283.             case 'piece-jointe':
  2284.                 $e = $this->em->getRepository(PieceJointe::class)->findOneBy(array("id"=>$data["id"]));
  2285.                 if($e !== null)
  2286.                 {
  2287.                     $log = new Log();
  2288.                     $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT60'));
  2289.                     if($operation !== null)
  2290.                     {
  2291.                         $log->setOperation($operation);
  2292.                         $log->setUser($this->currenUser);
  2293.                         $log->setObservation($e->getId());
  2294.                         $this->em->persist($log);
  2295.                         $this->em->flush();
  2296.                     }
  2297.                 }
  2298.                 break;
  2299.             case 'type-tache':
  2300.                 $e = $this->em->getRepository(TypeTache::class)->findOneBy(array("id"=>$data["id"]));
  2301.                 break;
  2302.             case 'courtier':
  2303.                 $e = $this->em->getRepository(Courtier::class)->findOneBy(array("id"=>$data["id"]));
  2304.                 break;
  2305.             case 'acteur':
  2306.                 $e = $this->em->getRepository(ActeurExterne::class)->findOneBy(array("id"=>$data["id"]));
  2307.                 break;
  2308.             case 'register_item':
  2309.                 $e = $this->em->getRepository(RegisterItem::class)->findOneBy(array("id"=>$data["id"]));
  2310.                 break;
  2311.             default:
  2312.                 return ["message"=>"type not available","statut"=>false,"data"=>[],"code"=>401];
  2313.                 break;
  2314.         }
  2315.         if($e === null) return ["message"=>$data["type"]." not found","statut"=>false,"data"=>[],"code"=>401];
  2316.         $el = $e->toArray();
  2317.         if($data['type'] === 'user')
  2318.         {
  2319.             $f = $this->container->get("upload_service")->getFile($el["picture"]);
  2320.             $el["picture"] = "data:".$f["data"]["mime"].";base64, ".$f["data"]["file"];
  2321.         }
  2322.         return ["message"=>"","statut"=>true,"data"=>$el,"code"=>201];
  2323.     }
  2324.     public function getServiceRole(array $data)
  2325.     {
  2326.         if(!array_key_exists("id",$data))
  2327.         {
  2328.             return ["message"=>"type or id is missing","statut"=>false,"data"=>[],"code"=>401];
  2329.         }
  2330.         else
  2331.         {
  2332.             $ser = $this->em->getRepository(Service::class)->findOneBy(array("id"=>$data["id"]));
  2333.             if(is_null($ser)) return ["message"=>"service not found","statut"=>false,"data"=>[],"code"=>401];
  2334.             else
  2335.             {
  2336.                 $roles = $ser->getRoles();
  2337.                 $res=[];
  2338.                 foreach ($roles as $r)
  2339.                 {
  2340.                     if($r->getIsActive())$res[]=$r->toArray();
  2341.                 }
  2342.                 return ["message"=>"","statut"=>true,"data"=>$res,"code"=>201];
  2343.             }
  2344.         }
  2345.     }
  2346.     public function editUser(array $data)
  2347.     {
  2348.         $result = $this->verifyBasicInfo2($data);
  2349.         if($result["statut"]==false)
  2350.         {
  2351.             return $result;
  2352.         }
  2353.         else
  2354.         {
  2355.             $user = $this->hydrateBasicInfo2($result["data"],$result["user"]);
  2356.             $this->em->persist($user);
  2357.             $this->em->flush();
  2358.             $log = new Log();
  2359.             $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT13'));
  2360.             if(!is_null($operation))
  2361.             {
  2362.                 $log->setOperation($operation);
  2363.                 $log->setUser($this->currenUser);
  2364.                 $log->setObservation($user->getId());
  2365.                 $this->em->persist($log);
  2366.                 $this->em->flush();
  2367.             }
  2368.             return ["message"=>"","statut"=>true,"data"=>$user->toArray()];
  2369.         }
  2370.     }
  2371.     public function editLogo(array  $data)
  2372.     {
  2373.         if(!array_key_exists("file",$data)) return ["message"=>"file field is required","statut"=>false,"data"=>"","code"=>401];
  2374.         $required =["name","size","extension","type","path"];
  2375.         foreach ($required as $key=>$el)
  2376.         {
  2377.             if(!array_key_exists($el,$data["file"]))
  2378.             {
  2379.                 return ["message"=>$el." field is required","statut"=>false,"data"=>"","code"=>401];
  2380.             }
  2381.         }
  2382.         $sys = $this->em->getRepository(System::class)->findOneBy(array("statut"=>1));
  2383.         if(is_null($sys))  return ["message"=>"system info not found","statut"=>false,"data"=>"","code"=>401];
  2384.         $sys->setOrganisationLogo($data["file"]["path"]);
  2385.         $this->em->persist($sys);
  2386.         $this->em->flush();
  2387.         return ["message"=>"picture updated","statut"=>true,"data"=>$sys->toArray(),"code"=>201];
  2388.     }
  2389.     public function activateMultipleNews(array  $data)
  2390.     {
  2391.         if(!array_key_exists("ids",$data))  return ["message"=>"ids field is required","statut"=>false,"data"=>"","code"=>401];
  2392.         $elements = $this->em->getRepository(News::class)->findMultiple($data["ids"]);
  2393.         foreach ($elements as $el)
  2394.         {
  2395.             $el->setStatus(true);
  2396.             $this->em->persist($el);
  2397.         }
  2398.         if(count($elements)>0)
  2399.         {
  2400.             $this->em->flush();
  2401.         }
  2402.         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2403.     }
  2404.     public function desactivateMultipleNews(array  $data)
  2405.     {
  2406.         if(!array_key_exists("ids",$data))  return ["message"=>"ids field is required","statut"=>false,"data"=>"","code"=>401];
  2407.         $elements = $this->em->getRepository(News::class)->findMultiple($data["ids"]);
  2408.         foreach ($elements as $el)
  2409.         {
  2410.             $el->setStatus(false);
  2411.             $this->em->persist($el);
  2412.         }
  2413.         if(count($elements)>0)
  2414.         {
  2415.             $this->em->flush();
  2416.         }
  2417.         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2418.     }
  2419.     public function deleteMultiple(array  $data)
  2420.     {
  2421.         switch ($data["option"])
  2422.         {
  2423.             case 'delete':
  2424.                 switch ($data["type"])
  2425.                 {
  2426.                     case 'service':
  2427.                         $elements = $this->em->getRepository(Service::class)->findMultiple($data["ids"]);
  2428.                         foreach ($elements as $el)
  2429.                         {
  2430.                             $el->setIsActive(false);
  2431.                             $this->em->persist($el);
  2432.                         }
  2433.                         if(count($elements)>0)
  2434.                         {
  2435.                             $this->em->flush();
  2436.                         }
  2437.                         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2438.                         break;
  2439.                     case 'workgroup':
  2440.                         $elements = $this->em->getRepository(Workgroup::class)->findMultiple($data["ids"]);
  2441.                         foreach ($elements as $el)
  2442.                         {
  2443.                             $el->setIsActive(false);
  2444.                             $this->em->persist($el);
  2445.                         }
  2446.                         if(count($elements)>0)
  2447.                         {
  2448.                             $this->em->flush();
  2449.                         }
  2450.                         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2451.                         break;
  2452.                     case 'news':
  2453.                         $elements = $this->em->getRepository(News::class)->findMultiple($data["ids"]);
  2454.                         foreach ($elements as $el)
  2455.                         {
  2456.                             $el->setIsActive(false);
  2457.                             $this->em->persist($el);
  2458.                         }
  2459.                         if(count($elements)>0)
  2460.                         {
  2461.                             $this->em->flush();
  2462.                         }
  2463.                         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2464.                         break;
  2465.                     case 'rayon':
  2466.                         $elements = $this->em->getRepository(Rayon::class)->findMultiple($data["ids"]);
  2467.                         foreach ($elements as $el)
  2468.                         {
  2469.                             $el->setIsActive(false);
  2470.                             $this->em->persist($el);
  2471.                         }
  2472.                         if(count($elements)>0)
  2473.                         {
  2474.                             $this->em->flush();
  2475.                         }
  2476.                         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2477.                         break;
  2478.                     case 'etagere':
  2479.                         $elements = $this->em->getRepository(Etagere::class)->findMultiple($data["ids"]);
  2480.                         foreach ($elements as $el)
  2481.                         {
  2482.                             $el->setIsActive(false);
  2483.                             $this->em->persist($el);
  2484.                         }
  2485.                         if(count($elements)>0)
  2486.                         {
  2487.                             $this->em->flush();
  2488.                         }
  2489.                         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2490.                         break;
  2491.                     case 'boite':
  2492.                         $elements = $this->em->getRepository(Boite::class)->findMultiple($data["ids"]);
  2493.                         foreach ($elements as $el)
  2494.                         {
  2495.                             $el->setIsActive(false);
  2496.                             $this->em->persist($el);
  2497.                         }
  2498.                         if(count($elements)>0)
  2499.                         {
  2500.                             $this->em->flush();
  2501.                         }
  2502.                         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2503.                         break;
  2504.                     case 'salle':
  2505.                         $elements = $this->em->getRepository(Salle::class)->findMultiple($data["ids"]);
  2506.                         foreach ($elements as $el)
  2507.                         {
  2508.                             $el->setIsActive(false);
  2509.                             $this->em->persist($el);
  2510.                         }
  2511.                         if(count($elements)>0)
  2512.                         {
  2513.                             $this->em->flush();
  2514.                         }
  2515.                         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2516.                         break;
  2517.                     case 'archive_location':
  2518.                         $elements = $this->em->getRepository(ArchiveLocation::class)->findMultiple($data["ids"]);
  2519.                         foreach ($elements as $el)
  2520.                         {
  2521.                             $el->setIsActive(false);
  2522.                             $this->em->persist($el);
  2523.                         }
  2524.                         if(count($elements)>0)
  2525.                         {
  2526.                             $this->em->flush();
  2527.                         }
  2528.                         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2529.                         break;
  2530.                     case 'user':
  2531.                         $elements = $this->em->getRepository(User::class)->findMultiple($data["ids"]);
  2532.                         foreach ($elements as $el)
  2533.                         {
  2534.                             $el->setIsActive(false);
  2535.                             $this->em->persist($el);
  2536.                         }
  2537.                         if(count($elements)>0)
  2538.                         {
  2539.                             $this->em->flush();
  2540.                         }
  2541.                         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2542.                         break;
  2543.                     case 'type-dossier':
  2544.                         $elements = $this->em->getRepository(TypeDossier::class)->findMultiple($data["ids"]);
  2545.                         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT19'));
  2546.                         foreach ($elements as $el)
  2547.                         {
  2548.                             $el->setIsActive(false);
  2549.                             $this->em->persist($el);
  2550.                             if(!is_null($operation))
  2551.                             {
  2552.                                 $log = new Log();
  2553.                                 $log->setOperation($operation);
  2554.                                 $log->setUser($this->currenUser);
  2555.                                 $log->setObservation($el->getId());
  2556.                                 $this->em->persist($log);
  2557.                             }
  2558.                         }
  2559.                         if(count($elements)>0)
  2560.                         {
  2561.                             $this->em->flush();
  2562.                         }
  2563.                         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2564.                         break;
  2565.                     case 'regle':
  2566.                         $elements = $this->em->getRepository(RegleConservation::class)->findMultiple($data["ids"]);
  2567.                         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT80'));
  2568.                         foreach ($elements as $el)
  2569.                         {
  2570.                             $el->setIsActive(false);
  2571.                             $this->em->persist($el);
  2572.                             if(!is_null($operation))
  2573.                             {
  2574.                                 $log = new Log();
  2575.                                 $log->setOperation($operation);
  2576.                                 $log->setUser($this->currenUser);
  2577.                                 $log->setObservation($el->getId());
  2578.                                 $this->em->persist($log);
  2579.                             }
  2580.                         }
  2581.                         if(count($elements)>0)
  2582.                         {
  2583.                             $this->em->flush();
  2584.                         }
  2585.                         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2586.                         break;
  2587.                     case 'cadre':
  2588.                         $elements = $this->em->getRepository(CadreClassement::class)->findMultiple($data["ids"]);
  2589.                         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT25'));
  2590.                         foreach ($elements as $el)
  2591.                         {
  2592.                             $el->setIsActive(false);
  2593.                             $this->em->persist($el);
  2594.                             if(!is_null($operation))
  2595.                             {
  2596.                                 $log = new Log();
  2597.                                 $log->setOperation($operation);
  2598.                                 $log->setUser($this->currenUser);
  2599.                                 $log->setObservation($el->getId());
  2600.                                 $this->em->persist($log);
  2601.                             }
  2602.                         }
  2603.                         if(count($elements)>0)
  2604.                         {
  2605.                             $this->em->flush();
  2606.                         }
  2607.                         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2608.                         break;
  2609.                     case 'type-courrier':
  2610.                         $elements = $this->em->getRepository(TypeCourrier::class)->findMultiple($data["ids"]);
  2611.                         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT81'));
  2612.                         foreach ($elements as $el)
  2613.                         {
  2614.                             $el->setIsActive(false);
  2615.                             $this->em->persist($el);
  2616.                             if($operation !== null)
  2617.                             {
  2618.                                 $log = new Log();
  2619.                                 $log->setOperation($operation);
  2620.                                 $log->setUser($this->currenUser);
  2621.                                 $log->setObservation($el->getId());
  2622.                                 $this->em->persist($log);
  2623.                             }
  2624.                         }
  2625.                         if(count($elements)>0)
  2626.                         {
  2627.                             $this->em->flush();
  2628.                         }
  2629.                         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2630.                         break;
  2631.                     case 'piece-jointe':
  2632.                         $elements = $this->em->getRepository(PieceJointe::class)->findMultiple($data["ids"]);
  2633.                         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT69'));
  2634.                         foreach ($elements as $el)
  2635.                         {
  2636.                             $el->setIsActive(false);
  2637.                             $this->em->persist($el);
  2638.                          /*   if($operation !== null)
  2639.                             {
  2640.                                 $log = new Log();
  2641.                                 $log->setOperation($operation);
  2642.                                 $log->setUser($this->currenUser);
  2643.                                 $log->setObservation($el->getId());
  2644.                                 $this->em->persist($log);
  2645.                             }*/
  2646.                         }
  2647.                         if(count($elements)>0)
  2648.                         {
  2649.                             $this->em->flush();
  2650.                         }
  2651.                         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2652.                     case 'type-tache':
  2653.                         $elements = $this->em->getRepository(TypeTache::class)->findMultiple($data["ids"]);
  2654.                         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT82'));
  2655.                         foreach ($elements as $el)
  2656.                         {
  2657.                             $el->setIsActive(false);
  2658.                             $this->em->persist($el);
  2659.                             if($operation !== null)
  2660.                             {
  2661.                                 $log = new Log();
  2662.                                 $log->setOperation($operation);
  2663.                                 $log->setUser($this->currenUser);
  2664.                                 $log->setObservation($el->getId());
  2665.                                 $this->em->persist($log);
  2666.                             }
  2667.                         }
  2668.                         if(count($elements)>0)
  2669.                         {
  2670.                             $this->em->flush();
  2671.                         }
  2672.                         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2673.                         break;
  2674.                     case 'acteur':
  2675.                         $elements = $this->em->getRepository(ActeurExterne::class)->findMultiple($data["ids"]);
  2676.                         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT83'));
  2677.                         foreach ($elements as $el)
  2678.                         {
  2679.                             $el->setIsActive(false);
  2680.                             $this->em->persist($el);
  2681.                             if($operation !== null)
  2682.                             {
  2683.                                 $log = new Log();
  2684.                                 $log->setOperation($operation);
  2685.                                 $log->setUser($this->currenUser);
  2686.                                 $log->setObservation($el->getId());
  2687.                                 $this->em->persist($log);
  2688.                             }
  2689.                         }
  2690.                         if(count($elements)>0)
  2691.                         {
  2692.                             $this->em->flush();
  2693.                         }
  2694.                         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2695.                         break;
  2696.                     case 'courtier':
  2697.                         $elements = $this->em->getRepository(Courtier::class)->findMultiple($data["ids"]);
  2698.                         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT84'));
  2699.                         foreach ($elements as $el)
  2700.                         {
  2701.                             $el->setIsActive(false);
  2702.                             $this->em->persist($el);
  2703.                             if($operation !== null)
  2704.                             {
  2705.                                 $log = new Log();
  2706.                                 $log->setOperation($operation);
  2707.                                 $log->setUser($this->currenUser);
  2708.                                 $log->setObservation($el->getId());
  2709.                                 $this->em->persist($log);
  2710.                             }
  2711.                         }
  2712.                         if(count($elements)>0)
  2713.                         {
  2714.                             $this->em->flush();
  2715.                         }
  2716.                         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2717.                         break;
  2718.                     case 'register_item':
  2719.                         $elements = $this->em->getRepository(RegisterItem::class)->findMultiple($data["ids"]);
  2720.                         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT19'));
  2721.                         foreach ($elements as $el)
  2722.                         {
  2723.                             $el->setIsActive(false);
  2724.                             $this->em->persist($el);
  2725.                         }
  2726.                         if(count($elements)>0)
  2727.                         {
  2728.                             $this->em->flush();
  2729.                         }
  2730.                         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2731.                         break;
  2732.                 }
  2733.                 break;
  2734.             case 'activate':
  2735.                 $elements = $this->em->getRepository(User::class)->findMultiple($data["ids"]);
  2736.                 $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT15'));
  2737.                 foreach ($elements as $el)
  2738.                 {
  2739.                     $el->setIsClose(false);
  2740.                     $this->em->persist($el);
  2741.                     if(!is_null($operation))
  2742.                     {
  2743.                         $log = new Log();
  2744.                         $log->setOperation($operation);
  2745.                         $log->setUser($this->currenUser);
  2746.                         $log->setObservation($el->getId());
  2747.                         $this->em->persist($log);
  2748.                     }
  2749.                 }
  2750.                 if(count($elements)>0)
  2751.                 {
  2752.                     $this->em->flush();
  2753.                 }
  2754.                 return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2755.                 break;
  2756.             case 'desactivate':
  2757.                 $elements = $this->em->getRepository(User::class)->findMultiple($data["ids"]);
  2758.                 $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT03'));
  2759.                 foreach ($elements as $el)
  2760.                 {
  2761.                     $el->setIsClose(true);
  2762.                     $this->em->persist($el);
  2763.                     if(!is_null($operation))
  2764.                     {
  2765.                         $log = new Log();
  2766.                         $log->setOperation($operation);
  2767.                         $log->setUser($this->currenUser);
  2768.                         $log->setObservation($el->getId());
  2769.                         $this->em->persist($log);
  2770.                     }
  2771.                 }
  2772.                 if(count($elements)>0)
  2773.                 {
  2774.                     $this->em->flush();
  2775.                 }
  2776.                 return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  2777.                 break;
  2778.         }
  2779.         return ["message"=>"bad type","statut"=>false,"data"=>[],"code"=>401];
  2780.     }
  2781.     public function getHistory(array $data)
  2782.     {
  2783.         $req=["user","start_date","end_date","operation_type"];
  2784.         foreach ($req as $r)
  2785.         {
  2786.             if(!array_key_exists($r,$data)) return ["message"=>$r." field is required","statut"=>false,"data"=>"","code"=>401];
  2787.         }
  2788.         $offset = 0;
  2789.         $limit = 100;
  2790.         if(array_key_exists("offset",$data)){
  2791.             $offset = intval($data["offset"]);
  2792.         }
  2793.         if(array_key_exists("limit",$data)){
  2794.             $limit = intval($data["limit"]);
  2795.         }
  2796.         $op_type = "";
  2797.         $operations = [
  2798.             'authentication' => [
  2799.                 'MVT01', // Log in
  2800.                 'MVT02', // Sign Out
  2801.                 'MVT03', // Blocked account
  2802.                 'MVT04', // Change password
  2803.                 'MVT16', // Forgotten password code generation
  2804.                 'MVT05', // Update profile picture
  2805.                 'MVT12', // Register a user
  2806.                 'MVT13', // Edit a user
  2807.                 'MVT14', // User empowerment management
  2808.                 'MVT15', // User unlocking
  2809.             ],
  2810.             'system_administration' => [
  2811.                 'MVT08', // System parameter change
  2812.                 'MVT26', // System log lookup
  2813.                 'MVT27', // Printing the system log
  2814.                 'MVT28', // Database backup
  2815.                 'MVT29', // Backup system folder
  2816.                 'MVT30', // Backup FTP Transfer
  2817.                 'MVT31', // Backup history print
  2818.             ],
  2819.             'settings' => [
  2820.                 'MVT32', // Consultation chart
  2821.                 'MVT17', // Save a file type
  2822.                 'MVT18', // Edit a folder type
  2823.                 'MVT19', // Delete folder type
  2824.                 'MVT20', // Save a conservation rule
  2825.                 'MVT21', // Modify a conservation rule
  2826.                 'MVT22', // Delete conservation rule
  2827.                 'MVT80', // Delete a folder conservation rule
  2828.                 'MVT23', // Save a level to the ranking frame
  2829.                 'MVT24', // Modify a ranking frame level
  2830.                 'MVT25', // Delete rank frame
  2831.                 'MVT07', // Download Guide
  2832.                 'MVT33', // OCR Scan
  2833.                 'MVT65', // Create a shelving
  2834.                 'MVT67', // Update a shelving
  2835.                 'MVT73', // Create a shelf
  2836.                 'MVT74', // Update a shelf
  2837.                 'MVT75', // Create an archive box
  2838.                 'MVT76', // Update an archive box
  2839.                 'MVT66', // Create a workgroup
  2840.                 'MVT72', // Update workgroup
  2841.                 'MVT78', // Update a mail type
  2842.                 'MVT81', // Delete a mail type
  2843.                 'MVT79', // Update a task type
  2844.                 'MVT82', // Delete a task type
  2845.                 'MVT83', // Delete an external actor
  2846.                 'MVT84', // Delete a courier
  2847.                 'MVT09', // Register a service
  2848.                 'MVT10', // Edit a service
  2849.                 'MVT11', // Service Enablement Management
  2850.             ],
  2851.             'operation_type_file' => [
  2852.                 'MVT34', // Add an installment slip
  2853.                 'MVT35', // Edit an installment slip
  2854.                 'MVT36', // Register a folder
  2855.                 'MVT37', // treatment file paid
  2856.                 'MVT38', // Folder batch recording
  2857.                 'MVT85', // Mail batch recording
  2858.                 'MVT39', // Consultation of folder registration history
  2859.                 'MVT40', // Historical deposit printing
  2860.                 'MVT58', // Moving and reclassifying records
  2861.                 'MVT70', // Update a folder
  2862.                // 'MVT06', // Rapid search
  2863.                 'MVT41', // advanced search
  2864.                 'MVT42', // Folder Consultation
  2865.                 'MVT43', // File Download
  2866.                 'MVT44', // Print search results
  2867.                 'MVT45', // Statistics Consultation
  2868.                 'MVT71', // Consultation of archive statistics,
  2869.                 'MVT46', // Write a request
  2870.                 'MVT47', // See a request
  2871.                 'MVT48', // To treat a request
  2872.                 'MVT49', // Send an answer
  2873.                 'MVT50', // Exit file validation
  2874.                 'MVT51', // Back file validation
  2875.                 'MVT52', // Consultation of files to eliminate
  2876.                 'MVT53', // Print list of files to eliminate
  2877.                 'MVT54', // Validation elimination of records
  2878.                 'MVT55', // History of eliminations
  2879.                 'MVT56', // Historical impression of eliminations
  2880.                 'MVT57', // Control interface
  2881.                 'MVT59', // Create attached file
  2882.                 'MVT60', // Folder Attached file Consultation
  2883.                 'MVT61', // Edit mail attached file
  2884.                 'MVT69', // Delete a mail attached file
  2885.                 'MVT62', // Update status to ended
  2886.                 'MVT86', // Mail registering
  2887.             ],
  2888.             'blog' => [
  2889.                 'MVT63', // Create an article
  2890.                 'MVT64', // Update an article
  2891.                 'MVT77', // Update an article (duplicate)
  2892.             ],
  2893.         ];
  2894.         if(array_key_exists($data["operation_type"],$operations)) {
  2895.             $op_type = $operations[$data["operation_type"]];
  2896.         };
  2897.         if($op_type == ""){
  2898.             $total = $this->em->getRepository(Log::class)->findForUserNb($data["user"],$data["start_date"],$data["end_date"]);
  2899.             $res = $this->em->getRepository(Log::class)->findForUser($data["user"],$data["start_date"],$data["end_date"],$offset,$limit);
  2900.         }else{
  2901.             $total = $this->em->getRepository(Log::class)->findByListCodeNb($data["user"],$op_type,$data["start_date"],$data["end_date"]);
  2902.             $res = $this->em->getRepository(Log::class)->findByListCode($data["user"],$op_type,$data["start_date"],$data["end_date"],$offset,$limit);
  2903.         }
  2904.         $result=[];
  2905.         foreach ($res as $r) {
  2906.             $t = $r->toArray();
  2907.             $t["date"] = $r->getDate()->format('d/m/Y H:i:s');
  2908.             $result[]=$t;
  2909.         }
  2910.         return ["message"=>"","statut"=>true,"data"=>["folders"=>$result,"total_item"=>$total[0]["nb"],"current_page"=>1 + $offset/$limit,"code"=>201]];
  2911.     }
  2912.     public function saveDbOk()
  2913.     {
  2914.         $database = 'gedmindef';
  2915.         $user = 'root';
  2916.         $pass = '';
  2917.         $host = 'localhost';
  2918.         $name = 'db-'.(new \DateTime())->format('d-m-Y-H:i:s').'.sql';
  2919.         $dir =  $this->container->get("kernel")->getProjectDir()."/public/SAVE/".$name;
  2920.         exec("/opt/lampp/bin/mysqldump --user={$user} --password={$pass} --host={$host} {$database} --result-file={$dir} 2>&1", $output);
  2921.         $s = new Save();
  2922.         $s->setState(0);
  2923.         $s->setFile($name);
  2924.         $s->setSize(filesize($dir));
  2925.         $this->em->persist($s);
  2926.         $this->em->flush();
  2927.         return ["message"=>$output,"statut"=>true,"data"=>"","code"=>201];
  2928.     }
  2929.     public function saveDb()
  2930.     {
  2931.         $name = 'db-'.(new \DateTime())->format('d-m-Y-H-i-s').'.sql';
  2932.         $dir =  $this->container->get("kernel")->getProjectDir()."/public/SAVE/".$name.".gz";
  2933.         $this->backupManager->makeBackup()->run('development', [new Destination('local', $name)], 'gzip');
  2934.         $s = new Save();
  2935.         $s->setState(0);
  2936.         $s->setFile($name.".gz");
  2937.         $s->setSize(filesize($dir));
  2938.         $this->em->persist($s);
  2939.         $this->em->flush();
  2940.         return ["message"=>"ok","statut"=>true,"data"=>"","code"=>201];
  2941.     }
  2942.     private function zip( $zip,$source)
  2943.     {
  2944.         if (!extension_loaded('zip') || !file_exists($source)) {
  2945.             return false;
  2946.         }
  2947.         $source = str_replace('\\', '/', realpath($source));
  2948.         if (is_dir($source) === true) {
  2949.             $files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source), \RecursiveIteratorIterator::SELF_FIRST);
  2950.             foreach ($files as $file) {
  2951.                 $file = str_replace('\\', '/', $file);
  2952.                 // Ignore "." and ".." folders
  2953.                 if (in_array(substr($file, strrpos($file, '/')+1), array('.', '..'))) {
  2954.                     continue;
  2955.                 }
  2956.                 $file = realpath($file);
  2957.                 if (is_dir($file) === true) {
  2958.                     $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
  2959.                 } elseif (is_file($file) === true) {
  2960.                     $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
  2961.                 }
  2962.             }
  2963.         } elseif (is_file($source) === true) {
  2964.             $zip->addFromString(basename($source), file_get_contents($source));
  2965.         }
  2966.         return $zip;
  2967.     }
  2968.     private function zip2($zip,$archive_folder)
  2969.     {
  2970.         $dir = preg_replace('/[\/]{2,}/', '/', $archive_folder."/");
  2971.         $zip->addEmptyDir(basename($dir));
  2972.         $dh = opendir($dir);
  2973.         while($file = readdir($dh))
  2974.         {
  2975.             if ($file != '.' && $file != '..')
  2976.             {
  2977.                 if (is_file($dir.$file))
  2978.                 {
  2979.                     $zip -> addFile($dir.$file, basename($dir)."/".$file);
  2980.                 }
  2981.                 elseif (is_dir($dir.$file))
  2982.                 {
  2983.                     $dir2 = $dir.$file.'/';
  2984.                     $dh2 = opendir($dir2);
  2985.                     while($file1 = readdir($dh2))
  2986.                     {
  2987.                         if ($file1 != '.' && $file1 != '..')
  2988.                         {
  2989.                             if (is_file($dir2.$file1))
  2990.                             {
  2991.                                 $zip -> addFile($dir2.$file1, basename($dir).'/'.basename($dir2)."/".$file1);
  2992.                             }
  2993.                             elseif (is_dir($dir2.$file1))
  2994.                             {
  2995.                                 //$dir2 = $dir.$file1.'/';
  2996.                             }
  2997.                             else
  2998.                             {
  2999.                                 //var_dump(0);
  3000.                             }
  3001.                         }
  3002.                     }
  3003.                     closedir($dh2);
  3004.                 }
  3005.                 else
  3006.                 {
  3007.                     var_dump(0);
  3008.                 }
  3009.             }
  3010.         }
  3011.         closedir($dh);
  3012.         return $zip;
  3013.     }
  3014.     public function saveFolder()
  3015.     {
  3016.         /*$zipFileName="Archive".(new \DateTime())->format('d-m-Y-H:i:s').".zip";
  3017.         $serverPath=$this->container->get("kernel")->getProjectDir()."/public/SAVE";
  3018.         $zipFileSavePath=$serverPath."/".$zipFileName;
  3019.         $inputZip[0]=$this->container->get("kernel")->getProjectDir()."/public/"."BORDEREAU";
  3020.         $inputZip[1]=$this->container->get("kernel")->getProjectDir()."/public/"."CADRE";
  3021.         $inputZip[2]=$this->container->get("kernel")->getProjectDir()."/public/"."uploads";
  3022.         $inputZip[3]=$this->container->get("kernel")->getProjectDir()."/public/"."VER";
  3023.         $zip = new \ZipArchive();
  3024.         if(file_exists($zipFileSavePath)) {
  3025.             unlink ($zipFileSavePath);
  3026.         }
  3027.         if ($zip->open($zipFileSavePath, \ZIPARCHIVE::CREATE) != TRUE){
  3028.             return ["message"=>"Could not open archive","statut"=>false,"data"=>"","code"=>401];
  3029.         }
  3030.         else
  3031.         {
  3032.             foreach ($inputZip as $el)
  3033.             {
  3034.                 $zip = $this->zip2($zip,$el);
  3035.             }
  3036.             $zip->close();
  3037.             $s = new Save();
  3038.             $s->setState(0);
  3039.             $s->setFile($zipFileName);
  3040.             $s->setSize(filesize($zipFileSavePath));
  3041.             $this->em->persist($s);
  3042.             $this->em->flush();
  3043.             return ["message"=>"","statut"=>true,"data"=>"","code"=>201];
  3044.         }*/
  3045.         return ["message"=>"operation disable / opération desactivée","statut"=>false,"data"=>"","code"=>401];
  3046.     }
  3047.     public function listBordereauFolder(array $data)
  3048.     {
  3049.         if(!array_key_exists("id",$data)) return ["message"=>"field id is required","statut"=>false,"data"=>"","code"=>401];
  3050.         if(!array_key_exists("type",$data)) return ["message"=>"field type is required","statut"=>false,"data"=>"","code"=>401];
  3051.         $offset = 0;
  3052.         $limit = 100;
  3053.         if(array_key_exists("offset",$data)){
  3054.             $offset = intval($data["offset"]);
  3055.         }
  3056.         if(array_key_exists("limit",$data)){
  3057.             $limit = intval($data["limit"]);
  3058.         }
  3059.        $bordereau = $this->em->getRepository(Bordereau::class)->findOneBy(["id"=>$data["id"]]);
  3060.         if(is_null($bordereau)) return ["message"=>"bordereau not found","statut"=>false,"data"=>"","code"=>404];
  3061.         $total = $this->em->getRepository(Dossier::class)->findForBordereauNb($data['search']['value'],$data["id"],$data["type"], $this->currenUser->getLevel());
  3062.         $folders = $this->em->getRepository(Dossier::class)->findForBordereau($data['search']['value'],$data["id"],$data["type"],$this->currenUser->getLevel(),$offset,$limit);
  3063.         $res =[];
  3064.         foreach ($folders as $f)
  3065.         {
  3066.             $res[] = $f->toArray();
  3067.         }
  3068.         return ["message"=>"","statut"=>true,"data"=>["folders"=>$res,"total_item"=>$total[0]["nb"],"current_page"=>1 + $offset/$limit,"code"=>201]];
  3069.     }
  3070.     public function editFolder(array $data)
  3071.     {
  3072.         $req=["type_confidentialite",
  3073.             "type","description","titre",
  3074.             "cote_dossier","observation","date_cloture","date_type",
  3075.             "date_creation","langue","added_files","remove_files","id","location","boite","ref_int"];
  3076.         /*$reqObli=["service_verseur","service_producteur","type",
  3077.             "titre","cote_dossier","date_cloture",
  3078.             "date_creation","langue","date_depot","date_versement","date_type","id"];*/
  3079.         foreach ($req as $el)
  3080.         {
  3081.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>401];
  3082.         }
  3083.         /* foreach ($reqObli as $el)
  3084.          {
  3085.              if(empty($data[$el])) return ["message"=>$el." field is empty","statut"=>false,"code"=>""];
  3086.          }*/
  3087.         $dossier = $this->em->getRepository(Dossier::class)->findOneBy(array("id"=>$data["id"]));
  3088.         if(is_null($dossier)) return ["message"=>"folder not found","statut"=>false,"code"=>401];
  3089.         $type = $this->em->getRepository(TypeDossier::class)->findOneBy(array("id"=>$data["type"]));
  3090.         if(is_null($type)) return ["message"=>"type dossier not found","statut"=>false,"code"=>401];
  3091.         $conf = $this->em->getRepository(TypeConfidentialite::class)->findOneBy(array("id"=>$data["type_confidentialite"]));
  3092.         if(is_null($conf)) return ["message"=>"type confidentialite not found","statut"=>false,"code"=>401];
  3093.         $cadre = $this->em->getRepository(CadreClassement::class)->findOneBy(array("id"=>$data["cote_dossier"]));
  3094.         if(is_null($cadre)) return ["message"=>"cadre de classement not found","statut"=>false,"code"=>401];
  3095.         $boite = $this->em->getRepository(Boite::class)->findOneBy(array("id"=>$data["boite"]));
  3096.         if(is_null($boite)) return ["message"=>"box not found","statut"=>false,"code"=>401];
  3097.         if(array_key_exists("parent_folder",$data) ){
  3098.             if(strlen($data["parent_folder"])>0){
  3099.                 $parentFolder = $this->em->getRepository(Dossier::class)->findOneBy(["reference"=>$data["parent_folder"]]);
  3100.                 if($parentFolder===null){
  3101.                     return ["message"=>$this->container->get('translator')->trans("parent_folder_not_found"),"statut"=>false,"code"=>""];
  3102.                 }
  3103.                 $dossier->setDossierParent($parentFolder);
  3104.             }else{
  3105.                 $dossier->setDossierParent(null);
  3106.             }
  3107.         }
  3108.         $dossier->setType($type);
  3109.         $dossier->setTitre($data["titre"]);
  3110.         $dossier->setObservation($data["observation"]);
  3111.         $dossier->setLocalisation($data["location"]);
  3112.         $dossier->setLangue($data["langue"]);
  3113.         $dossier->setCadreClassement($cadre);
  3114.         $dossier->setBoite($boite);
  3115.         $dossier->setRefInterne($data["ref_int"]);
  3116.         $dossier->setCoteDossier($cadre->getCode());
  3117.         $dossier->setDescription($data["description"]);
  3118.         $dossier->setTypeConfidentialite($conf);
  3119.         $df = $data["date_cloture"];
  3120.         $dc = $data["date_creation"];
  3121.         switch ($data["date_type"])
  3122.         {
  3123.             case 0:
  3124.                 $df = $data["date_cloture"];
  3125.                 $dc = $data["date_creation"];
  3126.                 break;
  3127.             case 1:
  3128.                 if($data["date_cloture"] != ""){
  3129.                     $df = "01/".$data["date_cloture"];
  3130.                 }
  3131.                 $dc = "01/".$data["date_creation"];
  3132.                 break;
  3133.             case 2:
  3134.                 if($data["date_cloture"] != ""){
  3135.                     $df = "01/01/".$data["date_cloture"];
  3136.                 }
  3137.                 $dc = "01/01/".$data["date_creation"];
  3138.                 break;
  3139.         }
  3140.         $dossier->setDateCreation(\DateTime::createFromFormat('d/m/Y',$dc));
  3141.         if($df != ""){
  3142.             $dossier->setDateCloture(\DateTime::createFromFormat('d/m/Y',$df));
  3143.         }
  3144.         else{
  3145.             $dossier->setDateCloture(null);
  3146.         }
  3147.         if(array_key_exists('category',$data)){
  3148.             $dossier->setCategory((int)$data['category']);
  3149.         }
  3150.         $dossier->setDateType($data["date_type"]);
  3151.         $totalFile= $dossier->getNbPiece();
  3152.         foreach ($data["remove_files"] as $id)
  3153.         {
  3154.             $file = $this->em->getRepository(Fichier::class)->findOneBy(array("id"=>$id));
  3155.             if(!is_null($file))
  3156.             {
  3157.                 $dossier->removeFichier($file);
  3158.                 $totalFile--;
  3159.             }
  3160.         }
  3161.         foreach ($data["added_files"] as $f)
  3162.         {
  3163.             $file = new Fichier();
  3164.             $file->setNom($f["name"]);
  3165.             $file->setFolderNameAndName($dossier->getTitre()." | ". $f["name"]);
  3166.             $file->setExtension($f["extension"]);
  3167.             $file->setType($f["type"]);
  3168.             $file->setTaille($f["size"]);
  3169.             $file->setPath($f["path"]);
  3170.             $file->setAuteur($data["user"]->getNom()." ".$data["user"]->getPrenom());
  3171.             $file->setDossier($dossier);
  3172.             $dossier->addFichier($file);
  3173.             $totalFile++;
  3174.         }
  3175.         if(array_key_exists("updated_files",$data)){
  3176.             foreach ($data["updated_files"] as $file)
  3177.             {
  3178.                 foreach ($dossier->getFichiers() as $f){
  3179.                     if($f->getId() === (int)$file['id'] ){
  3180.                         $f->setNom($file['name']);
  3181.                         $f->setFolderNameAndName($dossier->getTitre()." | ". $file["name"]);
  3182.                     }
  3183.                 }
  3184.             }
  3185.         }
  3186.         foreach ($dossier->getFichiers() as $f){
  3187.             $f->setFolderNameAndName($dossier->getTitre()." | ". $f->getNom());
  3188.         }
  3189.         $dossier->setNbPiece($totalFile);
  3190.         $dossier->setIsActive(1);
  3191.         $this->em->persist($dossier);
  3192.         $log = new Log();
  3193.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT70'));
  3194.         if(!is_null($operation))
  3195.         {
  3196.             $log->setOperation($operation);
  3197.             $log->setUser($this->currenUser);
  3198.             $log->setObservation($dossier->getId());
  3199.             $this->em->persist($log);
  3200.         }
  3201.         $this->em->flush();
  3202.         return ["message"=>"","statut"=>true,"data"=>$dossier->toArray()];
  3203.     }
  3204.     public function saveMultipleFolder(array $data)
  3205.     {
  3206.         if(!array_key_exists("file",$data)) return ["message"=>"file field is required","statut"=>false,"code"=>401];
  3207.         if(!array_key_exists("bordereau",$data)) return ["message"=>"bordereau field is required","statut"=>false,"code"=>401];
  3208.         $bordereau = $this->em->getRepository(Bordereau::class)->findOneBy(['numero'=>$data['bordereau']]);
  3209.         if($bordereau ===null ) return ["message"=>"bordereau not found","statut"=>false,"code"=>""];
  3210.         $file =$this->container->get('upload_service')->uploadBase64($data["file"]);
  3211.         if($file["statut"]==false) return ["message"=>"error_file_upload","statut"=>false,"code"=>401];
  3212.         if(!in_array(strtolower($file["file"]["encoding"]),["utf-8","iso-8859-1"]))
  3213.         {
  3214.             $f = $this->container->get('upload_service')->getTargetDirectory()."/FOLDER/".$file["file"]["path"];
  3215.             unlink($f);
  3216.             return ["message"=>$this->container->get('translator')->trans("bad_encoding")." ".$file["file"]["encoding"],"statut"=>false,"code"=>401];
  3217.         }
  3218.         $f = $this->container->get('upload_service')->getTargetDirectory()."/FOLDER/".$file["file"]["path"];
  3219.         $fileError = fopen($this->container->get('upload_service')->getImportDirectory()."file_error.txt", "a");
  3220.         file_put_contents($this->container->get('upload_service')->getImportDirectory()."file_error.txt",'');
  3221.         $fp = fopen($f, "r");
  3222.         $firstLine = fgets($fp);
  3223.         rewind($fp);
  3224.         // BOM cleanup si nécessaire
  3225.         $bom = "\xEF\xBB\xBF";
  3226.         if (strncmp($firstLine, $bom, 3) === 0) {
  3227.             $firstLine = substr($firstLine, 3);
  3228.         }
  3229.         $delimiter = ','; // défaut
  3230.         $semicolonCount = substr_count($firstLine, ';');
  3231.         $commaCount     = substr_count($firstLine, ',');
  3232.         if ($semicolonCount > $commaCount) {
  3233.             $delimiter = ';';
  3234.         }
  3235.     $i=0;
  3236.         $tab=[];
  3237.     while (($datai = fgetcsv($fp, 10000, $delimiter)) !== FALSE) {
  3238.         $tab[] = $datai;
  3239.     }        
  3240.         $j=0;
  3241.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT38'));
  3242.         $this->em->getConnection()->beginTransaction();
  3243.         foreach ($tab as $index=> $r) {
  3244.             if($index>0){
  3245.                 $j++;
  3246.                 if(count($r)==12) {
  3247.                     $type = $this->em->getRepository(TypeDossier::class)->findOneBy(array("code"=>trim($r[1])));
  3248.                     if(is_null($type)) return ["message"=>"type dossier not found","statut"=>false,"code"=>""];
  3249.                     $b = $bordereau;
  3250.                     $conf = $this->em->getRepository(TypeConfidentialite::class)->findOneBy(array("niveau"=>1));
  3251.                     if(is_null($conf)) return ["message"=>"type confidentialite not found","statut"=>false,"code"=>""];
  3252.                     $cadre = $this->em->getRepository(CadreClassement::class)->findOneBy(array("code"=>trim($r[9])));
  3253.                     if(is_null($cadre)) return ["message"=>"cadre de classement not found","statut"=>false,"code"=>""];
  3254.                     $boite = $this->em->getRepository(Boite::class)->findOneBy(array("code"=>trim($r[8])));
  3255.                     if(is_null($boite)) return ["message"=>"box not found","statut"=>false,"code"=>""];
  3256.                     $parentFolder  = null;
  3257.                     if(trim($r[11])!==""){
  3258.                         $parentFolders = $this->em->getRepository(Dossier::class)->findBy(array("refInterne"=>trim($r[11])));
  3259.                         if(count($parentFolders)==0){
  3260.                             return ["message"=>$this->container->get('translator')->trans('parent_folder_not_found')." ".trim($r[11]),"statut"=>false,"code"=>""];
  3261.                         }elseif (count($parentFolders)==1){
  3262.                             $parentFolder = $parentFolders[0];
  3263.                         }else{
  3264.                             return ["message"=>$this->container->get('translator')->trans('multiple_folder_with_same_ref')." ".trim($r[11]),"statut"=>false,"code"=>""];
  3265.                         }
  3266.                     }
  3267.                     $dossier = new Dossier();
  3268.                     $dossier->setType($type);
  3269.                     $dossier->setDossierParent($parentFolder);
  3270.                     $dossier->setBordereau($b);
  3271.                     $dossier->setTitre(trim($r[2]));
  3272.                     $dossier->setObservation("");
  3273.                     $dossier->setLangue(strtolower(trim($r[4])));
  3274.                     $dossier->setCadreClassement($cadre);
  3275.                     $dossier->setBoite($boite);
  3276.                     $dossier->setOrdreRangement(0);
  3277.                     $dossier->setCoteDossier($cadre->getCode());
  3278.                     $dossier->setDescription(trim($r[3]));
  3279.                     $dossier->setReference($this->generateReference()["data"]);
  3280.                     $dossier->setRefInterne(trim($r[0]));
  3281.                     //$dossier->setCategory((int)trim($r[10]));
  3282.                     $dossier->setTypeConfidentialite($conf);
  3283.                     $dossier->setStatut(0);
  3284.                     try{
  3285.                         $df = $r[7];
  3286.                         $dc = $r[6];
  3287.                         switch ($r[5])
  3288.                         {
  3289.                             case 0:
  3290.                                 $df = $r[7];
  3291.                                 $dc = $r[6];
  3292.                                 break;
  3293.                             case 1:
  3294.                                 if($r[7] != ""){
  3295.                                     $df = "01/".$r[7];
  3296.                                 }
  3297.                                 $dc = "01/".$r[6];
  3298.                                 break;
  3299.                             case 2:
  3300.                                 if($r[7] != ""){
  3301.                                     $df = "01/01/".$r[7];
  3302.                                 }
  3303.                                 $dc = "01/01/".$r[6];
  3304.                                 break;
  3305.                         }
  3306.                         $dossier->setCategory((int)$r[10]);
  3307.                         switch ($dossier->getCategory()){
  3308.                             case 1:
  3309.                                 if($r[7] != ""){
  3310.                                     $dossier->setDateCloture(\DateTime::createFromFormat('d/m/Y',$df));
  3311.                                 }
  3312.                                 else{
  3313.                                     $dossier->setDateCloture(null);
  3314.                                 }
  3315.                                 $dossier->setDateCreation(\DateTime::createFromFormat('d/m/Y',$dc));
  3316.                                 break;
  3317.                             default:
  3318.                                 $dossier->setDateCloture(\DateTime::createFromFormat('d/m/Y',$df));
  3319.                                 $dossier->setDateCreation(\DateTime::createFromFormat('d/m/Y',$dc));
  3320.                                 break;
  3321.                         }
  3322.                         $dossier->setDateType((int)trim($r[5]));
  3323.                         $this->em->persist($dossier);
  3324.                         if(!is_null($operation))
  3325.                         {
  3326.                             $log = new Log();
  3327.                             $log->setOperation($operation);
  3328.                             $log->setUser($this->currenUser);
  3329.                             $log->setObservation($dossier->getId());
  3330.                             $this->em->persist($log);
  3331.                         }
  3332.                     }
  3333.                     catch (\Exception $e)
  3334.                     {
  3335.                         //return ["message"=>$e->getMessage()." ".$e->getFile()."line ".$e->getLine() ,"statut"=>false,"code"=>401];
  3336.                         return ["message"=>$e->getMessage().$e->getLine() ,"statut"=>false,"code"=>401];
  3337.                     }
  3338.                     catch (\Error $e)
  3339.                     {
  3340.                         //return ["message"=>$e->getMessage()." ".$e->getFile()."line ".$e->getLine() ,"statut"=>false,"code"=>401];
  3341.                         return ["message"=>$e->getMessage() ,"statut"=>false,"code"=>401];
  3342.                     }
  3343.                 }else{
  3344.                     return ["message"=>$this->container->get('translator')->trans('file_incorrect'),"statut"=>false,"code"=>401];
  3345.                 }
  3346.             }
  3347.         }
  3348.         try{
  3349.             $this->em->flush();
  3350.             $this->em->getConnection()->commit();
  3351.         }
  3352.         catch (\Exception $e)
  3353.         {
  3354.             $this->em->getConnection()->rollBack();
  3355.             return ["message"=>$e->getMessage()." ".$e->getFile()."line ".$e->getLine(),"statut"=>false,"code"=>401];
  3356.         }
  3357.        fclose($fp);
  3358.         unlink($f);
  3359.         return ["message"=>$this->container->get('translator')->trans("folder_saved")." : ".$j,"statut"=>true, "code"=>201,"data"=>[]];
  3360.     }
  3361.     public function markFolderAsEnded(array $data)
  3362.     {
  3363.         if(!array_key_exists("id",$data)) return ["message"=>"id field is required","statut"=>false,"code"=>401];
  3364.         $dossier = $this->em->getRepository(Dossier::class)->findOneBy(array("id"=>$data["id"]));
  3365.         if(is_null($dossier)) return ["message"=>"folder not found","statut"=>false,"code"=>401];
  3366.         $dossier->setStatut(true);
  3367.         $this->em->persist($dossier);
  3368.         $this->em->flush();
  3369.         $log = new Log();
  3370.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT62'));
  3371.         if(!is_null($operation))
  3372.         {
  3373.             $log->setOperation($operation);
  3374.             $log->setUser($this->currenUser);
  3375.             $log->setObservation($dossier->getId());
  3376.             $this->em->persist($log);
  3377.             $this->em->flush();
  3378.         }
  3379.         return ["message"=>"operation_done","data"=>$dossier->toArray(), "statut"=>true,"code"=>201];
  3380.     }
  3381.     public function  depositHistory(array $data)
  3382.     {
  3383.         if(!array_key_exists("start_date",$data)) return ["message"=>"start_date field is required","statut"=>false,"code"=>401];
  3384.         if(!array_key_exists("end_date",$data)) return ["message"=>"end_date field is required","statut"=>false,"code"=>401];
  3385.         $s = \DateTime::createFromFormat('d/m/Y',$data["start_date"]);
  3386.         $e = \DateTime::createFromFormat('d/m/Y',$data["end_date"]);
  3387.         $offset = 0;
  3388.         $limit = 100;
  3389.         if(array_key_exists("offset",$data)){
  3390.             $offset = intval($data["offset"]);
  3391.         }
  3392.         if(array_key_exists("limit",$data)){
  3393.             $limit = intval($data["limit"]);
  3394.         }
  3395.         $level = $this->currenUser->getLevel();
  3396.         $total = $this->em->getRepository(Dossier::class)->findHistoryNb($level,$data["bordereau"],$s->format("Y-m-d"),$e->format("Y-m-d"));
  3397.         $dossiers = $this->em->getRepository(Dossier::class)->findHistory($level,$data["bordereau"],$s->format("Y-m-d"),$e->format("Y-m-d"),$offset,$limit);
  3398.         $res=[];
  3399.         foreach ($dossiers as $d)
  3400.         {
  3401.             $res[]=$d->toArray();
  3402.         }
  3403.         $log = new Log();
  3404.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT39'));
  3405.         if(!is_null($operation))
  3406.         {
  3407.             $log->setOperation($operation);
  3408.             $log->setUser($this->currenUser);
  3409.             $this->em->persist($log);
  3410.             $this->em->flush();
  3411.         }
  3412.         return ["message"=>"","statut"=>true,"data"=>["folders"=>$res,"total_item"=>$total[0]["nb"],"current_page"=>1 + $offset/$limit,"code"=>201]];
  3413.     }
  3414.     public function folderToDelete()
  3415.     {
  3416.         $regles = $this->em->getRepository(RegleConservation::class)->findBy(array("isActive"=>true,"sortFinal"=>"1"));
  3417.         $ty=[];
  3418.         $types=[];
  3419.         $final=[];
  3420.         foreach ($regles as $r)
  3421.         {
  3422.             $types[]=$r->getTypeDossier()->getId();
  3423.             switch ($r->getDureeDossier()->getTypeConsevation())
  3424.             {
  3425.                 case DureeDossier::ANNEE:
  3426.                     $nb=$r->getDureeDossier()->getConservation();
  3427.                     $add = 365*$nb;
  3428.                     $ty["type_".$r->getTypeDossier()->getId()]=$add;
  3429.                     break;
  3430.                 case DureeDossier::MOIS:
  3431.                     $nb=$r->getDureeDossier()->getConservation();
  3432.                     $ty["type_".$r->getTypeDossier()->getId()]=30*$nb;
  3433.                     break;
  3434.                 case DureeDossier::SEMAINE:
  3435.                     $nb=$r->getDureeDossier()->getConservation();
  3436.                     $add = 7*$nb;
  3437.                     $ty["type_".$r->getTypeDossier()->getId()]=$add;
  3438.                     break;
  3439.                 case DureeDossier::JOUR:
  3440.                     $nb=$r->getDureeDossier()->getConservation();
  3441.                     $ty["type_".$r->getTypeDossier()->getId()]=$nb;
  3442.                     break;
  3443.                 default:
  3444.                     $ty["type_".$r->getTypeDossier()->getId()]=365*4;
  3445.                     break;
  3446.             }
  3447.         }
  3448.         $level = $this->currenUser->getLevel();
  3449.         $all = $this->em->getRepository(Dossier::class)->findForDelete($level,$types);
  3450.         foreach ($all as $d)
  3451.         {
  3452.             $date = new \DateTime();
  3453.             $tocompare = $d->getDateCreation();
  3454.             $diff = $date->diff($tocompare)->days;
  3455.             if($diff>$ty["type_".$d->getType()->getId()])
  3456.             {
  3457.                 $final[]=$d;
  3458.             }
  3459.         }
  3460.         $log = new Log();
  3461.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT52'));
  3462.         if(!is_null($operation))
  3463.         {
  3464.             $log->setOperation($operation);
  3465.             $log->setUser($this->currenUser);
  3466.             $this->em->persist($log);
  3467.             $this->em->flush();
  3468.         }
  3469.         return $final;
  3470.     }
  3471.     public function generateReference2()
  3472.     {
  3473.         $ref="BDEL";
  3474.         $date = new \DateTime();
  3475.         $ref = $ref.strtoupper($date->format("Y")).strtoupper(uniqid('', false));
  3476.         return ["message"=>"","statut"=>true,"data"=>$ref];
  3477.     }
  3478.     public function generateReference3()
  3479.     {
  3480.         $ref="DEM";
  3481.         $date = new \DateTime();
  3482.         $ref = $ref.strtoupper($date->format("Y")).strtoupper(uniqid('', false));
  3483.         return ["message"=>"","statut"=>true,"data"=>$ref];
  3484.     }
  3485.     public function deleteFolder(array $data)
  3486.     {
  3487.         $req =["reference","numero","date_decision","dossiers"];
  3488.         foreach ($req as $r)
  3489.         {
  3490.             if(!array_key_exists($r,$data)) return ["message"=>$r." field is required","statut"=>false,"code"=>401];
  3491.         }
  3492.         $nb=0;
  3493.         $el = new Elimination();
  3494.         foreach ($data["dossiers"] as $i)
  3495.         {
  3496.             $d= $this->em->getRepository(Dossier::class)->findOneBy(array("id"=>$i,"isActive"=>true));
  3497.             if(!is_null($d)){
  3498.                 $d->setIsActive(false);
  3499.                 $nb++;
  3500.                 $el->addDossier($d);
  3501.             }
  3502.         }
  3503.         $el->setReference($data["reference"]);
  3504.         $el->setNumero($data["numero"]);
  3505.         $el->setDateDecision(\DateTime::createFromFormat('d/m/Y',$data["date_decision"]));
  3506.         if($nb==0)
  3507.         {
  3508.             return ["message"=>"no folder selected, please try again","statut"=>false,"code"=>401];
  3509.         }
  3510.         else
  3511.         {
  3512.             $log = new Log();
  3513.             $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT54'));
  3514.             if(!is_null($operation))
  3515.             {
  3516.                 $log->setOperation($operation);
  3517.                 $log->setUser($this->currenUser);
  3518.                 $log->setObservation($el->getReference());
  3519.                 $this->em->persist($log);
  3520.                 $this->em->flush();
  3521.             }
  3522.             $this->em->persist($el);
  3523.             $this->em->flush();
  3524.             return ["message"=>"operation_done","statut"=>true,"code"=>201,"data"=>[]];
  3525.         }
  3526.     }
  3527.     public function  deleteFolderHistory(array $data)
  3528.     {
  3529.         if(!array_key_exists("start_date",$data)) return ["message"=>"start_date field is required","statut"=>false,"code"=>401];
  3530.         if(!array_key_exists("end_date",$data)) return ["message"=>"end_date field is required","statut"=>false,"code"=>401];
  3531.         $s = \DateTime::createFromFormat('d/m/Y',$data["start_date"]);
  3532.         $e = \DateTime::createFromFormat('d/m/Y',$data["end_date"]);
  3533.         $offset = 0;
  3534.         $limit = 100;
  3535.         if(array_key_exists("offset",$data)){
  3536.             $offset = intval($data["offset"]);
  3537.         }
  3538.         if(array_key_exists("limit",$data)){
  3539.             $limit = intval($data["limit"]);
  3540.         }
  3541.         $total = $this->em->getRepository(Elimination::class)->findHistoryNb( $s->format("Y-m-d h:i:s"),$e->format("Y-m-d"));
  3542.         $eli = $this->em->getRepository(Elimination::class)->findHistory( $s->format("Y-m-d h:i:s"),$e->format("Y-m-d"),$offset,$limit);
  3543.         $res=[];
  3544.         foreach ($eli as $e)
  3545.         {
  3546.             $ds= $e->getDossiers();
  3547.             foreach ($ds as $d)
  3548.             {
  3549.                 $t=$d->toArray();
  3550.                 $t["ref_eli"]=$e->getReference();
  3551.                 $res[]=$t;
  3552.             }
  3553.         }
  3554.         $log = new Log();
  3555.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT55'));
  3556.         if(!is_null($operation))
  3557.         {
  3558.             $log->setOperation($operation);
  3559.             $log->setUser($this->currenUser);
  3560.             $this->em->persist($log);
  3561.             $this->em->flush();
  3562.         }
  3563.         return ["message"=>"","statut"=>true,"data"=>["folders"=>$res,"total_item"=>$total[0]["nb"],"current_page"=>1 + $offset/$limit,"code"=>201]];
  3564.     }
  3565.     public function advancedSearch(array $data)
  3566.     {
  3567.         $req=["bordereau","cote","titre","localisation","type_dossier","reference","langue","date_type","start_date","end_date"];
  3568.         foreach ($req as $el)
  3569.         {
  3570.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>401];
  3571.         }
  3572.         if($data["start_date"]!="")
  3573.         {
  3574.             if(preg_match("/^[a-zA-Z]+$/", $data["start_date"])==false){
  3575.                 switch ($data["date_type"])
  3576.                 {
  3577.                     case 0:
  3578.                         $d = \DateTime::createFromFormat('d/m/Y',$data["start_date"]);
  3579.                         $data["start_date"] =$d->format("Y-m-d")." 00:00:01";
  3580.                         $data["start_date_1"] =$d->format("Y-m-d");
  3581.                         $data["start_date_2"] =$d->format("Y-m-d")." 23:59:59";
  3582.                         break;
  3583.                     case 1:
  3584.                         $d = \DateTime::createFromFormat('d/m/Y',"01/".$data["start_date"]);
  3585.                         $da = clone $d;
  3586.                         $d2 = $da->add(new \DateInterval('P31D'));
  3587.                         $data["start_date"] =$d->format("Y-m-d")." 00:00:01";
  3588.                         $data["start_date_1"] =$d->format("Y-m-d");
  3589.                         $data["start_date_2"] =$d2->format("Y-m-d")." 23:59:59";
  3590.                         break;
  3591.                     case 2:
  3592.                         $d = \DateTime::createFromFormat('d/m/Y',"01/01/".$data["start_date"]);
  3593.                         $d2 = \DateTime::createFromFormat('d/m/Y',"31/12/".$data["start_date"]);
  3594.                         $data["start_date"] =$d->format("Y-m-d")." 00:00:01";
  3595.                         $data["start_date_1"] =$d->format("Y-m-d");
  3596.                         $data["start_date_2"] =$d2->format("Y-m-d")." 23:59:59";
  3597.                         break;
  3598.                 }
  3599.             }
  3600.         }
  3601.         if($data["end_date"]!="")
  3602.         {
  3603.             if(preg_match("/^[a-zA-Z]+$/", $data["end_date"])==false){
  3604.                 switch ($data["date_type"])
  3605.                 {
  3606.                     case 0:
  3607.                         $d = \DateTime::createFromFormat('d/m/Y',$data["end_date"]);
  3608.                         $data["end_date"] =$d->format("Y-m-d")." 00:00:01";
  3609.                         $data["end_date_1"] =$d->format("Y-m-d");
  3610.                         $data["end_date_2"] =$d->format("Y-m-d")." 23:59:59";
  3611.                         break;
  3612.                     case 1:
  3613.                         $d = \DateTime::createFromFormat('d/m/Y',"01/".$data["end_date"]);
  3614.                         $da = clone $d;
  3615.                         $d2 = $da->add(new \DateInterval('P31D'));
  3616.                         $data["end_date"] =$d->format("Y-m-d")." 00:00:01";
  3617.                         $data["end_date_1"] =$d->format("Y-m-d");
  3618.                         $data["end_date_2"] =$d2->format("Y-m-d")." 23:59:59";
  3619.                         break;
  3620.                     case 2:
  3621.                         $d = \DateTime::createFromFormat('d/m/Y',"01/01/".$data["end_date"]);
  3622.                         $d2 = \DateTime::createFromFormat('d/m/Y',"31/12/".$data["end_date"]);
  3623.                         $data["end_date"] =$d->format("Y-m-d")." 00:00:01";
  3624.                         $data["end_date_1"] =$d->format("Y-m-d");
  3625.                         $data["end_date_2"] =$d2->format("Y-m-d")." 23:59:59";
  3626.                         break;
  3627.                 }
  3628.             }
  3629.         }
  3630.         //$da = $this->em->getRepository(Dossier::class)->findAdvanced($level,$data);
  3631.         $level = $this->currenUser->getLevel();
  3632.         try {
  3633.             $da =  $this->container->get(FOSElasticSearchService::class)->searchAdvanced($data,$level);
  3634.         }
  3635.         catch (\Exception $e){
  3636.             return ["message"=>$e->getMessage(),"data"=>[], "statut"=>false,"code"=>401];
  3637.         }
  3638.         $res=[];
  3639.         foreach ($da as $d)
  3640.         {
  3641.             $res[]=$d->toArray();
  3642.         }
  3643.         return ["message"=>"operation_done","data"=>$res, "statut"=>true,"code"=>201];
  3644.     }
  3645.     public function showCadreFolder(array $data)
  3646.     {
  3647.         if(!array_key_exists('id',$data)) return ["message"=>"id field is required","statut"=>false,"code"=>401];
  3648.         $level = $this->currenUser->getLevel();
  3649.         $offset = 0;
  3650.         $limit = 100;
  3651.         if(array_key_exists("offset",$data)){
  3652.             $offset = intval($data["offset"]);
  3653.         }
  3654.         if(array_key_exists("limit",$data)){
  3655.             $limit = intval($data["limit"]);
  3656.         }
  3657.         $total = $this->em->getRepository(Dossier::class)->findForCadreNb($data["id"],$level);
  3658.         $folders = $this->em->getRepository(Dossier::class)->findForCadre($data["id"],$level,$offset,$limit);
  3659.         $res=[];
  3660.         foreach ($folders as $f)
  3661.         {
  3662.             $res[]=$f->toArray();
  3663.         }
  3664.         return ["message"=>"","statut"=>true,"data"=>["folders"=>$res,"total_item"=>$total[0]["nb"],"current_page"=>1 + $offset/$limit,"code"=>201]];
  3665.     }
  3666.     public function makeRequest(array $data)
  3667.     {
  3668.         $req=["motif","start_date","end_date","folders"];
  3669.         foreach ($req as $el)
  3670.         {
  3671.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>401];
  3672.         }
  3673.         $folders=[];
  3674.         foreach ($data["folders"] as $id)
  3675.         {
  3676.             $f = $this->em->getRepository(Dossier::class)->findOneBy(array("id"=>$id));
  3677.             if(!is_null($f)) $folders[]=$f;
  3678.         }
  3679.         //if(count($folders)==0) return ["message"=>"no folder founded","statut"=>false,"code"=>401];
  3680.         try{
  3681.             $s = \DateTime::createFromFormat('d/m/Y',$data["start_date"]);
  3682.             $e = \DateTime::createFromFormat('d/m/Y',$data["end_date"]);
  3683.             $demande= new DemandeArchive();
  3684.             $demande->setReference($this->generateReference3()["data"]);
  3685.             $demande->setStatut(false);
  3686.             $demande->setStartDate($s);
  3687.             $demande->setEndDate($e);
  3688.             if(array_key_exists("type",$data))
  3689.             {
  3690.                 if(!array_key_exists("acteur",$data)) return ["message"=>"acteur field is required","statut"=>false,"code"=>401];
  3691.                 $ac = $this->em->getRepository(ActeurExterne::class)->findOneBy(array("id"=>$data["acteur"]["id"]));
  3692.                 if(is_null($ac)) return ["message"=>"actor not found","statut"=>false,"code"=>401];
  3693.                 $demande->setUserType(DemandeArchive::USEREXTERNE);
  3694.                 $demande->setActeurExterne($ac);
  3695.             }
  3696.             else {
  3697.                 $demande->setUserType(DemandeArchive::USERINTERNE);
  3698.                 $demande->setUser($this->currenUser);
  3699.             }
  3700.             $demande->setMotif($data["motif"]);
  3701.             foreach ($folders as $f)
  3702.             {
  3703.                 $do = new DossierDemande();
  3704.                 $do->setStatut(false);
  3705.                 $do->setDossier($f);
  3706.                 $do->setDemande($demande);
  3707.                 $this->em->persist($do);
  3708.             }
  3709.             $notif = new Notification();
  3710.             $notif->setUser($this->currenUser);
  3711.             $notif->setDemandeArchive($demande);
  3712.             $notif->setCode(Notification::NEW_DEMANDE);
  3713.             $admins = $this->em->getRepository(User::class)->loadUserManageArchive();
  3714.             $userNotif = [];
  3715.             if(count($admins)>0){
  3716.                 foreach ($admins as $a){
  3717.                     $status = new Statut();
  3718.                     $status->setNotification($notif);
  3719.                     $status->setUser($a);
  3720.                     $notif->addStatut($status);
  3721.                     $userNotif[]=$a->getId();
  3722.                 }
  3723.             }
  3724.             else{
  3725.                 $ad = $this->em->getRepository(User::class)->findOneBy(array("type"=>1));
  3726.                 if(!is_null($ad))
  3727.                 {
  3728.                     $status = new Statut();
  3729.                     $status->setNotification($notif);
  3730.                     $status->setUser($ad);
  3731.                     $notif->addStatut($status);
  3732.                     $userNotif[]=$ad->getId();
  3733.                 }
  3734.             }
  3735.             $this->em->persist($notif);
  3736.             $this->em->flush();
  3737.             $log = new Log();
  3738.             $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT46'));
  3739.             if(!is_null($operation))
  3740.             {
  3741.                 $log->setOperation($operation);
  3742.                 $log->setUser($this->currenUser);
  3743.                 $log->setObservation($demande->getId());
  3744.                 $this->em->persist($log);
  3745.                 $this->em->flush();
  3746.             }
  3747.             return ["message"=>"operation_done","data"=>$demande->toArray(), "statut"=>true,"code"=>201,'notif_user'=>$userNotif];
  3748.         }
  3749.         catch (\Exception $e)
  3750.         {
  3751.             return ["message"=>$e->getMessage(),"statut"=>false,"code"=>401];
  3752.         }
  3753.     }
  3754.     public function showRequest(array $data)
  3755.     {
  3756.         if(!array_key_exists("id",$data)) return ["message"=>"id field is required","statut"=>false,"code"=>401];
  3757.         $demande =$this->em->getRepository(DemandeArchive::class)->findOneBy(array("isActive"=>true,"id"=>$data["id"]));
  3758.         if(is_null($demande)) return ["message"=>"demande not found","statut"=>false,"code"=>401];
  3759.         $answer = $this->em->getRepository(EmpruntArchive::class)->findOneBy(array("isActive"=>true,"demande"=>$demande));
  3760.         $res=["demande"=>$demande->toArray(),"answer"=>null,"folders"=>[]];
  3761.         if(!is_null($answer)) $res["answer"] = $answer->toArray();
  3762.         $dossiers= $this->em->getRepository(DossierDemande::class)->findBy(array("isActive"=>true,"demande"=>$demande));
  3763.         foreach ($dossiers as $d)
  3764.         {
  3765.             $res["folders"][]=$d->toArray();
  3766.         }
  3767.         if($demande->getStatut()==0)
  3768.         {
  3769.             if($this->currenUser->getType()==1)
  3770.             {
  3771.                 $demande->setStatut(1);
  3772.                 $this->em->persist($demande);
  3773.                 $this->em->flush();
  3774.             }
  3775.         }
  3776.         $log = new Log();
  3777.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT47'));
  3778.         if(!is_null($operation))
  3779.         {
  3780.             $log->setOperation($operation);
  3781.             $log->setUser($this->currenUser);
  3782.             $log->setObservation($demande->getId());
  3783.             $this->em->persist($log);
  3784.             $this->em->flush();
  3785.         }
  3786.         return ["message"=>"operation_done","data"=>$res, "statut"=>true,"code"=>201];
  3787.     }
  3788.     public function answerRequest(array $data)
  3789.     {
  3790.         $req=["motif","answer","id"];
  3791.         foreach ($req as $el)
  3792.         {
  3793.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>401];
  3794.         }
  3795.         $demande =$this->em->getRepository(DemandeArchive::class)->findOneBy(array("isActive"=>true,"id"=>$data["id"]));
  3796.         if(is_null($demande)) return ["message"=>"demande not found","statut"=>false,"code"=>401];
  3797.         if($demande->getStatut() ==2 || $demande->getStatut() ==3) return ["message"=>"operation denied","statut"=>false,"code"=>401];
  3798.         $code=DemandeArchive::DEMANDE_ACCEPTED;
  3799.         switch ($data["answer"])
  3800.         {
  3801.             case 2:
  3802.                 $code= DemandeArchive::DEMANDE_ACCEPTED;
  3803.                 break;
  3804.             case 3:
  3805.                 $code= DemandeArchive::DEMANDE_REFUSED;
  3806.                 break;
  3807.         }
  3808.         $demande->setStatut($code);
  3809.         $em = new EmpruntArchive();
  3810.         $em->setDemande($demande);
  3811.         $em->setObservation($data["motif"]);
  3812.         $em->setStatus(0);
  3813.         $notif = new Notification();
  3814.         $notif->setUser($this->currenUser);
  3815.         $notif->setEmpruntArchive($em);
  3816.         $notif->setCode($code);
  3817.         $ad = $demande->getUser();
  3818.         if(!is_null($ad))
  3819.         {
  3820.             $status = new Statut();
  3821.             $status->setNotification($notif);
  3822.             $status->setUser($ad);
  3823.             $notif->addStatut($status);
  3824.         }
  3825.         $this->em->persist($em);
  3826.         $this->em->persist($notif);
  3827.         $this->em->flush();
  3828.         $log = new Log();
  3829.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT49'));
  3830.         if(!is_null($operation))
  3831.         {
  3832.             $log->setOperation($operation);
  3833.             $log->setUser($this->currenUser);
  3834.             $log->setObservation($demande->getId());
  3835.             $this->em->persist($log);
  3836.             $this->em->flush();
  3837.         }
  3838.         return ["message"=>"operation_done","data"=>$demande->toArray(), "statut"=>true,"code"=>201];
  3839.     }
  3840.     public function updateRequest(array $data)
  3841.     {
  3842.         $req=["date_type","date","id"];
  3843.         foreach ($req as $el)
  3844.         {
  3845.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>401];
  3846.         }
  3847.         $demande =$this->em->getRepository(DemandeArchive::class)->findOneBy(array("isActive"=>true,"id"=>$data["id"]));
  3848.         if(is_null($demande)) return ["message"=>"demande not found","statut"=>false,"code"=>401];
  3849.         //if($demande->getStatut() <2) return ["message"=>"operation denied","statut"=>false,"code"=>401];
  3850.         $em=$this->em->getRepository(EmpruntArchive::class)->findOneBy(array("isActive"=>true,"demande"=>$demande));
  3851.         if(is_null($em)) return ["message"=>"demande answer not found","statut"=>false,"code"=>401];
  3852.         try{
  3853.             switch ($data["date_type"])
  3854.             {
  3855.                 case 'out':
  3856.                     $em->setOutDate(\DateTime::createFromFormat('d/m/Y',$data["date"]));
  3857.                     break;
  3858.                 case 'back':
  3859.                     $em->setBackDate(\DateTime::createFromFormat('d/m/Y',$data["date"]));
  3860.                     break;
  3861.             }
  3862.             $this->em->persist($em);
  3863.             $this->em->flush();
  3864.         }
  3865.         catch (\Exception $e)
  3866.         {
  3867.             return ["message"=>$e->getMessage(),"statut"=>false,"code"=>401];
  3868.         }
  3869.         $log = new Log();
  3870.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT48'));
  3871.         if(!is_null($operation))
  3872.         {
  3873.             $log->setOperation($operation);
  3874.             $log->setUser($this->currenUser);
  3875.             $log->setObservation($demande->getId());
  3876.             $this->em->persist($log);
  3877.             $this->em->flush();
  3878.         }
  3879.         return ["message"=>"operation_done","data"=>[], "statut"=>true,"code"=>201];
  3880.     }
  3881.     public function moveFolder(array $data)
  3882.     {
  3883.         if(!array_key_exists("ref",$data)) return ["message"=>"id field is required","statut"=>false,"code"=>401];
  3884.         if(!array_key_exists("cadre",$data)) return ["message"=>"cadre field is required","statut"=>false,"code"=>401];
  3885.         $dossier = $this->em->getRepository(Dossier::class)->findOneBy(array("reference"=>$data["ref"]));
  3886.         if(is_null($dossier)) return ["message"=>"dossier not found","statut"=>false,"code"=>401];
  3887.         $cadre = $this->em->getRepository(CadreClassement::class)->findOneBy(array("code"=>$data["cadre"]));
  3888.         if(is_null($cadre)) return ["message"=>"cadre not found","statut"=>false,"code"=>401];
  3889.         $dossier->setCadreClassement($cadre);
  3890.         $dossier->setCoteDossier($cadre->getCode());
  3891.         $log = new Log();
  3892.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT58'));
  3893.         if(!is_null($operation))
  3894.         {
  3895.             $log->setOperation($operation);
  3896.             $log->setUser($this->currenUser);
  3897.             $log->setObservation($dossier->getId());
  3898.             $this->em->persist($log);
  3899.         }
  3900.         $this->em->persist($dossier);
  3901.         $this->em->flush();
  3902.         return ["message"=>"","data"=>$dossier->toArray(),"statut"=>true,"code"=>201];
  3903.     }
  3904.     public function  requestFolderHistory(array $data)
  3905.     {
  3906.         if(!array_key_exists("start_date",$data)) return ["message"=>"start_date field is required","statut"=>false,"code"=>401];
  3907.         if(!array_key_exists("end_date",$data)) return ["message"=>"end_date field is required","statut"=>false,"code"=>401];
  3908.         $s = \DateTime::createFromFormat('d/m/Y',$data["start_date"]);
  3909.         $e = \DateTime::createFromFormat('d/m/Y',$data["end_date"]);
  3910.         $offset = 0;
  3911.         $limit = 100;
  3912.         if(array_key_exists("offset",$data)){
  3913.             $offset = intval($data["offset"]);
  3914.         }
  3915.         if(array_key_exists("limit",$data)){
  3916.             $limit = intval($data["limit"]);
  3917.         }
  3918.         $total = $this->em->getRepository(DemandeArchive::class)->findHistoryNb($s->format("Y-m-d"),$e->format("Y-m-d"));
  3919.         $eli = $this->em->getRepository(DemandeArchive::class)->findHistory($s->format("Y-m-d"),$e->format("Y-m-d"),$offset,$limit);
  3920.         $res=[];
  3921.         foreach ($eli as $e)
  3922.         {
  3923.             $t=["demande"=>$e->toArray(),"answer"=>null];
  3924.             if($e->getStatut()>1)
  3925.             {
  3926.                 $r = $this->em->getRepository(EmpruntArchive::class)->findOneBy(array("demande"=>$e));
  3927.                 if(!is_null($r)) $t["answer"] = $r->toArray();
  3928.             }
  3929.             $res[]=$t;
  3930.         }
  3931.         $log = new Log();
  3932.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT55'));
  3933.         if(!is_null($operation))
  3934.         {
  3935.             $log->setOperation($operation);
  3936.             $log->setUser($this->currenUser);
  3937.             $this->em->persist($log);
  3938.             $this->em->flush();
  3939.         }
  3940.         return ["message"=>"","statut"=>true,"data"=>["folders"=>$res,"total_item"=>$total[0]["nb"],"current_page"=>1 + $offset/$limit,"code"=>201]];
  3941.     }
  3942.     private function getDatesFromRange($start, $end, $format = 'Y-m-d') {
  3943.         // Declare an empty array
  3944.         $array = array();
  3945.         // Variable that store the date interval
  3946.         // of period 1 day
  3947.         $interval = new \DateInterval('P1D');
  3948.         $realEnd = new \DateTime($end);
  3949.         $realEnd->add($interval);
  3950.         $period = new \DatePeriod(new \DateTime($start), $interval, $realEnd);
  3951.         // Use loop to store date into array
  3952.         foreach($period as $date) {
  3953.             $array[] = $date->format($format);
  3954.         }
  3955.         // Return the array elements
  3956.         return $array;
  3957.     }
  3958.     public function  getStatistic(array $data)
  3959.     {
  3960.         if(!array_key_exists("start_date",$data)) return ["message"=>"start_date field is required","statut"=>false,"code"=>401];
  3961.         if(!array_key_exists("end_date",$data)) return ["message"=>"end_date field is required","statut"=>false,"code"=>401];
  3962.         if(!array_key_exists("type_filter",$data)) return ["message"=>"type_filter field is required","statut"=>false,"code"=>401];
  3963.         if(!array_key_exists("type",$data)) return ["message"=>"type field is required","statut"=>false,"code"=>401];
  3964.         $s = \DateTime::createFromFormat('d.m.Y',$data["start_date"])->format("Y-m-d");
  3965.         $e = \DateTime::createFromFormat('d.m.Y',$data["end_date"])->format("Y-m-d");
  3966.         $res=[];
  3967.         switch ($data["type"])
  3968.         {
  3969.             case 1:
  3970.                 //pyramide des dossiers
  3971.                 if($data["type_filter"]==1)
  3972.                 {
  3973.                     $folders= $this->em->getRepository(Dossier::class)->findStatSimple($s,$e);
  3974.                     $total = 0;
  3975.                     $ls = $this->em->getRepository(CadreClassement::class)->findBy(array("isActive"=>true,"niveau"=>1));
  3976.                     $levels =[];
  3977.                     foreach ($ls as $l)
  3978.                     {
  3979.                         $levels["cadre_".$l->getId()] = 0;
  3980.                     }
  3981.                     foreach ($folders as $f)
  3982.                     {
  3983.                         $code = "cadre_".$f->getCadreClassement()->getId();
  3984.                         if(array_key_exists($code,$levels))
  3985.                         {
  3986.                             $levels[$code]++;
  3987.                             $total++;
  3988.                         }
  3989.                     }
  3990.                     if($total==0) $total=1;
  3991.                     foreach ($ls as $l)
  3992.                     {
  3993.                         $res[]=["name"=>$l->getCode()." : ".$l->getNomFr(),"value"=>round($levels["cadre_".$l->getId()]/$total,2)*100];
  3994.                     }
  3995.                 }
  3996.                 elseif ($data["type_filter"]==3)
  3997.                 {
  3998.                     $folders= $this->em->getRepository(Dossier::class)->findStatSimple($s,$e);
  3999.                     $total = count($folders);
  4000.                     $total2=0;
  4001.                     $delete=0;
  4002.                     $save=0;
  4003.                     $none=0;
  4004.                     foreach ($folders as $f)
  4005.                     {
  4006.                         $re = $this->em->getRepository(RegleConservation::class)->findOneBy(array("typeDossier"=>$f->getType()));
  4007.                         if(!is_null($re))
  4008.                         {
  4009.                             $total2++;
  4010.                             if($re->getSortFinal()==0)$save++;
  4011.                             else $delete++;
  4012.                         }
  4013.                         else $none++;
  4014.                     }
  4015.                     if($total==0){
  4016.                         $res=[
  4017.                             ["name"=>$this->container->get('translator')->trans("regle_delete"),"value"=>0],
  4018.                             ["name"=>$this->container->get('translator')->trans("regle_save"),"value"=>0],
  4019.                             ["name"=>$this->container->get('translator')->trans("regle_none"),"value"=>0]
  4020.                         ];
  4021.                     }
  4022.                     else{
  4023.                         $res=[
  4024.                             ["name"=>$this->container->get('translator')->trans("regle_delete"),"value"=>round($delete/$total,2)*100],
  4025.                             ["name"=>$this->container->get('translator')->trans("regle_save"),"value"=>round($save/$total,2)*100],
  4026.                             ["name"=>$this->container->get('translator')->trans("regle_none"),"value"=>round($none/$total,2)*100]
  4027.                         ];
  4028.                     }
  4029.                 }
  4030.                 elseif ($data["type_filter"]==2)
  4031.                 {
  4032.                     $folders= $this->em->getRepository(Dossier::class)->findStatSimple($s,$e);
  4033.                     $total = count($folders);
  4034.                     $types=[];
  4035.                     $already=[];
  4036.                     $all=[];
  4037.                     foreach ($folders as $f)
  4038.                     {
  4039.                         if(!in_array($f->getType()->getId(),$already))
  4040.                         {
  4041.                             $already[]=$f->getType()->getId();
  4042.                             $types[]=$f->getType();
  4043.                             $all["type_".$f->getType()->getId()]=1;
  4044.                         }
  4045.                         else
  4046.                         {
  4047.                             $all["type_".$f->getType()->getId()]++;
  4048.                         }
  4049.                     }
  4050.                     if($total==0){
  4051.                         $tys = $this->em->getRepository(TypeDossier::class)->findBy(array("isActive"=>true));
  4052.                         $res=[];
  4053.                         $in=[];
  4054.                         $a=[];
  4055.                         $b=[];
  4056.                         foreach ($tys as $t)
  4057.                         {
  4058.                             if(!in_array($t->getId(),$in))
  4059.                             {
  4060.                                 $in[]=$t->getId();
  4061.                                 $a[$t->getCode()]=1;
  4062.                                 $b[$t->getCode()]=$t->getCode()." : ".$t->getNomFr();
  4063.                             }
  4064.                             else{
  4065.                                 $a[$t->getCode()]++;
  4066.                             }
  4067.                         }
  4068.                         if(count($tys)>0)
  4069.                         {
  4070.                             foreach ($a as $key=>$val)
  4071.                             {
  4072.                                 $res[]=["name"=>$b[$key],"value"=>$val];
  4073.                             }
  4074.                         }
  4075.                     }
  4076.                     else{
  4077.                         $n = count($types);
  4078.                         for($i=0;$i<$n;$i++)
  4079.                         {
  4080.                             $res[]=["name"=>$types[$i]->getCode()." : ".$types[$i]->getNomFr(),"value"=>$all["type_".$types[$i]->getId()]];
  4081.                         }
  4082.                     }
  4083.                 }
  4084.                 else{
  4085.                     $folders= $this->em->getRepository(Dossier::class)->findStatSimple($s,$e);
  4086.                     $total = count($folders);
  4087.                     $done=0;
  4088.                     $await=0;
  4089.                     foreach ($folders as $f)
  4090.                     {
  4091.                         if($f->getStatut()==0)$await++;
  4092.                         else $done++;
  4093.                     }
  4094.                     if($total==0){
  4095.                         $res=[
  4096.                             ["name"=>$this->container->get('translator')->trans("vers_treated"),"value"=>0],
  4097.                             ["name"=>$this->container->get('translator')->trans("vers_not_treated"),"value"=>0]];
  4098.                     }
  4099.                     else{
  4100.                         $res=[
  4101.                             ["name"=>$this->container->get('translator')->trans("vers_treated"),"value"=>round($done/$total,2)*100],
  4102.                             ["name"=>$this->container->get('translator')->trans("vers_not_treated"),"value"=>round($await/$total,2)*100]];
  4103.                     }
  4104.                 }
  4105.                 break;
  4106.             case 2:
  4107.                 //courbe de versement
  4108.                 $dossiers = $this->em->getRepository(Dossier::class)->findStatSimple($s,$e);
  4109.                 $res=[];
  4110.                 $res["dates"]=$this->getDatesFromRange($s, $e);
  4111.                 $res["x"][]='Dates';
  4112.                 foreach ($res["dates"] as $t)
  4113.                 {
  4114.                     $res["x"][]=$t;
  4115.                 }
  4116.                 $dates=$this->getDatesFromRange($s, $e);
  4117.                 if($data["type_filter"]==1)
  4118.                 {
  4119.                     $ls = $this->em->getRepository(CadreClassement::class)->findBy(array("isActive"=>true,"niveau"=>1));
  4120.                     $types =[];
  4121.                     $typesName=[];
  4122.                     $codes=[];
  4123.                     foreach ($ls as $l)
  4124.                     {
  4125.                         $codes[$l->getCode()]=$l->getId();
  4126.                         $types["cadre_".$l->getId()] = [];
  4127.                         $typesName["cadre_".$l->getId()]=$l;
  4128.                         foreach ($dates as $t)
  4129.                         {
  4130.                             $types["cadre_".$l->getId()][$t]=0;
  4131.                         }
  4132.                     }
  4133.                     foreach ($dossiers as $d)
  4134.                     {
  4135.                         foreach ($codes as $k=>$v){
  4136.                             if(strpos($d->getCoteDossier(), $k) !== false){
  4137.                                 $types["cadre_".$v][$d->getDate()->format("Y-m-d")]++;
  4138.                             }
  4139.                         }
  4140.                         /*if(array_key_exists($d->getCoteDossier(),$codes)){
  4141.                             $types["cadre_".$codes['']][$d->getDate()->format("Y-m-d")]++;
  4142.                         }
  4143.                         if($d->getCadreClassement()->getNiveau()==1)
  4144.                         {
  4145.                             $types["cadre_".$d->getCadreClassement()->getId()][$d->getDate()->format("Y-m-d")]++;
  4146.                         }*/
  4147.                     }
  4148.                     $res["type"]=1;
  4149.                     $res["data"] =[];
  4150.                     foreach ($types as $key=>$val)
  4151.                     {
  4152.                         $tab=[];
  4153.                         $tab[]=$key;
  4154.                         foreach ($val as $v)
  4155.                         {
  4156.                             $tab[]=$v;
  4157.                         }
  4158.                         $res["data"][]=$tab;
  4159.                     }
  4160.                     $length = count($res["data"]);
  4161.                     $totald= count($dates)+1;
  4162.                     $removeindex=[];
  4163.                     for($j=1;$j<$totald;$j++)
  4164.                     {
  4165.                         $som=0;
  4166.                         for($i=0;$i<$length;$i++)
  4167.                         {
  4168.                             $som=$som+$res["data"][$i][$j];
  4169.                         }
  4170.                         if($som==0)
  4171.                         {
  4172.                             $removeindex[]=$j;
  4173.                         }
  4174.                     }
  4175.                     $main=[];
  4176.                     foreach ($res["data"] as $t)
  4177.                     {
  4178.                         $ta=[];
  4179.                         $ta[]=$typesName[$t[0]]->getNomFr();
  4180.                         for($j=1;$j<$totald;$j++)
  4181.                         {
  4182.                             if(!in_array($j,$removeindex))
  4183.                             {
  4184.                                 $ta[]=$t[$j];
  4185.                             }
  4186.                         }
  4187.                         $main[]=$ta;
  4188.                     }
  4189.                     $res["data"]=$main;
  4190.                 }
  4191.                 elseif ($data["type_filter"]==2)
  4192.                 {
  4193.                     $types=[];
  4194.                     $in=[];
  4195.                     //$aty=[];
  4196.                     $res["type"]=2;
  4197.                     $res["data"] =[];
  4198.                     foreach ($dossiers as $d)
  4199.                     {
  4200.                         if(!in_array($d->getType()->getId(),$in))
  4201.                         {
  4202.                             $in[]=$d->getType()->getId();
  4203.                             $types[$d->getType()->getNomFr()]=[];
  4204.                             $dates=$this->getDatesFromRange($s, $e);
  4205.                             foreach ($dates as $t)
  4206.                             {
  4207.                                 $types[$d->getType()->getNomFr()][$t]=0;
  4208.                             }
  4209.                            // $aty[]=$d->getType()->getNomFr();
  4210.                         }
  4211.                     }
  4212.                     foreach ($dossiers as $d)
  4213.                     {
  4214.                         $types[$d->getType()->getNomFr()][$d->getDate()->format("Y-m-d")]++;
  4215.                     }
  4216.                     foreach ($types as $key=>$val)
  4217.                     {
  4218.                         $tab=[];
  4219.                         $tab[]=$key;
  4220.                         foreach ($val as $v)
  4221.                         {
  4222.                             $tab[]=$v;
  4223.                         }
  4224.                         $res["data"][]=$tab;
  4225.                     }
  4226.                     $length = count($res["data"]);
  4227.                     $totald= count($dates)+1;
  4228.                     $removeindex=[];
  4229.                     for($j=1;$j<$totald;$j++)
  4230.                     {
  4231.                         $som=0;
  4232.                         for($i=0;$i<$length;$i++)
  4233.                         {
  4234.                             $som=$som+$res["data"][$i][$j];
  4235.                         }
  4236.                         if($som==0)
  4237.                         {
  4238.                             $removeindex[]=$j;
  4239.                         }
  4240.                     }
  4241.                     $main=[];
  4242.                     foreach ($res["data"] as $t)
  4243.                     {
  4244.                         $ta=[];
  4245.                         for($j=0;$j<$totald;$j++)
  4246.                         {
  4247.                             if(!in_array($j,$removeindex))
  4248.                             {
  4249.                                 $ta[]=$t[$j];
  4250.                             }
  4251.                         }
  4252.                         $main[]=$ta;
  4253.                     }
  4254.                     $res["data"]=$main;
  4255.                     //var_dump($res);
  4256.                 }
  4257.                 elseif ($data["type_filter"]==3)
  4258.                 {
  4259.                     $res["type"]=3;
  4260.                     $res["data"] =[];
  4261.                     $types=["sort0"=>[],"sort1"=>[],"sort2"=>[]];
  4262.                     $dates=$this->getDatesFromRange($s, $e);
  4263.                     foreach ($dates as $t)
  4264.                     {
  4265.                         $types["sort0"][$t]=0;
  4266.                         $types["sort1"][$t]=0;
  4267.                         $types["sort2"][$t]=0;
  4268.                     }
  4269.                     foreach ($dossiers as $d)
  4270.                     {
  4271.                         $r = $this->em->getRepository(RegleConservation::class)->findOneBy(array("typeDossier"=>$d->getType()));
  4272.                         if(!is_null($r) && $r->getSortFinal()!="2")
  4273.                         {
  4274.                             $types["sort".$r->getSortFinal()][$d->getDate()->format("Y-m-d")]++;
  4275.                         }
  4276.                         else
  4277.                         {
  4278.                             $types["sort2".$r->getSortFinal()][$d->getDate()->format("Y-m-d")]++;
  4279.                         }
  4280.                     }
  4281.                     foreach ($types as $key=>$val)
  4282.                     {
  4283.                         $tab=[];
  4284.                         if($key =="sort0") $tab[]=$this->container->get("translator")->trans("regle_save");
  4285.                         elseif ($key == "sort1") $tab[]=$this->container->get("translator")->trans("regle_delete");
  4286.                         else $tab[]=$this->container->get("translator")->trans("regle_none");
  4287.                         foreach ($val as $v)
  4288.                         {
  4289.                             $tab[]=$v;
  4290.                         }
  4291.                         $res["data"][]=$tab;
  4292.                     }
  4293.                     $length = count($res["data"]);
  4294.                     $totald= count($dates)+1;
  4295.                     $removeindex=[];
  4296.                     for($j=1;$j<$totald;$j++)
  4297.                     {
  4298.                         $som=0;
  4299.                         for($i=0;$i<$length;$i++)
  4300.                         {
  4301.                             $som=$som+$res["data"][$i][$j];
  4302.                         }
  4303.                         if($som==0)
  4304.                         {
  4305.                             $removeindex[]=$j;
  4306.                         }
  4307.                     }
  4308.                     $main=[];
  4309.                     foreach ($res["data"] as $t)
  4310.                     {
  4311.                         $ta=[];
  4312.                         for($j=0;$j<$totald;$j++)
  4313.                         {
  4314.                             if(!in_array($j,$removeindex))
  4315.                             {
  4316.                                 $ta[]=$t[$j];
  4317.                             }
  4318.                         }
  4319.                         $main[]=$ta;
  4320.                     }
  4321.                     $res["data"]=$main;
  4322.                 }
  4323.                 else{
  4324.                     $res["data"]=[];
  4325.                     $res["type"]=0;
  4326.                     $types=[];
  4327.                     $dates=$this->getDatesFromRange($s, $e);
  4328.                     foreach ($dates as $t)
  4329.                     {
  4330.                         $types[$t]=0;
  4331.                     }
  4332.                     foreach ($dossiers as $d)
  4333.                     {
  4334.                         $types[$d->getDate()->format("Y-m-d")]++;
  4335.                     }
  4336.                     $tab=[];
  4337.                     $tab[]="general";
  4338.                     foreach ($types as $key=>$val)
  4339.                     {
  4340.                         $tab[]=$val;
  4341.                     }
  4342.                     $res["data"][]=$tab;
  4343.                     $length = count($res["data"]);
  4344.                     $totald= count($dates)+1;
  4345.                     $removeindex=[];
  4346.                     for($j=1;$j<$totald;$j++)
  4347.                     {
  4348.                         $som=0;
  4349.                         for($i=0;$i<$length;$i++)
  4350.                         {
  4351.                             $som=$som+$res["data"][$i][$j];
  4352.                         }
  4353.                         if($som==0)
  4354.                         {
  4355.                             $removeindex[]=$j;
  4356.                         }
  4357.                     }
  4358.                     $main=[];
  4359.                     foreach ($res["data"] as $t)
  4360.                     {
  4361.                         $ta=[];
  4362.                         for($j=0;$j<$totald;$j++)
  4363.                         {
  4364.                             if(!in_array($j,$removeindex))
  4365.                             {
  4366.                                 $ta[]=$t[$j];
  4367.                             }
  4368.                         }
  4369.                         $main[]=$ta;
  4370.                     }
  4371.                     $res["data"]=$main;
  4372.                 }
  4373.                 break;
  4374.             case 3:
  4375.                 //disque des dossiers
  4376.                 $folders= $this->em->getRepository(Dossier::class)->findStatSimple($s,$e);
  4377.                 if($data["type_filter"]==1)
  4378.                 {
  4379.                     $ls = $this->em->getRepository(CadreClassement::class)->findBy(array("isActive"=>true,"niveau"=>1));
  4380.                     $types =[];
  4381.                     $typesName=[];
  4382.                     foreach ($ls as $l)
  4383.                     {
  4384.                         $types["cadre_".$l->getId()] = 0;
  4385.                         $typesName["cadre_".$l->getId()]=$l;
  4386.                     }
  4387.                     $total=0;
  4388.                     foreach ($folders as $f)
  4389.                     {
  4390.                         if($f->getCadreClassement()->getNiveau()==1)
  4391.                         {
  4392.                             $code = "cadre_".$f->getCadreClassement()->getId();
  4393.                             $types[$code]++;
  4394.                             $total++;
  4395.                         }
  4396.                     }
  4397.                     if($total==0)$total=1;
  4398.                     $res=[];
  4399.                     foreach ($types as $key =>$val)
  4400.                     {
  4401.                         $res[]=[$typesName[$key]->getNomFr(),round($val/$total,2)*100];
  4402.                     }
  4403.                 }
  4404.                 elseif ($data["type_filter"]==2)
  4405.                 {
  4406.                     $types=[];
  4407.                     $in=[];
  4408.                     $aty=[];
  4409.                     foreach ($folders as $d)
  4410.                     {
  4411.                         if(!in_array($d->getType()->getId(),$in))
  4412.                         {
  4413.                             $in[]=$d->getType()->getId();
  4414.                             $types[$d->getType()->getCode()]=1;
  4415.                             $aty[$d->getType()->getCode()]=$d->getType()->getNomFr();
  4416.                         }
  4417.                         else
  4418.                         {
  4419.                             $types[$d->getType()->getCode()]++;
  4420.                         }
  4421.                     }
  4422.                     $res=[];
  4423.                     foreach ($aty as $k => $v)
  4424.                     {
  4425.                         $res[]=[$v,$types[$k]];
  4426.                     }
  4427.                 }
  4428.                 elseif ($data["type_filter"]==3)
  4429.                 {
  4430.                     $ok=0;
  4431.                     $no=0;
  4432.                     $none=0;
  4433.                     foreach ($folders as $f)
  4434.                     {
  4435.                         $r = $this->em->getRepository(RegleConservation::class)->findOneBy(array("typeDossier"=>$f->getType()));
  4436.                         if(!is_null($r))
  4437.                         {
  4438.                             if($r->getSortFinal()==0) $ok++;
  4439.                             else $no++;
  4440.                         }
  4441.                         else $none++;
  4442.                     }
  4443.                     $total = count($folders);
  4444.                     $res=[];
  4445.                     if($total>0)
  4446.                     {
  4447.                         $res[]=[$this->container->get('translator')->trans("regle_save"),$ok];
  4448.                         $res[]=[$this->container->get('translator')->trans("regle_delete"),$no];
  4449.                         $res[]=[$this->container->get('translator')->trans("regle_none"),$none];
  4450.                     }
  4451.                     else
  4452.                     {
  4453.                         $res[]=[$this->container->get('translator')->trans("regle_save"),0];
  4454.                         $res[]=[$this->container->get('translator')->trans("regle_delete"),0];
  4455.                         $res[]=[$this->container->get('translator')->trans("regle_none"),0];
  4456.                     }
  4457.                 }
  4458.                 else
  4459.                 {
  4460.                     $ok=0;
  4461.                     $no=0;
  4462.                     foreach ($folders as $f)
  4463.                     {
  4464.                         if($f->getStatut()==0) $no++;
  4465.                         else $ok++;
  4466.                     }
  4467.                     $total = count($folders);
  4468.                     $res=[];
  4469.                     if($total>0)
  4470.                     {
  4471.                         $res[]=[$this->container->get('translator')->trans("vers_treated"),$ok];
  4472.                         $res[]=[$this->container->get('translator')->trans("vers_not_treated"),$no];
  4473.                     }
  4474.                     else
  4475.                     {
  4476.                         $res[]=[$this->container->get('translator')->trans("vers_treated"),0];
  4477.                         $res[]=[$this->container->get('translator')->trans("vers_not_treated"),0];
  4478.                     }
  4479.                 }
  4480.                 break;
  4481.             case 4:
  4482.                 //Courbe des recherches
  4483.                 if($data["type_filter"]==1)
  4484.                 {
  4485.                     $dossiers = $this->em->getRepository(Dossier::class)->findBy(array("isActive"=>true));
  4486.                     $months=[];
  4487.                     $label=[];
  4488.                     $value1=[];
  4489.                     $value2=[];
  4490.                     $value3=[];
  4491.                     $level1=[];
  4492.                     $level2=[];
  4493.                     $level3=[];
  4494.                     for ($i = 0; $i <= 11; $i++)
  4495.                     {
  4496.                         $months[date("Y-m", strtotime( date( 'Y-m-01' )." -$i months"))] =0 ;
  4497.                         $level1[date("Y-m", strtotime( date( 'Y-m-01' )." -$i months"))] =0 ;
  4498.                         $level2[date("Y-m", strtotime( date( 'Y-m-01' )." -$i months"))] =0 ;
  4499.                         $level3[date("Y-m", strtotime( date( 'Y-m-01' )." -$i months"))] =0 ;
  4500.                     }
  4501.                     foreach ($dossiers as $d)
  4502.                     {
  4503.                         //var_dump($d->getDate()->format("Y-m"));
  4504.                         if(array_key_exists($d->getDate()->format("Y-m"),$months))
  4505.                         {
  4506.                             $months[$d->getDate()->format("Y-m")]++;
  4507.                             if($d->getCadreClassement()->getNiveau()==1)
  4508.                             {
  4509.                                 if(array_key_exists($d->getDate()->format("Y-m"),$level1))
  4510.                                 {
  4511.                                     $level1[$d->getDate()->format("Y-m")]++;
  4512.                                 }
  4513.                             }
  4514.                             elseif ($d->getCadreClassement()->getNiveau()==2)
  4515.                             {
  4516.                                 if(array_key_exists($d->getDate()->format("Y-m"),$level2))
  4517.                                 {
  4518.                                     $level2[$d->getDate()->format("Y-m")]++;
  4519.                                 }
  4520.                             }
  4521.                             else{
  4522.                                 if(array_key_exists($d->getDate()->format("Y-m"),$level3))
  4523.                                 {
  4524.                                     $level3[$d->getDate()->format("Y-m")]++;
  4525.                                 }
  4526.                             }
  4527.                         }
  4528.                     }
  4529.                     foreach ($months as $key=>$val)
  4530.                     {
  4531.                         $label[]=$key;
  4532.                         $value1[]=$level1[$key];
  4533.                         $value2[]=$level2[$key];
  4534.                         $value3[]=$level3[$key];
  4535.                     }
  4536.                     $res=["label"=>$label,"value"=>[$value1,$value2,$value3]];
  4537.                     $res["type"]=1;
  4538.                 }
  4539.                 elseif ($data["type_filter"]==2)
  4540.                 {
  4541.                     $dossiers = $this->em->getRepository(Dossier::class)->findBy(array("isActive"=>true));
  4542.                     $months=[];
  4543.                     $label=[];
  4544.                     $types=[];
  4545.                     $in=[];
  4546.                     $aty=[];
  4547.                     foreach ($dossiers as $d)
  4548.                     {
  4549.                         if(!in_array($d->getType()->getId(),$in))
  4550.                         {
  4551.                             $in[]=$d->getType()->getId();
  4552.                             $types[$d->getType()->getCode()]=[];
  4553.                             $aty[]=$d->getType()->getNomFr();
  4554.                         }
  4555.                     }
  4556.                     for ($i = 0; $i <= 11; $i++)
  4557.                     {
  4558.                         $months[date("Y-m", strtotime( date( 'Y-m-01' )." -$i months"))] =0 ;
  4559.                         foreach ($types as $k => $a)
  4560.                         {
  4561.                             $types[$k][date("Y-m", strtotime( date( 'Y-m-01' )." -$i months"))]=0;
  4562.                         }
  4563.                     }
  4564.                     foreach ($dossiers as $d)
  4565.                     {
  4566.                         //var_dump($d->getDate()->format("Y-m"));
  4567.                         if(array_key_exists($d->getDate()->format("Y-m"),$months))
  4568.                         {
  4569.                             $months[$d->getDate()->format("Y-m")]++;
  4570.                             $types[$d->getType()->getCode()][$d->getDate()->format("Y-m")]++;
  4571.                         }
  4572.                     }
  4573.                     $values=[];
  4574.                     foreach ($types as $k=>$v)
  4575.                     {
  4576.                         $values[]=array_values($v);
  4577.                     }
  4578.                     foreach ($months as $key=>$val)
  4579.                     {
  4580.                         $label[]=$key;
  4581.                     }
  4582.                     $res=["label"=>$label,"value"=>$values,"types"=>$aty];
  4583.                     $res["type"]=2;
  4584.                 }
  4585.                 elseif ($data["type_filter"]==3)
  4586.                 {
  4587.                     $dossiers = $this->em->getRepository(Dossier::class)->findBy(array("isActive"=>true));
  4588.                     $months=[];
  4589.                     $label=[];
  4590.                     $value1=[];
  4591.                     $value2=[];
  4592.                     $value3=[];
  4593.                     $delete=[];
  4594.                     $save=[];
  4595.                     $none=[];
  4596.                     for ($i = 0; $i <= 11; $i++)
  4597.                     {
  4598.                         $months[date("Y-m", strtotime( date( 'Y-m-01' )." -$i months"))] =0 ;
  4599.                         $save[date("Y-m", strtotime( date( 'Y-m-01' )." -$i months"))] =0 ;
  4600.                         $delete[date("Y-m", strtotime( date( 'Y-m-01' )." -$i months"))] =0 ;
  4601.                         $none[date("Y-m", strtotime( date( 'Y-m-01' )." -$i months"))] =0 ;
  4602.                     }
  4603.                     foreach ($dossiers as $d)
  4604.                     {
  4605.                         //var_dump($d->getDate()->format("Y-m"));
  4606.                         if(array_key_exists($d->getDate()->format("Y-m"),$months))
  4607.                         {
  4608.                             $months[$d->getDate()->format("Y-m")]++;
  4609.                             $r = $this->em->getRepository(RegleConservation::class)->findOneBy(array("typeDossier"=>$d));
  4610.                             if(!is_null($r))
  4611.                             {
  4612.                                 if($r->getSortFinal()==0) $save[$d->getDate()->format("Y-m")]++;
  4613.                                 else $delete[$d->getDate()->format("Y-m")]++;
  4614.                             }
  4615.                             else $none[$d->getDate()->format("Y-m")]++;
  4616.                         }
  4617.                     }
  4618.                     foreach ($months as $key=>$val)
  4619.                     {
  4620.                         $label[]=$key;
  4621.                         $value1[]=$save[$key];
  4622.                         $value2[]=$delete[$key];
  4623.                         $value3[]=$none[$key];
  4624.                     }
  4625.                     $res=["label"=>$label,"value"=>[$value1,$value2,$value3]];
  4626.                     $res["type"]=3;
  4627.                 }
  4628.                 else{
  4629.                     $dossiers = $this->em->getRepository(Dossier::class)->findBy(array("isActive"=>true));
  4630.                     $months=[];
  4631.                     $label=[];
  4632.                     $value=[];
  4633.                     for ($i = 0; $i <= 11; $i++)
  4634.                     {
  4635.                         $months[date("Y-m", strtotime( date( 'Y-m-01' )." -$i months"))] =0 ;
  4636.                     }
  4637.                     foreach ($dossiers as $d)
  4638.                     {
  4639.                         //var_dump($d->getDate()->format("Y-m"));
  4640.                         if(array_key_exists($d->getDate()->format("Y-m"),$months))
  4641.                         {
  4642.                             $months[$d->getDate()->format("Y-m")]++;
  4643.                         }
  4644.                     }
  4645.                     foreach ($months as $key=>$val)
  4646.                     {
  4647.                         $label[]=$key;
  4648.                         $value[]=$val;
  4649.                     }
  4650.                     $res=["label"=>$label,"value"=>$value];
  4651.                     $res["type"]=0;
  4652.                 }
  4653.                 break;
  4654.             case 5:
  4655.                 //Courbe des consultations
  4656.                 $dossiers = [];
  4657.                 $res=[];
  4658.                 $res["dates"]=$this->getDatesFromRange($s, $e);
  4659.                 $res["x"][]='Dates';
  4660.                 foreach ($res["dates"] as $t)
  4661.                 {
  4662.                     $res["x"][]=$t;
  4663.                 }
  4664.                 $logs= $this->em->getRepository(Log::class)->findStatSimple("MVT42",$s,$e);
  4665.                 $dates=$this->getDatesFromRange($s, $e);
  4666.                 $res["data"] = [];
  4667.                 if($data["type_filter"]==1)
  4668.                 {
  4669.                     $dates=$this->getDatesFromRange($s, $e);
  4670.                     $ls = $this->em->getRepository(CadreClassement::class)->findBy(array("isActive"=>true,"niveau"=>1));
  4671.                     $types =[];
  4672.                     $typesName=[];
  4673.                     foreach ($ls as $l)
  4674.                     {
  4675.                         $types["cadre_".$l->getId()] = [];
  4676.                         $typesName["cadre_".$l->getId()]=$l;
  4677.                         foreach ($dates as $t)
  4678.                         {
  4679.                             $types["cadre_".$l->getId()][$t]=0;
  4680.                         }
  4681.                     }
  4682.                     foreach ($logs as $l)
  4683.                     {
  4684.                         $d = $this->em->getRepository(Dossier::class)->findOneBy(array("id"=>$l->getObservation()));
  4685.                         if(!is_null($d))
  4686.                         {
  4687.                             if($d->getCadreClassement()->getNiveau()==1)
  4688.                             {
  4689.                                 $types["cadre_".$d->getCadreClassement()->getId()][$l->getDate()->format("Y-m-d")]++;
  4690.                             }
  4691.                         }
  4692.                     };
  4693.                     $res["type"]=1;
  4694.                     foreach ($types as $key=>$val)
  4695.                     {
  4696.                         $tab=[];
  4697.                         $tab[]=$key;
  4698.                         foreach ($val as $v)
  4699.                         {
  4700.                             $tab[]=$v;
  4701.                         }
  4702.                         $res["data"][]=$tab;
  4703.                     }
  4704.                     $length = count($res["data"]);
  4705.                     $totald= count($dates)+1;
  4706.                     $removeindex=[];
  4707.                     for($j=1;$j<$totald;$j++)
  4708.                     {
  4709.                         $som=0;
  4710.                         for($i=0;$i<$length;$i++)
  4711.                         {
  4712.                             $som=$som+$res["data"][$i][$j];
  4713.                         }
  4714.                         if($som==0)
  4715.                         {
  4716.                             $removeindex[]=$j;
  4717.                         }
  4718.                     }
  4719.                     $main=[];
  4720.                     foreach ($res["data"] as $t)
  4721.                     {
  4722.                         $ta=[];
  4723.                         $ta[]=$typesName[$t[0]]->getNomFr();
  4724.                         for($j=1;$j<$totald;$j++)
  4725.                         {
  4726.                             if(!in_array($j,$removeindex))
  4727.                             {
  4728.                                 $ta[]=$t[$j];
  4729.                             }
  4730.                         }
  4731.                         $main[]=$ta;
  4732.                     }
  4733.                     $res["data"]=$main;
  4734.                 }
  4735.                 elseif ($data["type_filter"]==2)
  4736.                 {
  4737.                     $types=[];
  4738.                     $in=[];
  4739.                     $aty=[];
  4740.                     $res["type"]=2;
  4741.                     $res["data"] = [];
  4742.                     $dossiers=[];
  4743.                     foreach ($logs as $l)
  4744.                     {
  4745.                         $d = $this->em->getRepository(Dossier::class)->findOneBy(array("id"=>$l->getObservation()));
  4746.                         if(!is_null($d))
  4747.                         {
  4748.                             if(!in_array($d->getType()->getId(),$in))
  4749.                             {
  4750.                                 $in[]=$d->getType()->getId();
  4751.                                 $types[$d->getType()->getNomFr()]=[];
  4752.                                 $dates=$this->getDatesFromRange($s, $e);
  4753.                                 foreach ($dates as $t)
  4754.                                 {
  4755.                                     $types[$d->getType()->getNomFr()][$t]=0;
  4756.                                 }
  4757.                                 $aty[]=$d->getType()->getNomFr();
  4758.                             }
  4759.                         }
  4760.                     };
  4761.                     foreach ($logs as $l)
  4762.                     {
  4763.                         $d = $this->em->getRepository(Dossier::class)->findOneBy(array("id"=>$l->getObservation()));
  4764.                         if(!is_null($d))
  4765.                         {
  4766.                             $types[$d->getType()->getNomFr()][$l->getDate()->format("Y-m-d")]++;
  4767.                         }
  4768.                     };
  4769.                     foreach ($types as $key=>$val)
  4770.                     {
  4771.                         $tab=[];
  4772.                         $tab[]=$key;
  4773.                         foreach ($val as $v)
  4774.                         {
  4775.                             $tab[]=$v;
  4776.                         }
  4777.                         $res["data"][]=$tab;
  4778.                     }
  4779.                     $length = count($res["data"]);
  4780.                     $totald= count($dates)+1;
  4781.                     $removeindex=[];
  4782.                     for($j=1;$j<$totald;$j++)
  4783.                     {
  4784.                         $som=0;
  4785.                         for($i=0;$i<$length;$i++)
  4786.                         {
  4787.                             $som=$som+$res["data"][$i][$j];
  4788.                         }
  4789.                         if($som==0)
  4790.                         {
  4791.                             $removeindex[]=$j;
  4792.                         }
  4793.                     }
  4794.                     $main=[];
  4795.                     foreach ($res["data"] as $t)
  4796.                     {
  4797.                         $ta=[];
  4798.                         for($j=0;$j<$totald;$j++)
  4799.                         {
  4800.                             if(!in_array($j,$removeindex))
  4801.                             {
  4802.                                 $ta[]=$t[$j];
  4803.                             }
  4804.                         }
  4805.                         $main[]=$ta;
  4806.                     }
  4807.                     $res["data"]=$main;
  4808.                     //var_dump($res);
  4809.                 }
  4810.                 elseif ($data["type_filter"]==3)
  4811.                 {
  4812.                     $res["type"]=3;
  4813.                     $res["data"] = [];
  4814.                     $types=["sort0"=>[],"sort1"=>[],"sort2"=>[]];
  4815.                     $dates=$this->getDatesFromRange($s, $e);
  4816.                     foreach ($dates as $t)
  4817.                     {
  4818.                         $types["sort0"][$t]=0;
  4819.                         $types["sort1"][$t]=0;
  4820.                         $types["sort2"][$t]=0;
  4821.                     }
  4822.                     foreach ($logs as $l)
  4823.                     {
  4824.                         $d = $this->em->getRepository(Dossier::class)->findOneBy(array("id"=>$l->getObservation()));
  4825.                         if(!is_null($d))
  4826.                         {
  4827.                             $r = $this->em->getRepository(RegleConservation::class)->findOneBy(array("typeDossier"=>$d->getType()));
  4828.                             if(!is_null($r) && $r->getSortFinal()!="2")
  4829.                             {
  4830.                                 $types["sort".$r->getSortFinal()][$l->getDate()->format("Y-m-d")]++;
  4831.                             }
  4832.                             else
  4833.                             {
  4834.                                 $types["sort2".$r->getSortFinal()][$l->getDate()->format("Y-m-d")]++;
  4835.                             }
  4836.                         }
  4837.                     };
  4838.                     foreach ($types as $key=>$val)
  4839.                     {
  4840.                         $tab=[];
  4841.                         if($key =="sort0") $tab[]=$this->container->get("translator")->trans("regle_save");
  4842.                         elseif ($key == "sort1") $tab[]=$this->container->get("translator")->trans("regle_delete");
  4843.                         else $tab[]=$this->container->get("translator")->trans("regle_none");
  4844.                         foreach ($val as $v)
  4845.                         {
  4846.                             $tab[]=$v;
  4847.                         }
  4848.                         $res["data"][]=$tab;
  4849.                     }
  4850.                     $length = count($res["data"]);
  4851.                     $totald= count($dates)+1;
  4852.                     $removeindex=[];
  4853.                     for($j=1;$j<$totald;$j++)
  4854.                     {
  4855.                         $som=0;
  4856.                         for($i=0;$i<$length;$i++)
  4857.                         {
  4858.                             $som=$som+$res["data"][$i][$j];
  4859.                         }
  4860.                         if($som==0)
  4861.                         {
  4862.                             $removeindex[]=$j;
  4863.                         }
  4864.                     }
  4865.                     $main=[];
  4866.                     foreach ($res["data"] as $t)
  4867.                     {
  4868.                         $ta=[];
  4869.                         for($j=0;$j<$totald;$j++)
  4870.                         {
  4871.                             if(!in_array($j,$removeindex))
  4872.                             {
  4873.                                 $ta[]=$t[$j];
  4874.                             }
  4875.                         }
  4876.                         $main[]=$ta;
  4877.                     }
  4878.                     $res["data"]=$main;
  4879.                 }
  4880.                 else{
  4881.                     $res["type"]=0;
  4882.                     $types=[];
  4883.                     $dates=$this->getDatesFromRange($s, $e);
  4884.                     foreach ($dates as $t)
  4885.                     {
  4886.                         $types[$t]=0;
  4887.                     }
  4888.                     foreach ($logs as $l)
  4889.                     {
  4890.                         $d = $this->em->getRepository(Dossier::class)->findOneBy(array("id"=>$l->getObservation()));
  4891.                         if(!is_null($d))
  4892.                         {
  4893.                             $types[$l->getDate()->format("Y-m-d")]++;
  4894.                         }
  4895.                     };
  4896.                     $tab=[];
  4897.                     $tab[]="general";
  4898.                     foreach ($types as $key=>$val)
  4899.                     {
  4900.                         $tab[]=$val;
  4901.                     }
  4902.                     $res["data"][]=$tab;
  4903.                     $length = count($res["data"]);
  4904.                     $totald= count($dates)+1;
  4905.                     $removeindex=[];
  4906.                     for($j=1;$j<$totald;$j++)
  4907.                     {
  4908.                         $som=0;
  4909.                         for($i=0;$i<$length;$i++)
  4910.                         {
  4911.                             $som=$som+$res["data"][$i][$j];
  4912.                         }
  4913.                         if($som==0)
  4914.                         {
  4915.                             $removeindex[]=$j;
  4916.                         }
  4917.                     }
  4918.                     $main=[];
  4919.                     foreach ($res["data"] as $t)
  4920.                     {
  4921.                         $ta=[];
  4922.                         for($j=0;$j<$totald;$j++)
  4923.                         {
  4924.                             if(!in_array($j,$removeindex))
  4925.                             {
  4926.                                 $ta[]=$t[$j];
  4927.                             }
  4928.                         }
  4929.                         $main[]=$ta;
  4930.                     }
  4931.                     $res["data"]=$main;
  4932.                 }
  4933.                 //old
  4934.                 break;
  4935.             default:
  4936.                 break;
  4937.         }
  4938.         $log = new Log();
  4939.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT71'));
  4940.         if(!is_null($operation))
  4941.         {
  4942.             $log->setOperation($operation);
  4943.             $log->setUser($this->currenUser);
  4944.             $log->setObservation("");
  4945.             $this->em->persist($log);
  4946.             $this->em->flush();
  4947.         }
  4948.         return ["message"=>"operation_done","data"=>$res, "statut"=>true,"code"=>201];
  4949.     }
  4950.     public function getNotifications(array  $data)
  4951.     {
  4952.         $lastId1 =0;
  4953.         if(array_key_exists('last_id',$data)){
  4954.             $lastId1 = $data['last_id'];
  4955.             $lastId = $data['last_id'];
  4956.         }
  4957.         /*if((int)$lastId1 !== 0){
  4958.             $status = $this->em->getRepository(Statut::class)->findNew($this->currenUser->getId(), $lastId1);
  4959.         }else{
  4960.             $status = $this->em->getRepository(Statut::class)->findLast($this->currenUser->getId(),8,$lastId1);
  4961.         }*/
  4962.         $status = $this->em->getRepository(Statut::class)->findLast($this->currenUser->getId(),8,0, $lastId1);
  4963.         $status2 = $this->em->getRepository(Statut::class)->findByNotRead($this->currenUser->getId());
  4964.         if($lastId1 == 0){
  4965.             if(count($status)>0){
  4966.                 $lastId = $status[0]->getId();
  4967.             }
  4968.         }
  4969.         else{
  4970.             $lastId = $lastId1;
  4971.             if(count($status)>0){
  4972.                 $lastId = $status[0]->getId();
  4973.             }
  4974.         }
  4975.         $res=[];
  4976.         $nb=$status2[0]['nb'];
  4977.         foreach ($status as $s)
  4978.         {
  4979.             $res[] = $s->toArray();
  4980.            // var_dump($s->getId());
  4981.         }
  4982.         return ["message"=>"operation_done","data"=>["notifs"=>$res,"nb"=>$nb,'last_id'=>$lastId], "statut"=>true,"code"=>201];
  4983.     }
  4984.     public function getNotificationsMore(array $data)
  4985.     {
  4986.         //if(!array_key_exists("limit",$data)) ["message"=>"limit field is required","data"=>[], "statut"=>false,"code"=>401];
  4987.         if(!array_key_exists("offset",$data)) ["message"=>"offset field is required","data"=>[], "statut"=>false,"code"=>401];
  4988.         $status = $this->em->getRepository(Statut::class)->findLast($this->currenUser->getId(),8,$data["offset"],0);
  4989.         $res=[];
  4990.         foreach ($status as $s)
  4991.         {
  4992.             $res[] = $s->toArray();
  4993.         }
  4994.         return ["message"=>"operation_done","data"=>["notifs"=>$res], "statut"=>true,"code"=>201];
  4995.     }
  4996.     public function getCadreLevel(array $data)
  4997.     {
  4998.         if(!array_key_exists("level",$data)) ["message"=>"level field is required","data"=>[], "statut"=>false,"code"=>401];
  4999.         $cadre = $this->em->getRepository(CadreClassement::class)->findOneBy(["id"=>$data["level"]]);
  5000.         if(is_null($cadre)) return ["message"=>"operation_done","data"=>[], "statut"=>true,"code"=>201];
  5001.         $cadres = $cadre->getCadreClassements();
  5002.         $res=[];
  5003.         foreach ($cadres as $c)
  5004.         {
  5005.             $ca =$c->toArray();
  5006.             $ca["sons"]=[];
  5007.             $sons = $c->getCadreClassements();
  5008.             foreach ($sons as $s)
  5009.             {
  5010.                 $ca["sons"][]=$s->toArray();
  5011.             }
  5012.             $res[]=$ca;
  5013.         }
  5014.         return ["message"=>"operation_done","data"=>$res, "statut"=>true,"code"=>201];
  5015.     }
  5016.     private function ftp_file( $ftpservername,$ftp_port, $ftpusername, $ftppassword, $ftpsourcefile, $ftpdirectory, $ftpdestinationfile )
  5017.     {
  5018.         $conn_id = \ftp_connect($ftpservername,$ftp_port );
  5019.         if ( $conn_id == false )
  5020.         {
  5021.             return "FTP open connection failed to ".$ftpservername;
  5022.         }
  5023.         $login_result = \ftp_login($conn_id, $ftpusername, $ftppassword);
  5024.         if ((!$login_result)) {
  5025.             return  "FTP connection has failed";
  5026.         }
  5027.         if ( strlen( $ftpdirectory ) > 0 )
  5028.         {
  5029.             if (!\ftp_chdir($conn_id, $ftpdirectory )) {
  5030.                 return "Couldn't change directory on ".$ftpservername;
  5031.             }
  5032.         }
  5033.         \ftp_pasv ( $conn_id, true ) ;
  5034.         $upload = \ftp_put( $conn_id, $ftpdestinationfile, $ftpsourcefile, \FTP_ASCII );
  5035.         if (!$upload) {
  5036.             return " FTP upload has failed!";
  5037.         }
  5038.         \ftp_close($conn_id);
  5039.         return $this->container->get('translator')->trans("operation_done");
  5040.     }
  5041.     public function sendFtp($data)
  5042.     {
  5043.         if(!array_key_exists("password_ftp",$data)) ["message"=>$this->container->get('translator')->trans("no_ftp_password_set"),"data"=>[], "statut"=>false,"code"=>401];
  5044.         $todaydb = $this->em->getRepository(Save::class)->findForTodayDb();
  5045.         //$todayar = $this->em->getRepository(Save::class)->findForTodayArchive();
  5046.         //if(count($todayar)==0 && count($todaydb)==0) return ["message"=>$this->container->get('translator')->trans("no_file_to_send"),"data"=>[], "statut"=>true,"code"=>201];
  5047.         $sys = $this->em->getRepository(System::class)->findOneBy(array("statut"=>1));
  5048.         if(is_null($sys)) return ["message"=>$this->container->get('translator')->trans("system_error"),"data"=>[], "statut"=>false,"code"=>401];
  5049.         if (!$this->encoder->isPasswordValid($sys, $data["password_ftp"])) {
  5050.             return [
  5051.                 "message" =>$this->container->get('translator')->trans("password_error"),
  5052.                 "statut" => false,
  5053.                 "code" => 401
  5054.             ];
  5055.         }
  5056.         $ftp_server = $sys->getFtpDirectory();
  5057.         $ftp_user_name = $sys->getFtpUser();
  5058.         $ftp_user_pass = $data["password_ftp"];
  5059.         $ftp_port = $sys->getFtpPort();
  5060.         $ftp_protocol = $sys->getFtpProtocole();
  5061.         $ftp_directory = $sys->getFtpFolder(); // leave blank
  5062.         $ftp_source_file_name = "";
  5063.         $ftp_dest_file_name = $ftp_source_file_name;
  5064.         if(strlen($ftp_server)===0 || strlen($ftp_user_name) === 0 || strlen($ftp_user_pass)===0 || strlen($ftp_port)===0 || strlen($ftp_protocol)===0 || strlen($ftp_directory)===0){
  5065.             return ["message"=>$this->container->get('translator')->trans("system_param_not_ok"),"data"=>[], "statut"=>false,"code"=>401];
  5066.         }
  5067.         /*if(count($todayar)>0)
  5068.         {
  5069.             $el = $todayar[0]->getFile();
  5070.             $ftp_source_file_name = $this->container->get("kernel")->getProjectDir()."/public/SAVE/".$el;
  5071.             $ftp_dest_file_name=$el;
  5072.             $mesg=$this->ftp_file( $ftp_server, $ftp_user_name, $ftp_user_pass, $ftp_source_file_name, $ftp_directory, $ftp_dest_file_name);
  5073.             if ($mesg != $this->container->get('translator')->trans("operation_done")) return ["message"=>$mesg,"statut"=>false,"code"=>401];
  5074.         }*/
  5075.         if(count($todaydb)>0)
  5076.         {
  5077.             $el = $todaydb[0]->getFile();
  5078.             $ftp_source_file_name = $this->container->get("kernel")->getProjectDir()."/public/SAVE/".$el;
  5079.             $ftp_dest_file_name=$ftp_directory."/".$el;
  5080.             if($ftp_protocol === "ftp"){
  5081.                 $mesg=$this->ftp_file( $ftp_server,$ftp_port, $ftp_user_name, $ftp_user_pass, $ftp_source_file_name, $ftp_directory, $ftp_dest_file_name);
  5082.                 if ($mesg != $this->container->get('translator')->trans("operation_done")) return ["message"=>$mesg,"statut"=>false,"code"=>401];
  5083.             }else{
  5084.                 try{
  5085.                     $sftp = new SFTPConnection($ftp_server, $ftp_port);
  5086.                     $sftp->login($ftp_user_name, $ftp_user_pass);
  5087.                     $sftp->uploadFile($ftp_source_file_name, $ftp_dest_file_name);
  5088.                 }
  5089.                 catch (\Exception $e)
  5090.                 {
  5091.                     return ["message"=>$e->getMessage(),"statut"=>false,"code"=>401];
  5092.                 }
  5093.             }
  5094.         }
  5095.         return ["message"=>$this->container->get('translator')->trans("operation_done"),"data"=>[], "statut"=>true,"code"=>201];
  5096.     }
  5097.     public function getCopyRight()
  5098.     {
  5099.         $news = $this->em->getRepository(News::class)->findOneBy(["type"=>0,"isActive"=>true,"status"=>true],["id"=>"desc"]);
  5100.         $data =null;
  5101.         if($news !== null) $data=$news->toArray();
  5102.         return ["message"=>"operation_done","data"=>$data, "statut"=>true,"code"=>201];
  5103.     }
  5104.     public function resetRegle(array $data)
  5105.     {
  5106.         if(!array_key_exists("file",$data)) return ["message"=>"file field is required","statut"=>false,"code"=>401];
  5107.         $file =$this->container->get('upload_service')->uploadBase64($data["file"]);
  5108.         if($file["statut"]==false) return ["message"=>"error_file_upload","statut"=>false,"code"=>401];
  5109.         $f = $this->container->get('upload_service')->getTargetDirectory()."/FOLDER/".$file["file"]["path"];
  5110.     $fp = fopen($f, "r");
  5111.         // Détecter le séparateur sur la première ligne
  5112.         $firstLine = fgets($fp);
  5113.         rewind($fp);
  5114. // BOM cleanup si nécessaire
  5115.         $bom = "\xEF\xBB\xBF";
  5116.         if (strncmp($firstLine, $bom, 3) === 0) {
  5117.             $firstLine = substr($firstLine, 3);
  5118.         }
  5119.         $delimiter = ','; // défaut
  5120.         $semicolonCount = substr_count($firstLine, ';');
  5121.         $commaCount     = substr_count($firstLine, ',');
  5122.         if ($semicolonCount > $commaCount) {
  5123.             $delimiter = ';';
  5124.         }
  5125.         $i=0;
  5126.         $tab=[];
  5127.         $all=[];
  5128.         // lecture ligne par ligne tant qu'on ne rencontre pas le code: fin de fichier(feof)
  5129.         while (($datai = fgetcsv($fp, 10000, $delimiter)) !== FALSE) {
  5130.             $tab[$i] = $datai;
  5131.             $i++;
  5132.         }
  5133.         $j=0;
  5134.         foreach ($tab as $r) {
  5135.             if(count($r)==11) {
  5136.                 $j++;
  5137.                 $type = $this->em->getRepository(TypeDossier::class)->findOneBy(array("code"=>trim($r[1])));
  5138.                 if(is_null($type)) return ["message"=>$r[1]." type dossier not found","statut"=>false,"code"=>""];
  5139.                 $regle = new RegleConservation();
  5140.                 $regle->setId($r[0]);
  5141.                 $regle->setTypeDossier($type);
  5142.                 $regle->setCode($type->getCode()."-000".$j);
  5143.                 $regle->setObservationFr($r[9]);
  5144.                 $regle->setObservationEn($r[10]);
  5145.                 $regle->setSortFinal($r[8]);
  5146.                 $regle->setTexteReferenceFr($r[6]);
  5147.                 $regle->setTexteReferenceEn($r[7]);
  5148.                 $duree = new DureeDossier();
  5149.                 $duree->setTypeConsevation(intval($r[5]));
  5150.                 $duree->setConservation(intval($r[4]));
  5151.                 $duree->setTypeDua(intval($r[3]));
  5152.                 $duree->setDua(intval($r[2]));
  5153.                 $regle->setDureeDossier($duree);
  5154.                 $regle->setIsActive(true);
  5155.                 $this->em->persist($regle);
  5156.             }
  5157.         }
  5158.         try{
  5159.             $this->em->flush();
  5160.         }
  5161.         catch (\Exception $e)
  5162.         {
  5163.             return ["message"=>$e->getMessage(),"statut"=>false,"code"=>""];
  5164.         }
  5165.         fclose($fp);
  5166.         return ["message"=>"operation_done","statut"=>true, "code"=>201,"data"=>[]];
  5167.     }
  5168.     public function simpleSearch(array $data)
  5169.     {
  5170.         if(!array_key_exists("keywords",$data)) return ["message"=>"keywords field is required","statut"=>false,"code"=>401];
  5171.         $q = $data["keywords"];
  5172.         $level = $this->currenUser->getLevel();
  5173.         $res =  $this->container->get(FOSElasticSearchService::class)->search($q,$level);
  5174.        // $res = $this->em->getRepository(Dossier::class)->findSimple($level, $data['keywords']);
  5175.         $all=[];
  5176.         foreach ($res as $d)
  5177.         {
  5178.             $all[]=$d->getMiniArray();
  5179.         }
  5180.         return ["message"=>"","data"=>$all, "statut"=>true,"code"=>201];
  5181.     }
  5182.     public function editWorkgroup(array $data)
  5183.     {
  5184.         $req=["id", "code","type","title","start_date","end_date","reason"];
  5185.         $reqObli=["code","type","title","id"];
  5186.         foreach ($req as $val)
  5187.         {
  5188.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5189.             else{
  5190.                 if(in_array($val,$reqObli))
  5191.                 {
  5192.                     if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  5193.                 }
  5194.             }
  5195.         }
  5196.         $old = $this->em->getRepository(Workgroup::class)->findOneBy(array("id"=>$data["id"],"isActive"=>1));
  5197.         if(is_null($old)) return ["message"=>"workgroup not found","statut"=>false,"code"=>401];
  5198.         // $old2 = $this->em->getRepository(Workgroup::class)->findOneBy(array("code"=>$data["code"]));
  5199.         //if(!is_null($old2)) return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  5200.         if($data["code"]!=$old->getCode()) return ["message"=>$this->container->get('translator')->trans("operation_denied"),"statut"=>false,"code"=>401];
  5201.         $wkg = $old;
  5202.         $wkg->setCode($data["code"]);
  5203.         $wkg->setTitle($data["title"]);
  5204.         $wkg->setMotif($data["reason"]);
  5205.         if($data["type"]==1)
  5206.         {
  5207.             $wkg->setType(true);
  5208.         }
  5209.         else
  5210.         {
  5211.             $wkg->setType(false);
  5212.             $wkg->setDateDebut(\DateTime::createFromFormat('d/m/Y',$data["start_date"]));
  5213.             $wkg->setDateFin(\DateTime::createFromFormat('d/m/Y',$data["end_date"]));
  5214.         }
  5215.         $this->em->persist($wkg);
  5216.         $this->em->flush();
  5217.         $log = new Log();
  5218.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT72'));
  5219.         if(!is_null($operation))
  5220.         {
  5221.             $log->setOperation($operation);
  5222.             $log->setUser($this->currenUser);
  5223.             $log->setObservation($wkg->getId());
  5224.             $this->em->persist($log);
  5225.             $this->em->flush();
  5226.         }
  5227.         return ["message"=>"","statut"=>true,"data"=>$wkg->toArray()];
  5228.     }
  5229.     public function usersWorkgroup(array $data)
  5230.     {
  5231.         if(!array_key_exists("id",$data)) return ["message"=>"id field is required","statut"=>false,"code"=>""];
  5232.         $wkg= $this->em->getRepository(Workgroup::class)->findOneBy(array("id"=>$data["id"],"isActive"=>true));
  5233.         if(is_null($wkg)) return ["message"=>"workgroup not found","statut"=>false,"code"=>401];
  5234.         $users = $wkg->getUserWorkgroups();
  5235.         $res=[];
  5236.         foreach ($users as $u)
  5237.         {
  5238.             if($u->getIsActive()==true) $res[]=$u->toArray();
  5239.         }
  5240.         return ["message"=>"","statut"=>true,"data"=>$res];
  5241.     }
  5242.     public function foldersWorkgroup(array $data)
  5243.     {
  5244.         if(!array_key_exists("id",$data)) return ["message"=>"id field is required","statut"=>false,"code"=>""];
  5245.         $wkg= $this->em->getRepository(Workgroup::class)->findOneBy(array("id"=>$data["id"],"isActive"=>true));
  5246.         if(is_null($wkg)) return ["message"=>"workgroup not found","statut"=>false,"code"=>401];
  5247.         $folders = $wkg->getDossierWorkgroups();
  5248.         $res=[];
  5249.         foreach ($folders as $u)
  5250.         {
  5251.             if($u->getIsActive()==true) $res[]=$u->toArray();
  5252.         }
  5253.         return ["message"=>"","statut"=>true,"data"=>$res];
  5254.     }
  5255.     public function addUserToWorkgroup(array $data)
  5256.     {
  5257.         if(!array_key_exists("id",$data)) return ["message"=>"id field is required","statut"=>false,"code"=>""];
  5258.         if(!array_key_exists("user_id",$data)) return ["message"=>"user_id field is required","statut"=>false,"code"=>""];
  5259.         $wkg= $this->em->getRepository(Workgroup::class)->findOneBy(array("id"=>$data["id"],"isActive"=>true));
  5260.         if(is_null($wkg)) return ["message"=>"workgroup not found","statut"=>false,"code"=>401];
  5261.         $user = $this->em->getRepository(User::class)->findOneBy(array("id"=>$data["user_id"]));
  5262.         if(is_null($user)) return ["message"=>"user not found","statut"=>false,"code"=>401];
  5263.         $users = $wkg->getUserWorkgroups();
  5264.         foreach ($users as $u)
  5265.         {
  5266.             if($u->getUser()->getId() == $user->getId())  return ["message"=>$this->container->get('translator')->trans("user_already_added"),"statut"=>false,"code"=>401];
  5267.         }
  5268.         $userW = new UserWorkgroup();
  5269.         $userW->setStatus(false);
  5270.         $userW->setUser($user);
  5271.         $userW->setWorkgroup($wkg);
  5272.         $this->em->persist($userW);
  5273.         $this->em->flush();
  5274.         return ["message"=>"","statut"=>true,"data"=>$userW->toArray()];
  5275.     }
  5276.     public function addFolderToWorkgroup(array $data)
  5277.     {
  5278.         if(!array_key_exists("id",$data)) return ["message"=>"id field is required","statut"=>false,"code"=>""];
  5279.         if(!array_key_exists("folder_id",$data)) return ["message"=>"folder_id field is required","statut"=>false,"code"=>""];
  5280.         $wkg= $this->em->getRepository(Workgroup::class)->findOneBy(array("id"=>$data["id"],"isActive"=>true));
  5281.         if(is_null($wkg)) return ["message"=>"workgroup not found","statut"=>false,"code"=>401];
  5282.         $folder = $this->em->getRepository(Dossier::class)->findOneBy(array("id"=>$data["folder_id"]));
  5283.         if(is_null($folder)) return ["message"=>"Dossier not found","statut"=>false,"code"=>401];
  5284.         $folders = $wkg->getDossierWorkgroups();
  5285.         foreach ($folders as $f)
  5286.         {
  5287.             if($f->getDossier()->getId() == $folder->getId()) return ["message"=>$this->container->get('translator')->trans("folder_already_added"),"statut"=>false,"code"=>401];
  5288.         }
  5289.         $folderW = new DossierWorkgroup();
  5290.         $folderW->setWorkgroup($wkg);
  5291.         $folderW->setDossier($folder);
  5292.         $this->em->persist($folderW);
  5293.         $this->em->flush();
  5294.         return ["message"=>"","statut"=>true,"data"=>$folderW->toArray()];
  5295.     }
  5296.     public function removeUserToWorkgroup(array $data)
  5297.     {
  5298.         if(!array_key_exists("id",$data)) return ["message"=>"id field is required","statut"=>false,"code"=>""];
  5299.         if(!array_key_exists("user_id",$data)) return ["message"=>"user_id field is required","statut"=>false,"code"=>""];
  5300.         $user = $this->em->getRepository(UserWorkgroup::class)->findOneBy(array("id"=>$data["user_id"],"workgroup"=>$data["id"]));
  5301.         if(is_null($user)) return ["message"=>"user not found","statut"=>false,"code"=>401];
  5302.         $this->em->remove($user);
  5303.         $this->em->flush();
  5304.         return ["message"=>"operation_done","statut"=>true,"data"=>[]];
  5305.     }
  5306.     public function removeFolderToWorkgroup(array $data)
  5307.     {
  5308.         if(!array_key_exists("id",$data)) return ["message"=>"id field is required","statut"=>false,"code"=>""];
  5309.         if(!array_key_exists("folder_id",$data)) return ["message"=>"folder_id field is required","statut"=>false,"code"=>""];
  5310.         $folder = $this->em->getRepository(DossierWorkgroup::class)->findOneBy(array("id"=>$data["folder_id"],"workgroup"=>$data["id"]));
  5311.         if(is_null($folder)) return ["message"=>"Dossier not found","statut"=>false,"code"=>401];
  5312.         $this->em->remove($folder);
  5313.         $this->em->flush();
  5314.         return ["message"=>"operation_done","statut"=>true,"data"=>[]];
  5315.     }
  5316.     public function setWorkGroupMaster(array $data)
  5317.     {
  5318.         if(!array_key_exists("id",$data)) return ["message"=>"id field is required","statut"=>false,"code"=>""];
  5319.         if(!array_key_exists("user_id",$data)) return ["message"=>"user_id field is required","statut"=>false,"code"=>""];
  5320.         $user = $this->em->getRepository(UserWorkgroup::class)->findOneBy(array("id"=>$data["user_id"],"workgroup"=>$data["id"]));
  5321.         if(is_null($user)) return ["message"=>"user not found","statut"=>false,"code"=>401];
  5322.         $usersW = $this->em->getRepository(UserWorkgroup::class)->findBy(array("workgroup"=>$user->getWorkgroup()));
  5323.         $send=[];
  5324.         foreach ($usersW as $wu)
  5325.         {
  5326.             if($wu->getStatus()==true) {
  5327.                 $wu->setStatus(false);
  5328.                 $this->em->persist($wu);
  5329.             }else{
  5330.                 if($wu->getId()==$user->getId())
  5331.                 {
  5332.                     $user->setStatus(true);
  5333.                     $this->em->persist($user);
  5334.                 }
  5335.             }
  5336.             $send[]=$wu->toArray();
  5337.         }
  5338.         $this->em->flush();
  5339.         return ["message"=>"operation_done","statut"=>true,"data"=>$send];
  5340.     }
  5341.     public function activateMultipleWorkgroup(array  $data)
  5342.     {
  5343.         if(!array_key_exists("ids",$data))  return ["message"=>"ids field is required","statut"=>false,"data"=>"","code"=>401];
  5344.         $elements = $this->em->getRepository(Workgroup::class)->findMultiple($data["ids"]);
  5345.         foreach ($elements as $el)
  5346.         {
  5347.             $el->setStatus(true);
  5348.             $this->em->persist($el);
  5349.         }
  5350.         if(count($elements)>0)
  5351.         {
  5352.             $this->em->flush();
  5353.         }
  5354.         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  5355.     }
  5356.     public function desactivateMultipleWorkgroup(array  $data)
  5357.     {
  5358.         if(!array_key_exists("ids",$data))  return ["message"=>"ids field is required","statut"=>false,"data"=>"","code"=>401];
  5359.         $elements = $this->em->getRepository(Workgroup::class)->findMultiple($data["ids"]);
  5360.         foreach ($elements as $el)
  5361.         {
  5362.             $el->setStatus(false);
  5363.             $this->em->persist($el);
  5364.         }
  5365.         if(count($elements)>0)
  5366.         {
  5367.             $this->em->flush();
  5368.         }
  5369.         return ["message"=>"operation_done","statut"=>true,"data"=>[],"code"=>201];
  5370.     }
  5371.     public function userWorkgroups()
  5372.     {
  5373.         $user = $this->currenUser;
  5374.         $wkgs = $this->em->getRepository(UserWorkgroup::class)->userGroups($user->getId());
  5375.         return $wkgs;
  5376.     }
  5377.     public function createSalle(array $data)
  5378.     {
  5379.         $req=["code","location"];
  5380.         foreach ($req as $val)
  5381.         {
  5382.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5383.             else
  5384.             {
  5385.                 if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  5386.             }
  5387.         }
  5388.         if(strlen($data['code'])<2) return ["message"=>$this->container->get('translator')->trans("room_min_length"),"statut"=>false,"code"=>""];
  5389.         if(strlen($data['code'])>10) return ["message"=>$this->container->get('translator')->trans("room_max_length"),"statut"=>false,"code"=>""];
  5390.         $location = $this->em->getRepository(ArchiveLocation::class)->findOneBy(['id'=>$data['location']]);
  5391.         if($location === null) return ["message"=>$this->container->get('translator')->trans("archive_depot_not_found"),"statut"=>false,"code"=>401];
  5392.         $old = $this->em->getRepository(Salle::class)->findOneBy(['isActive'=>true,'code'=>$data['code'],'archiveLocation'=>$location]);;
  5393.         if($old !== null) return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  5394.         $r = new Salle();
  5395.         $r->setCode($data["code"]);
  5396.         $r->setArchiveLocation($location);
  5397.         $this->em->persist($r);
  5398.         $this->em->flush();
  5399.         return ["message"=>"","statut"=>true,"data"=>$r->toArray()];
  5400.     }
  5401.     public function editSalle(array $data)
  5402.     {
  5403.         $req=["id","code","location"];
  5404.         foreach ($req as $val)
  5405.         {
  5406.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5407.             else
  5408.             {
  5409.                 if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  5410.             }
  5411.         }
  5412.         if(strlen($data['code'])<2) return ["message"=>$this->container->get('translator')->trans("room_min_length"),"statut"=>false,"code"=>""];
  5413.         if(strlen($data['code'])>10) return ["message"=>$this->container->get('translator')->trans("room_max_length"),"statut"=>false,"code"=>""];
  5414.         $salle = $this->em->getRepository(Salle::class)->findOneBy(array("id"=>$data["id"]));
  5415.         if($salle === null) return ["message"=>"salle not found","statut"=>false,"code"=>""];
  5416.         $location = $this->em->getRepository(ArchiveLocation::class)->findOneBy(['id'=>$data['location']]);
  5417.         if($location === null) return ["message"=>$this->container->get('translator')->trans("archive_depot_not_found"),"statut"=>false,"code"=>401];
  5418.         $old = $this->em->getRepository(Salle::class)->findBy(['isActive'=>true,'code'=>$data['code'],'archiveLocation'=>$location]);
  5419.         foreach ($old as $el ){
  5420.             if($el->getId() !== $salle->getId()) return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  5421.         }
  5422.         $salle->setCode($data["code"]);
  5423.         $salle->setArchiveLocation($location);
  5424.         $this->em->persist($salle);
  5425.         $this->em->flush();
  5426.         return ["message"=>"","statut"=>true,"data"=>$salle->toArray()];
  5427.     }
  5428.     public function getSalleRayons(array $data)
  5429.     {
  5430.         if(!array_key_exists("id",$data))
  5431.         {
  5432.             return ["message"=>"type or id is missing","statut"=>false,"data"=>[],"code"=>401];
  5433.         }
  5434.         $rayons = $this->em->getRepository(Rayon::class)->findBy(array("salle"=>$data["id"]));
  5435.         $res=[];
  5436.         foreach ($rayons as $r)
  5437.         {
  5438.             if($r->getIsActive())$res[]=$r->toArray();
  5439.         }
  5440.         return ["message"=>"","statut"=>true,"data"=>$res,"code"=>201];
  5441.     }
  5442.     public function driveStat()
  5443.     {
  5444.         $user = $this->currenUser;
  5445.         $doc = $this->em->getRepository(Document::class)->countDocument($user->getId())[0]['nb'];
  5446.         $rep = $this->em->getRepository(Repertoire::class)->countRepertoire($user->getId())[0]['nb'];
  5447.         return ['statut'=>true,'data'=>['doc'=>$doc,'rep'=>$rep]];
  5448.     }
  5449.     public function driveSharedStat()
  5450.     {
  5451.         $user = $this->currenUser;
  5452.         $doc = $this->em->getRepository(DocumentPartage::class)->countShared($user->getId())[0]['nb'];
  5453.         $rep = $this->em->getRepository(RepertoirePartage::class)->countShared($user->getId())[0]['nb'];
  5454.         return ['statut'=>true,'data'=>['doc'=>$doc,'rep'=>$rep]];
  5455.     }
  5456.     // not forget to add log
  5457.     public function createDocument(array $data){
  5458.         $user = $this->currenUser;
  5459.         $req=['name','file','folder'];
  5460.         $reqFile = ['name','extension','type','size','path'];
  5461.         foreach ($req as $val)
  5462.         {
  5463.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5464.         }
  5465.         foreach ($reqFile as $val)
  5466.         {
  5467.             if(!array_key_exists($val,$data['file'])) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5468.         }
  5469.         $r = $data['folder'] === ''?null:(int)$data['folder'];
  5470.         $same = $this->em->getRepository(Document::class)->searchLike($user->getId(),$r,$data['name']);
  5471.         if(count($same)>0) return ["message"=>$this->container->get('translator')->trans("name_already_exist"),"statut"=>false,"code"=>""];
  5472.         $doc = new Document();
  5473.         if($data['folder']!==''){
  5474.             $rep = $this->em->getRepository(Repertoire::class)->findOneBy(['user'=>$user,'id'=>$data['folder']]);
  5475.             if($rep === null)  return ["message"=>"folder not found","statut"=>false,"code"=>""];
  5476.             $doc->setRepertoire($rep);
  5477.         }
  5478.         $doc->setUser($user);
  5479.         $doc->setNom($data['name']);
  5480.         $file = new Fichier();
  5481.         $file->setNom($data['file']['name']);
  5482.         $file->setFolderNameAndName($data['file']['name']);
  5483.         $file->setExtension($data['file']['extension']);
  5484.         $file->setType($data['file']['type']);
  5485.         $file->setTaille($data['file']['size']);
  5486.         $file->setPath($data['file']['path']);
  5487.         $file->setAuteur($user->getNom()." ".$user->getPrenom());
  5488.         $doc->setFichier($file);
  5489.         $this->em->persist($doc);
  5490.         $this->em->flush();
  5491.         return ["message"=>"","statut"=>true,"data"=>$doc->toArray()];
  5492.     }
  5493.     public function createRepertoire(array $data){
  5494.         $user = $this->currenUser;
  5495.         $req=['name','folder'];
  5496.         foreach ($req as $val)
  5497.         {
  5498.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5499.         }
  5500.         $r = $data['folder'] === ''?null:(int)$data['folder'];
  5501.         $same = $this->em->getRepository(Repertoire::class)->searchLike($user->getId(),$r,$data['name']);
  5502.         if(count($same)>0) return ["message"=>$this->container->get('translator')->trans("name_already_exist"),"statut"=>false,"code"=>""];
  5503.         $r = new Repertoire();
  5504.         if($data['folder']!==''){
  5505.             $rep = $this->em->getRepository(Repertoire::class)->findOneBy(['user'=>$user,'id'=>$data['folder']]);
  5506.             if($rep === null)  return ["message"=>"folder not found","statut"=>false,"code"=>""];
  5507.             $r->setParent($rep);
  5508.         }
  5509.         $r->setUser($user);
  5510.         $r->setNom($data['name']);
  5511.         $this->em->persist($r);
  5512.         $this->em->flush();
  5513.         return ["message"=>"","statut"=>true,"data"=>$r->toArray()];
  5514.     }
  5515.     public function checkDocumentExist(array $data){
  5516.         $user = $this->currenUser;
  5517.         if(!array_key_exists('name',$data)) return ["message"=>"name field is required","statut"=>false,"code"=>""];
  5518.         if(!array_key_exists('folder',$data)) return ["message"=>"folder field is required","statut"=>false,"code"=>""];
  5519.         $r = $data['folder'] === ''?null:(int)$data['folder'];
  5520.         $same = $this->em->getRepository(Document::class)->searchLike($user->getId(),$r,$data['name']);
  5521.         if(count($same)>0) return ["message"=>$this->container->get('translator')->trans("name_already_exist"),"statut"=>false,"code"=>""];
  5522.         return ["message"=>"ok","statut"=>true,"code"=>""];
  5523.     }
  5524.     public function checkFolderExist(array $data){
  5525.         $user = $this->currenUser;
  5526.         if(!array_key_exists('name',$data)) return ["message"=>"name field is required","statut"=>false,"code"=>""];
  5527.         if(!array_key_exists('folder',$data)) return ["message"=>"folder field is required","statut"=>false,"code"=>""];
  5528.         $r = $data['folder'] === ''?null:(int)$data['folder'];
  5529.         $same = $this->em->getRepository(Repertoire::class)->searchLike($user->getId(),$r,$data['name']);
  5530.         if(count($same)>0) return ["message"=>$this->container->get('translator')->trans("name_already_exist"),"statut"=>false,"code"=>""];
  5531.         return ["message"=>"ok","statut"=>true,"code"=>""];
  5532.     }
  5533.     public function getMainFolderAndMainFile(array $data){
  5534.         $user = $this->currenUser;
  5535.         $req=['limit','offset'];
  5536.         foreach ($req as $val)
  5537.         {
  5538.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5539.         }
  5540.         $orderBy = 'date_desc';//date_desc name_asc name_desc
  5541.         if(array_key_exists('orderBy',$data)){
  5542.             $orderBy = $data['orderBy'];
  5543.         }
  5544.         $folders = $this->em->getRepository(Repertoire::class)->getMainFolder($user->getId(),$data['limit'],$data['offset'],$orderBy);
  5545.         $docs = $this->em->getRepository(Document::class)->getMainDocument($user->getId(),$data['limit'],$data['offset'],$orderBy);
  5546.         $f=[];
  5547.         $d=[];
  5548.         foreach ($folders as $e)
  5549.         {
  5550.             $t = $e->toArray();
  5551.             $t['type']=1;
  5552.             $f[] = $t;
  5553.         }
  5554.         foreach ($docs as $e)
  5555.         {
  5556.             $t = $e->toArray();
  5557.             $t['type']=0;
  5558.             $d[] = $t;
  5559.         }
  5560.         return ["message"=>"","statut"=>true,"data"=>['docs'=>$d,'folders'=>$f]];
  5561.     }
  5562.     public function getMainFolderMore(array $data){
  5563.         $user = $this->currenUser;
  5564.         $req=['limit','offset'];
  5565.         foreach ($req as $val)
  5566.         {
  5567.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5568.         }
  5569.         $folders = $this->em->getRepository(Repertoire::class)->getMainFolder($user->getId(),$data['limit'],$data['offset']);
  5570.         $d=[];
  5571.         foreach ($folders as $e)
  5572.         {
  5573.             $d[] = $e->toArray();
  5574.         }
  5575.         return ["message"=>"","statut"=>true,"data"=>['folders'=>$d]];
  5576.     }
  5577.     public function getMainFolderMoreExcept(array $data){
  5578.         $user = $this->currenUser;
  5579.         $req=['limit','offset','folder'];
  5580.         foreach ($req as $val)
  5581.         {
  5582.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5583.         }
  5584.         $folders = $this->em->getRepository(Repertoire::class)->getMainFolderExcept($user->getId(),$data['folder'],$data['limit'],$data['offset']);
  5585.         $d=[];
  5586.         foreach ($folders as $e)
  5587.         {
  5588.             $d[] = $e->toArray();
  5589.         }
  5590.         return ["message"=>"","statut"=>true,"data"=>['folders'=>$d]];
  5591.     }
  5592.     public function getSubFolderMoreExcept(array $data){
  5593.         $user = $this->currenUser;
  5594.         $req=['limit','offset','id','folder'];
  5595.         foreach ($req as $val)
  5596.         {
  5597.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5598.         }
  5599.         $main = null;
  5600.         if($data['folder'] !==0){
  5601.             $mainFolder = $this->em->getRepository(Repertoire::class)->findOneBy(['id'=>$data['folder']]);
  5602.             if($mainFolder === null) return ["message"=>$this->container->get('translator')->trans("folder_not_found"),"statut"=>false,"code"=>""];
  5603.             $main = $mainFolder->toArray();
  5604.             $folders = $this->em->getRepository(Repertoire::class)->getSubFolderExcept($user->getId(),$data['folder'],$data['id'],$data['limit'],$data['offset']);
  5605.         }
  5606.         else{
  5607.             $folders = $this->em->getRepository(Repertoire::class)->getMainFolderExcept($user->getId(),$data['id'],$data['limit'],$data['offset']);
  5608.         }
  5609.         $d=[];
  5610.         foreach ($folders as $e)
  5611.         {
  5612.             $d[] = $e->toArray();
  5613.         }
  5614.         return ["message"=>"","statut"=>true,"data"=>['folders'=>$d,'main'=>$main]];
  5615.     }
  5616.     public function getMainFileMore(array $data){
  5617.         $user = $this->currenUser;
  5618.         $req=['limit','offset'];
  5619.         foreach ($req as $val)
  5620.         {
  5621.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5622.         }
  5623.         $docs = $this->em->getRepository(Document::class)->getMainDocument($user->getId(),$data['limit'],$data['offset']);
  5624.         $d = [];
  5625.         foreach ($docs as $e)
  5626.         {
  5627.             $d[] = $e->toArray();
  5628.         }
  5629.         return ["message"=>"","statut"=>true,"data"=>$d];
  5630.     }
  5631.     public function getFolderDocument(array $data){
  5632.         $user = $this->currenUser;
  5633.         $req=['id','limit','offset'];
  5634.         foreach ($req as $val)
  5635.         {
  5636.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5637.         }
  5638.         $docs = $this->em->getRepository(Document::class)->getFolderDocument($user->getId(),$data['id'],$data['limit'],$data['offset']);
  5639.         $d = [];
  5640.         foreach ($docs as $doc) {
  5641.             $d[] = $doc->toArray();
  5642.         }
  5643.         return ["message"=>"","statut"=>true,"data"=>$d];
  5644.     }
  5645.     public function deleteDocument(array $data){
  5646.         $user = $this->currenUser;
  5647.         $req=['id'];
  5648.         foreach ($req as $val)
  5649.         {
  5650.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5651.         }
  5652.         $doc = $this->em->getRepository(Document::class)->findOneBy(['id'=>$data['id'],'user'=>$user]);
  5653.         if($doc === null) return ['message' =>$this->container->get('translator')->trans('document_not_found'),"statut"=>false,"code"=>401];
  5654.         if($doc->getIsActive() === false) return ['message' =>$this->container->get('translator')->trans('document_not_found'),"statut"=>false,"code"=>401];
  5655.         $doc->setIsActive(false);
  5656.         $this->em->persist($doc);
  5657.         $this->em->flush();
  5658.         return ["message"=>"","statut"=>true,"data"=>$doc->toArray()];
  5659.     }
  5660.     public function deleteRepertoire(array $data){
  5661.         $user = $this->currenUser;
  5662.         $req=['id'];
  5663.         foreach ($req as $val)
  5664.         {
  5665.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5666.         }
  5667.         $rep = $this->em->getRepository(Repertoire::class)->findOneBy(['id'=>$data['id'],'user'=>$user]);
  5668.         if($rep === null) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>401];
  5669.         if($rep->getIsActive() === false) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>401];
  5670.         $rep->setIsActive(false);
  5671.         $docs = $this->em->getRepository(Document::class)->findBy(['repertoire'=>$rep,'isActive'=>0]);
  5672.         $reps = $this->em->getRepository(Repertoire::class)->findBy(['parent'=>$rep,'isActive'=>0]);
  5673.         foreach ($docs as $el ){
  5674.             $el->setIsActive(false);
  5675.             $this->em->persist($el);
  5676.         }
  5677.         foreach ($reps as $el){
  5678.             $el->setIsActive(false);
  5679.             $this->em->persist($el);
  5680.         }
  5681.         $this->em->persist($rep);
  5682.         $this->em->flush();
  5683.         return ["message"=>"","statut"=>true,"data"=>$rep->toArray()];
  5684.     }
  5685.     public function renameDocument(array $data){
  5686.         $user = $this->currenUser;
  5687.         $req=['id','name'];
  5688.         foreach ($req as $val)
  5689.         {
  5690.             if(!array_key_exists($val,$data) || strlen($data[$val])===0) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5691.         }
  5692.         $doc = $this->em->getRepository(Document::class)->findOneBy(['id'=>$data['id'],'user'=>$user]);
  5693.         if($doc === null) return ['message' =>$this->container->get('translator')->trans('document_not_found'),"statut"=>false,"code"=>401];
  5694.         if($doc->getIsActive() === false) return ['message' =>$this->container->get('translator')->trans('document_not_found'),"statut"=>false,"code"=>401];
  5695.         $r = $doc->getRepertoire() === null?null: $doc->getRepertoire()->getId();
  5696.         $same = $this->em->getRepository(Document::class)->searchLike($user->getId(),$r, $data['name']);
  5697.         if(count($same)>0) return ["message"=>$this->container->get('translator')->trans("name_already_exist"),"statut"=>false,"code"=>""];
  5698.         $doc->setNom($data['name']);
  5699.         $this->em->persist($doc);
  5700.         $this->em->flush();
  5701.         return ["message"=>"","statut"=>true,"data"=>$doc->toArray()];
  5702.     }
  5703.     public function renameRepertoire(array $data){
  5704.         $user = $this->currenUser;
  5705.         $req=['id','name'];
  5706.         foreach ($req as $val)
  5707.         {
  5708.             if(!array_key_exists($val,$data) || strlen($data[$val])===0) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5709.         }
  5710.                 $rep = $this->em->getRepository(Repertoire::class)->findOneBy(['id'=>$data['id'],'user'=>$user]);
  5711.         if($rep === null) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>401];
  5712.         if($rep->getIsActive() === false) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>401];
  5713.         $r = $rep->getParent() === null?null: $rep->getParent()->getId();
  5714.         $same = $this->em->getRepository(Repertoire::class)->searchLike($user->getId(),$r, $data['name']);
  5715.         if(count($same)>0) return ["message"=>$this->container->get('translator')->trans("name_already_exist"),"statut"=>false,"code"=>""];
  5716.         $rep->setNom($data['name']);
  5717.         $this->em->persist($rep);
  5718.         $this->em->flush();
  5719.         return ["message"=>"","statut"=>true,"data"=>$rep->toArray()];
  5720.     }
  5721.     public function moveDocument(array $data){
  5722.         $user = $this->currenUser;
  5723.         $req=['id','folder'];
  5724.         foreach ($req as $val)
  5725.         {
  5726.             if(!array_key_exists($val,$data) || strlen($data[$val])===0) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5727.         }
  5728.         $doc = $this->em->getRepository(Document::class)->findOneBy(['id'=>$data['id'],'user'=>$user]);
  5729.         if($doc === null) return ['message' =>$this->container->get('translator')->trans('document_not_found'),"statut"=>false,"code"=>401];
  5730.         if($doc->getIsActive() === false) return ['message' =>$this->container->get('translator')->trans('document_not_found'),"statut"=>false,"code"=>401];
  5731.         $r = (int)$data['folder'];
  5732.         if($r>0){
  5733.             /*$same = $this->em->getRepository(Document::class)->searchLike($user->getId(),$r, $data['name']);
  5734.             if(count($same)>0) return ["message"=>$this->container->get('translator')->trans("name_already_exist"),"statut"=>false,"code"=>""];*/
  5735.             $rep = $this->em->getRepository(Repertoire::class)->findOneBy(['id'=>$r,'user'=>$user]);
  5736.             if($rep === null) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>401];
  5737.             if($rep->getIsActive() === false) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>401];
  5738.             $doc->setRepertoire($rep);
  5739.         }
  5740.         else{
  5741.             /*$same = $this->em->getRepository(Document::class)->searchLike($user->getId(),null, $data['name']);
  5742.             if(count($same)>0) return ["message"=>$this->container->get('translator')->trans("name_already_exist"),"statut"=>false,"code"=>""];*/
  5743.             $doc->setRepertoire(null);
  5744.         }
  5745.         //$doc->setNom($data['name']);
  5746.         $this->em->persist($doc);
  5747.         $this->em->flush();
  5748.         return ["message"=>"","statut"=>true,"data"=>$doc->toArray()];
  5749.     }
  5750.     public function moveRepertoire(array $data){
  5751.         $user = $this->currenUser;
  5752.         $req=['id','folder'];
  5753.         foreach ($req as $val)
  5754.         {
  5755.             if(!array_key_exists($val,$data) || strlen($data[$val])===0) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5756.         }
  5757.         $rep = $this->em->getRepository(Repertoire::class)->findOneBy(['id'=>$data['id'],'user'=>$user]);
  5758.         if($rep === null) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>401];
  5759.         if($rep->getIsActive() === false) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>401];
  5760.         $r = (int)$data['folder'];
  5761.         if($r>0){
  5762.             /*$same = $this->em->getRepository(Repertoire::class)->searchLike($user->getId(),$r, $data['name']);
  5763.             if(count($same)>0) return ["message"=>$this->container->get('translator')->trans("name_already_exist"),"statut"=>false,"code"=>""];*/
  5764.             $p = $this->em->getRepository(Repertoire::class)->findOneBy(['id'=>$r,'user'=>$user]);
  5765.             if($p === null) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>401];
  5766.             if($p->getIsActive() === false) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>401];
  5767.             if($p->getId() === $rep->getId()) return ['message' =>$this->container->get('translator')->trans('operation_denied'),"statut"=>false,"code"=>401];
  5768.             $rep->setParent($p);
  5769.         }
  5770.         else{
  5771.             /*$same = $this->em->getRepository(Repertoire::class)->searchLike($user->getId(),null, $data['name']);
  5772.             if(count($same)>0) return ["message"=>$this->container->get('translator')->trans("name_already_exist"),"statut"=>false,"code"=>""];*/
  5773.             $rep->setParent(null);
  5774.         }
  5775.         //$rep->setNom($data['name']);
  5776.         $this->em->persist($rep);
  5777.         $this->em->flush();
  5778.         return ["message"=>"","statut"=>true,"data"=>$rep->toArray()];
  5779.     }
  5780.     public function shareDocumentUsers(array $data){
  5781.         $user = $this->currenUser;
  5782.         $req=['id','users'];
  5783.         foreach ($req as $val)
  5784.         {
  5785.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5786.         }
  5787.         $doc = $this->em->getRepository(Document::class)->findOneBy(['id'=>$data['id'],'user'=>$user]);
  5788.         if($doc === null) return ['message' =>$this->container->get('translator')->trans('document_not_found'),"statut"=>false,"code"=>401];
  5789.         if($doc->getIsActive() === false) return ['message' =>$this->container->get('translator')->trans('document_not_found'),"statut"=>false,"code"=>401];
  5790.         if(count($data['users'])===0) return ['message' =>$this->container->get('translator')->trans('no_user_found'),"statut"=>false,"code"=>401];
  5791.         if($doc->getIsShared()){
  5792.             $docShare = $this->em->getRepository(DocumentPartage::class)->findOneBy(['document'=>$doc,'isActive'=>1]);
  5793.             if($docShare === null){
  5794.                 $docShare = new DocumentPartage();
  5795.                 $docShare->setDocument($doc);
  5796.             }
  5797.         }
  5798.         else{
  5799.             $docShare = new DocumentPartage();
  5800.             $docShare->setDocument($doc);
  5801.             $doc->setIsShared(true);
  5802.             $this->em->persist($doc);
  5803.         }
  5804.         $users = $this->em->getRepository(User::class)->findMultiple($data['users']);
  5805.         $nbUser =0;
  5806.         $notifUser=[];
  5807.         foreach ($users as $u){
  5808.             if($u->getId() !== $user->getId()){
  5809.                 if(!$docShare->getUsers()->contains($u)){
  5810.                     $notifUser[]=$u;
  5811.                     $nbUser++;
  5812.                     $docShare->addUser($u);
  5813.                 }
  5814.             }
  5815.         }
  5816.         $docShare->setNbUser($nbUser);
  5817.         // dont forget notification
  5818.         $notif = new Notification();
  5819.         $notif->setUser($this->currenUser);
  5820.         $notif->setDocumentPartage($docShare);
  5821.         $notif->setCode(Notification::SHARE_DOCUMENT_USER);
  5822.         foreach ($notifUser as $u){
  5823.             $status = new Statut();
  5824.             $status->setNotification($notif);
  5825.             $status->setUser($u);
  5826.             $notif->addStatut($status);
  5827.         }
  5828.         $this->em->persist($notif);
  5829.         $this->em->persist($docShare);
  5830.         $this->em->flush();
  5831.         return ["message"=>"","statut"=>true,"data"=>$docShare->toArray()];
  5832.     }
  5833.     public function shareRepertoireUsers(array $data){
  5834.         $user = $this->currenUser;
  5835.         $req=['id','users'];
  5836.         foreach ($req as $val)
  5837.         {
  5838.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5839.         }
  5840.         $rep = $this->em->getRepository(Repertoire::class)->findOneBy(['id'=>$data['id'],'user'=>$user]);
  5841.         if($rep === null) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>401];
  5842.         if($rep->getIsActive() === false) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>401];
  5843.         if(count($data['users'])===0) return ['message' =>$this->container->get('translator')->trans('no_user_found'),"statut"=>false,"code"=>401];
  5844.         if($rep->getIsShared()){
  5845.             $repShare = $this->em->getRepository(RepertoirePartage::class)->findOneBy(['repertoire'=>$rep,'isActive'=>1]);
  5846.             if($repShare === null){
  5847.                 $repShare = new RepertoirePartage();
  5848.                 $repShare->setRepertoire($rep);
  5849.             }
  5850.         }
  5851.         else{
  5852.             $repShare = new RepertoirePartage();
  5853.             $repShare->setRepertoire($rep);
  5854.             $rep->setIsShared(true);
  5855.             $this->em->persist($rep);
  5856.         }
  5857.         $users = $this->em->getRepository(User::class)->findMultiple($data['users']);
  5858.         $nbUser =0;
  5859.         $notifUser = [];
  5860.        /* $files = $this->em->getRepository(Document::class)->findBy(['repertoire'=>$rep,'isActive'=>true]);
  5861.         $parentFiles = [];
  5862.         foreach ($files as $f){
  5863.             $p = $this->em->getRepository(DocumentPartage::class)->findOneBy(['document'=>$f]);
  5864.             if($p !== null){
  5865.                 $p->setIsActive(true);
  5866.                 $parentFiles[] = $p;
  5867.             }
  5868.             else{
  5869.                 $docShare = new DocumentPartage();
  5870.                 $docShare->setDocument($f);
  5871.                 if($f->getIsShared()===false){
  5872.                     $f->setIsShared(true);
  5873.                     $this->em->persist($f);
  5874.                 }
  5875.                 $parentFiles[] = $docShare;
  5876.             }
  5877.         }
  5878.         $len = count($parentFiles);*/
  5879.         foreach ($users as $u){
  5880.             if(!$repShare->getUsers()->contains($u)){
  5881.                 $notifUser[]=$u;
  5882.                 $nbUser++;
  5883.                 $repShare->addUser($u);
  5884.             }
  5885.             /*for($i=0;$i<$len;$i++){
  5886.                 if(!$parentFiles[$i]->getUsers()->contains($u)){
  5887.                     $parentFiles[$i]->setNbUser($parentFiles[$i]->getNbUser()+1);
  5888.                     $parentFiles[$i]->addUser($u);
  5889.                 }
  5890.             }*/
  5891.         }
  5892.         $repShare->setNbUser($nbUser);
  5893.         $notif = new Notification();
  5894.         $notif->setUser($this->currenUser);
  5895.         $notif->setRepertoirePartage($repShare);
  5896.         $notif->setCode(Notification::SHARE_FOLDER_USER);
  5897.         foreach ($notifUser as $u){
  5898.             $status = new Statut();
  5899.             $status->setNotification($notif);
  5900.             $status->setUser($u);
  5901.             $notif->addStatut($status);
  5902.         }
  5903.         $this->em->persist($notif);
  5904.         /*foreach ($parentFiles as $f){
  5905.             $this->em->persist($f);
  5906.         }*/
  5907.         $this->em->persist($repShare);
  5908.         $this->em->flush();
  5909.         return ["message"=>"","statut"=>true,"data"=>$repShare->toArray()];
  5910.     }
  5911.     public function shareDocumentGroup(array $data){
  5912.         $user = $this->currenUser;
  5913.         $req=['id','groups'];
  5914.         foreach ($req as $val)
  5915.         {
  5916.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5917.         }
  5918.         $doc = $this->em->getRepository(Document::class)->findOneBy(['id'=>$data['id'],'user'=>$user]);
  5919.         if($doc === null) return ['message' =>$this->container->get('translator')->trans('document_not_found'),"statut"=>false,"code"=>401];
  5920.         if($doc->getIsActive() === false) return ['message' =>$this->container->get('translator')->trans('document_not_found'),"statut"=>false,"code"=>401];
  5921.         if(count($data['groups'])==0) return ['message' =>$this->container->get('translator')->trans('no_group_found'),"statut"=>false,"code"=>401];
  5922.         if($doc->getIsShared()){
  5923.             $docShare = $this->em->getRepository(DocumentPartage::class)->findOneBy(['document'=>$doc,'isActive'=>1]);
  5924.             if($docShare === null){
  5925.                 $docShare = new DocumentPartage();
  5926.                 $docShare->setDocument($doc);
  5927.             }
  5928.         }
  5929.         else{
  5930.             $docShare = new DocumentPartage();
  5931.             $docShare->setDocument($doc);
  5932.             $doc->setIsShared(true);
  5933.             $this->em->persist($doc);
  5934.         }
  5935.         $groups = $this->em->getRepository(Workgroup::class)->findMultiple($data['groups']);
  5936.         foreach ($groups as $group){
  5937.             if(!$docShare->getWorkgroups()->contains($group)){
  5938.                 $docShare->addWorkgroup($group);
  5939.                 $docShare->setNbGroup($docShare->getNbGroup()+1);
  5940.                 $notif = new Notification();
  5941.                 $notif->setUser($this->currenUser);
  5942.                 $notif->setWorkgroup($group);
  5943.                 $notif->setDocumentPartage($docShare);
  5944.                 $notif->setCode(Notification::SHARE_DOCUMENT_GROUP);
  5945.                 $userWorks = $group->getUserWorkgroups();
  5946.                 foreach ($userWorks as $uw){
  5947.                     $status = new Statut();
  5948.                     $status->setNotification($notif);
  5949.                     $status->setUser($uw->getUser());
  5950.                     $notif->addStatut($status);
  5951.                 }
  5952.                 $this->em->persist($notif);
  5953.             }
  5954.         }
  5955.         $this->em->persist($docShare);
  5956.         $this->em->flush();
  5957.         return ["message"=>"","statut"=>true,"data"=>$docShare->toArray()];
  5958.     }
  5959.     public function removeGroupFromSharedDocument(array $data){
  5960.         $user = $this->currenUser;
  5961.         $req=['id','groups'];
  5962.         foreach ($req as $val)
  5963.         {
  5964.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5965.         }
  5966.         $doc = $this->em->getRepository(Document::class)->findOneBy(['id'=>$data['id'],'user'=>$user]);
  5967.         if($doc === null) return ['message' =>$this->container->get('translator')->trans('document_not_found'),"statut"=>false,"code"=>401];
  5968.         if($doc->getIsActive() === false) return ['message' =>$this->container->get('translator')->trans('document_not_found'),"statut"=>false,"code"=>401];
  5969.         if(count($data['groups'])===0) return ['message' =>$this->container->get('translator')->trans('no_group_found'),"statut"=>false,"code"=>401];
  5970.         if(!$doc->getIsShared()){
  5971.             return ["message"=>"operation_denied","statut"=>false,"code"=>401,"data"=>""];
  5972.         }
  5973.         $docShare = $this->em->getRepository(DocumentPartage::class)->findOneBy(['document'=>$doc,'isActive'=>1]);
  5974.         if($docShare === null){
  5975.             return ["message"=>"operation_denied","statut"=>false,"code"=>401,"data"=>""];
  5976.         }
  5977.         $groups = $this->em->getRepository(Workgroup::class)->findMultiple($data['groups']);
  5978.         if(count($groups)===0) return ['message' =>$this->container->get('translator')->trans('no_group_found'),"statut"=>false,"code"=>401];
  5979.         $nb = $docShare->getNbGroup();
  5980.         foreach($groups as $g){
  5981.             if($docShare->getWorkgroups()->contains($g)){
  5982.                 $docShare->removeWorkgroup($g);
  5983.                 $nb--;
  5984.             }
  5985.         }
  5986.         $docShare->setNbGroup($nb);
  5987.         $this->em->persist($docShare);
  5988.         $this->em->flush();
  5989.         return ["message"=>"","statut"=>true,"data"=>$docShare->toArray()];
  5990.     }
  5991.     public function removeUserFromSharedDocument(array $data){
  5992.         $user = $this->currenUser;
  5993.         $req=['id','users'];
  5994.         foreach ($req as $val)
  5995.         {
  5996.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  5997.         }
  5998.         $doc = $this->em->getRepository(Document::class)->findOneBy(['id'=>$data['id'],'user'=>$user]);
  5999.         if($doc === null) return ['message' =>$this->container->get('translator')->trans('document_not_found'),"statut"=>false,"code"=>401];
  6000.         if($doc->getIsActive() === false) return ['message' =>$this->container->get('translator')->trans('document_not_found'),"statut"=>false,"code"=>401];
  6001.         if(count($data['users'])===0) return ['message' =>$this->container->get('translator')->trans('no_user_found'),"statut"=>false,"code"=>401];
  6002.         if(!$doc->getIsShared()){
  6003.             return ["message"=>"operation_denied","statut"=>false,"code"=>401,"data"=>""];
  6004.         }
  6005.         $docShare = $this->em->getRepository(DocumentPartage::class)->findOneBy(['document'=>$doc,'isActive'=>1]);
  6006.         if($docShare === null){
  6007.             return ["message"=>"operation_denied","statut"=>false,"code"=>401,"data"=>""];
  6008.         }
  6009.         $users = $this->em->getRepository(User::class)->findMultiple($data['users']);
  6010.         if(count($users)===0) return ['message' =>$this->container->get('translator')->trans('no_user_found'),"statut"=>false,"code"=>401];
  6011.         $nb = $docShare->getNbUser();
  6012.         foreach($users as $u){
  6013.             if($docShare->getUsers()->contains($u)){
  6014.                 $docShare->removeUser($u);
  6015.                 $nb--;
  6016.             }
  6017.         }
  6018.         $docShare->setNbUser($nb);
  6019.         $this->em->persist($docShare);
  6020.         $this->em->flush();
  6021.         return ["message"=>"","statut"=>true,"data"=>$docShare->toArray()];
  6022.     }
  6023.     public function removeUserFromSharedRepertoire(array $data){
  6024.         $user = $this->currenUser;
  6025.         $req=['id','users'];
  6026.         foreach ($req as $val)
  6027.         {
  6028.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  6029.         }
  6030.         $rep = $this->em->getRepository(Repertoire::class)->findOneBy(['id'=>$data['id'],'user'=>$user]);
  6031.         if($rep === null) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>401];
  6032.         if($rep->getIsActive() === false) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>401];
  6033.         if(count($data['users'])===0) return ['message' =>$this->container->get('translator')->trans('no_user_found'),"statut"=>false,"code"=>401];
  6034.         if(!$rep->getIsShared()){
  6035.             return ["message"=>"operation_denied","statut"=>false,"code"=>401,"data"=>""];
  6036.         }
  6037.         $repShare = $this->em->getRepository(RepertoirePartage::class)->findOneBy(['repertoire'=>$rep,'isActive'=>1]);
  6038.         if($repShare === null){
  6039.             return ["message"=>"operation_denied","statut"=>false,"code"=>401,"data"=>""];
  6040.         }
  6041.         $users = $this->em->getRepository(User::class)->findMultiple($data['users']);
  6042.         if(count($users)===0) return ['message' =>$this->container->get('translator')->trans('no_user_found'),"statut"=>false,"code"=>401];
  6043.         $nb = $repShare->getNbUser();
  6044.         foreach($users as $u){
  6045.             if($repShare->getUsers()->contains($u)){
  6046.                 $repShare->removeUser($u);
  6047.                 $nb--;
  6048.             }
  6049.         }
  6050.         $repShare->setNbUser($nb);
  6051.         $this->em->persist($repShare);
  6052.         $this->em->flush();
  6053.         return ["message"=>"","statut"=>true,"data"=>$repShare->toArray()];
  6054.     }
  6055.     /**
  6056.      * Return OnlyOffice fileType (extension) from MIME type
  6057.      * or null if not editable.
  6058.      */
  6059.     function getOnlyOfficeFileTypeFromMime(string $mimeType): ?string
  6060.     {
  6061.         $map = [
  6062.             // ===== WORD =====
  6063.             'application/msword' =>
  6064.                 'doc',
  6065.             'application/vnd.openxmlformats-officedocument.wordprocessingml.document' =>
  6066.                 'docx',
  6067.             'application/vnd.oasis.opendocument.text' =>
  6068.                 'odt',
  6069.             'application/rtf' =>
  6070.                 'rtf',
  6071.             'text/plain' =>
  6072.                 'txt',
  6073.             // ===== EXCEL =====
  6074.             'application/vnd.ms-excel' =>
  6075.                 'xls',
  6076.             'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' =>
  6077.                 'xlsx',
  6078.             'application/vnd.oasis.opendocument.spreadsheet' =>
  6079.                 'ods',
  6080.             'text/csv' =>
  6081.                 'csv',
  6082.             // ===== POWERPOINT =====
  6083.             'application/vnd.ms-powerpoint' =>
  6084.                 'ppt',
  6085.             'application/vnd.openxmlformats-officedocument.presentationml.presentation' =>
  6086.                 'pptx',
  6087.             'application/vnd.oasis.opendocument.presentation' =>
  6088.                 'odp',
  6089.         ];
  6090.         return isset($map[$mimeType]) ? $map[$mimeType] : null;
  6091.     }
  6092.     /**
  6093.      * Return OnlyOffice documentType from fileType
  6094.      */
  6095.     function getOnlyOfficeDocumentType(string $fileType): string
  6096.     {
  6097.         if (in_array($fileType, ['doc', 'docx', 'odt', 'rtf', 'txt'], true)) {
  6098.             return 'word';
  6099.         }
  6100.         if (in_array($fileType, ['xls', 'xlsx', 'ods', 'csv'], true)) {
  6101.             return 'cell';
  6102.         }
  6103.         if (in_array($fileType, ['ppt', 'pptx', 'odp'], true)) {
  6104.             return 'slide';
  6105.         }
  6106.         throw new \RuntimeException('Unsupported OnlyOffice fileType: ' . $fileType);
  6107.     }
  6108.     public function getOneDocument(array $data){
  6109.         $user = $this->currenUser;
  6110.         $req=['id'];
  6111.         foreach ($req as $val)
  6112.         {
  6113.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  6114.         }
  6115.         $doc = $this->em->getRepository(Document::class)->findOneBy(['id'=>$data['id'],'isActive'=>true]);
  6116.         if($doc === null) return ['message' =>$this->container->get('translator')->trans('document_not_found'),"statut"=>false,"code"=>401];
  6117.         $test = false;
  6118.         if($doc->getUser()->getId() === $user->getId()) { $test = true;}
  6119.         else{
  6120.             $t = true;
  6121.             $docShare = $this->em->getRepository(DocumentPartage::class)->findOneBy(['document'=>$doc]);
  6122.             if($docShare !== null){
  6123.                 if($docShare->getUsers()->contains($user)){
  6124.                     $t = false;
  6125.                     $test = true;
  6126.                 }
  6127.             }
  6128.             else{
  6129.                 $rep = $doc->getRepertoire();
  6130.                 while($rep !== null && $t === true){
  6131.                     if($rep->getIsShared()){
  6132.                         $sh = $this->em->getRepository(RepertoirePartage::class)->findOneBy(['repertoire'=>$rep]);
  6133.                         if($sh !== null){
  6134.                             if($sh->getUsers()->contains($user)){
  6135.                                 $test = true;
  6136.                                 $t = false;
  6137.                             }
  6138.                             else
  6139.                             {
  6140.                                 $rep = $rep->getParent();
  6141.                             }
  6142.                         }
  6143.                         else
  6144.                         {
  6145.                             $rep->setIsShared(false);
  6146.                             $this->em->persist($rep);
  6147.                             $this->em->flush();
  6148.                             $rep = $rep->getParent();
  6149.                         }
  6150.                     }else{
  6151.                         $rep = $rep->getParent();
  6152.                     }
  6153.                 }
  6154.             }
  6155.         }
  6156.         if($test === false){
  6157.             return ['message' =>$this->container->get('translator')->trans('operation_denied'),"statut"=>false,"code"=>401];
  6158.         }
  6159.         $dr = $doc->toArray();
  6160.         $onlyOffice = [];
  6161.         $mimeType = $doc->getFichier()->getType();
  6162.         // Get file extension from the actual filename
  6163.         $fileName = $doc->getFichier()->getNom();
  6164.         $extension = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
  6165.         // Prioritize file extension over MIME type for accuracy
  6166.         // MIME type can be wrong (e.g., xlsx detected as xls)
  6167.         $fileType = null;
  6168.         // CRITICAL: OnlyOffice cannot save in old XLS format (exit code 88)
  6169.         // Always treat XLS files as XLSX to avoid converter errors
  6170.         if ($extension === 'xls') {
  6171.             $fileType = 'xlsx';  // Force modern format
  6172.         } elseif ($extension === 'doc') {
  6173.             $fileType = 'docx';  // Same for old Word format
  6174.         } elseif ($extension === 'ppt') {
  6175.             $fileType = 'pptx';  // Same for old PowerPoint format
  6176.         } elseif (in_array($extension, ['docx', 'odt', 'rtf', 'txt', 'xlsx', 'ods', 'csv', 'pptx', 'odp'])) {
  6177.             $fileType = $extension;
  6178.         } else {
  6179.             // Fallback to MIME type detection if extension is not recognized
  6180.             $fileType = $this->getOnlyOfficeFileTypeFromMime($mimeType);
  6181.         }
  6182.         if ($fileType !== null) {
  6183.             $documentType = $this->getOnlyOfficeDocumentType($fileType);
  6184.             if($documentType!==''){
  6185.                 /**
  6186.                  * Préparation ONLYOFFICE
  6187.                  */
  6188.                 $encryptedPath = $this->container
  6189.                         ->get('upload_service')
  6190.                         ->getTargetDirectory() . '/' .  $doc->getFichier()->getPath();
  6191.                 // 1️⃣ Decrypt file to unique temp file per user/session
  6192.                 $tmpFileName = sprintf(
  6193.                     'ged_%d_%d_%s.%s',
  6194.                     $doc->getId(),
  6195.                     $this->currentUser->getId(),
  6196.                     bin2hex(random_bytes(4)), // unique per session
  6197.                     $fileType
  6198.                 );
  6199.                 $tmpPath = sys_get_temp_dir() . '/' . $tmpFileName;
  6200.                 if (!file_exists($tmpPath)) {
  6201.                     $encryptedContent = file_get_contents($encryptedPath);
  6202.                     $clearContent = $this->container->get('hash_service')->decrypt($encryptedContent);
  6203.                     file_put_contents($tmpPath, $clearContent);
  6204.                 }
  6205.                 $fileUrl = $this->urlGenerator->generate(
  6206.                     'web_tmp_file',
  6207.                     ['name' => $tmpFileName],
  6208.                     UrlGeneratorInterface::ABSOLUTE_URL
  6209.                 );
  6210.                 $fileUrl = str_replace('localhost', $this->container->getParameter('app.symfony_domain'), $fileUrl);
  6211.                 $callbackUrl = $this->urlGenerator->generate(
  6212.                     'web_onlyoffice_callback',
  6213.                     ['id' => $doc->getId(), 'tmp_file' => $tmpFileName],
  6214.                     UrlGeneratorInterface::ABSOLUTE_URL
  6215.                 );
  6216.                 $callbackUrl = str_replace('localhost', $this->container->getParameter('app.symfony_domain'), $callbackUrl);
  6217.                 $callbackUrl = str_replace('http:', 'https:', $callbackUrl);
  6218.                 // 🔑 Document key identifies a specific version of the document
  6219.                 // Include fileType and dateCreation timestamp so key changes when content changes
  6220.                 // This tells OnlyOffice it's a new version after save
  6221.                 $lastModified = $doc->getFichier()->getDateCreation()->getTimestamp();
  6222.                 $documentKey = hash('sha256', 'doc_' . $doc->getId() . '_' . $fileType . '_' . $lastModified);
  6223.                 $config = [
  6224.                     'documentType' => $documentType,
  6225.                     'document' => [
  6226.                         'fileType' => $fileType,
  6227.                         'key' => $documentKey,
  6228.                         'title' => $doc->getNom(),
  6229.                         'url' => $fileUrl,
  6230.                         'permissions' => [
  6231.                             'edit' => true,
  6232.                             'download' => true,
  6233.                             'print' => true,
  6234.                             'comment' => true,
  6235.                             'fillForms' => true
  6236.                         ],
  6237.                     ],
  6238.                     'editorConfig' => [
  6239.                         'mode' => 'edit',
  6240.                         'user' => [
  6241.                             'id' => (string) $this->currentUser->getId(),
  6242.                             'name' => $this->currentUser->getEmail(),
  6243.                         ],
  6244.                         'callbackUrl' => $callbackUrl,
  6245.                         'coEditing' => [
  6246.                             'mode' => 'strict',  // or 'fast' for real-time collaboration
  6247.                             'change' => true
  6248.                         ],
  6249.                         'customization' => [
  6250.                             'autosave' => true,
  6251.                             'forcesave' => true,
  6252.                             'assemblyFormatAsOrigin'=> true,
  6253.                             'goback' => false
  6254.                         ],
  6255.                     ],
  6256.                     'file' => [
  6257.                         'tmp_name' => $tmpFileName,
  6258.                     ],
  6259.                     'exp' => time() + (($this->container->getParameter('app.session_time_out')/60000)*60 - 120),
  6260.                 ];
  6261.                 $token = JWT::encode(
  6262.                     $config,
  6263.                     $this->container->getParameter('app.only_office_jwt_secret'),
  6264.                     'HS256'
  6265.                 );
  6266.                 $onlyOffice = [
  6267.                     'onlyofficeUrl' => $this->container->getParameter('app.only_office_url'),
  6268.                     'config' => $config,
  6269.                     'token' => $token,
  6270.                 ];
  6271.                 $dr['onlyOffice'] = $onlyOffice;
  6272.             }
  6273.         }
  6274.         return ["message"=>"","statut"=>true,"data"=>$dr];
  6275.     }
  6276.     public function getFolderItem(array $data){
  6277.         $user = $this->currenUser;
  6278.         $req=['limit','offset','id'];
  6279.         foreach ($req as $val)
  6280.         {
  6281.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  6282.         }
  6283.         $main = $this->em->getRepository(Repertoire::class)->findOneBy(['id'=>$data['id'],'isActive'=>true]);
  6284.         if($main === null) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>401];
  6285.         $test = false;
  6286.         if($main->getUser()->getId() === $user->getId()) {
  6287.             $test = true;
  6288.         }
  6289.         else{
  6290.             $t = true;
  6291.             $rep = $main;
  6292.             while($rep !== null && $t === true){
  6293.                 if($rep->getIsShared()){
  6294.                     $sh = $this->em->getRepository(RepertoirePartage::class)->findOneBy(['repertoire'=>$rep]);
  6295.                     if($sh !== null){
  6296.                         if($sh->getUsers()->contains($user)){
  6297.                             $test = true;
  6298.                             $t = false;
  6299.                         }
  6300.                         else
  6301.                         {
  6302.                             $rep = $rep->getParent();
  6303.                         }
  6304.                     }
  6305.                     else
  6306.                     {
  6307.                         $rep->setIsShared(false);
  6308.                         $this->em->persist($rep);
  6309.                         $this->em->flush();
  6310.                         $rep = $rep->getParent();
  6311.                     }
  6312.                 }else{
  6313.                     $rep = $rep->getParent();
  6314.                 }
  6315.             }
  6316.         }
  6317.         if($test === false){
  6318.             return ['message' =>$this->container->get('translator')->trans('operation_denied'),"statut"=>false,"code"=>401];
  6319.         }
  6320.         $orderBy = 'date_desc';//date_desc name_asc name_desc
  6321.         if(array_key_exists('orderBy',$data)){
  6322.             $orderBy = $data['orderBy'];
  6323.         }
  6324.         $folders = $this->em->getRepository(Repertoire::class)->getSubFolder($main->getUser()->getId(),$main->getId(), $data['limit'],$data['offset'],$orderBy);
  6325.         $docs = $this->em->getRepository(Document::class)->getFolderDocument($main->getUser()->getId(),$main->getId(),$data['limit'],$data['offset'],$orderBy);
  6326.         $f=[];
  6327.         $d=[];
  6328.         foreach ($folders as $e)
  6329.         {
  6330.             $t = $e->toArray();
  6331.             $t['type']=1;
  6332.             $f[] = $t;
  6333.         }
  6334.         foreach ($docs as $e)
  6335.         {
  6336.             $t = $e->toArray();
  6337.             $t['type']=0;
  6338.             $d[] = $t;
  6339.         }
  6340.         return ["message"=>"","statut"=>true,"data"=>['docs'=>$d,'folders'=>$f,'main'=>$main->toArray()]];
  6341.     }
  6342.     public function getFile(array $data){
  6343.         if(!array_key_exists('name',$data)) return ["message"=>"name field is required","statut"=>false,"code"=>""];
  6344.         $file = $this->em->getRepository(Fichier::class)->findByNameLike($data['name']);
  6345.         if($file === null) return null;
  6346.         $log = new Log();
  6347.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT60'));
  6348.         if(!is_null($operation))
  6349.         {
  6350.             $log->setOperation($operation);
  6351.             $log->setUser($this->currenUser);
  6352.             $log->setObservation($file->getId());
  6353.             $this->em->persist($log);
  6354.             $this->em->flush();
  6355.         }
  6356.         return $file->toArray();
  6357.     }
  6358.     public function getOneRepertoire(array $data){
  6359.         $user = $this->currenUser;
  6360.         $req=['id'];
  6361.         foreach ($req as $val)
  6362.         {
  6363.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  6364.         }
  6365.         $doc = $this->em->getRepository(Repertoire::class)->findOneBy(['id'=>$data['id'],'isActive'=>true]);
  6366.         if($doc === null) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>401];
  6367.         $test = false;
  6368.         if($doc->getUser()->getId() === $user->getId()) $test = true;
  6369.         if($test === false){
  6370.             if($doc->getIsShared()){
  6371.                 $docShare = $this->em->getRepository(RepertoirePartage::class)->findOneBy(['repertoire'=>$doc]);
  6372.                 if($docShare === null) {
  6373.                     $doc->setIsShared(false);
  6374.                     $this->em->persist($doc);
  6375.                     $this->em->flush();
  6376.                     return ['message' =>$this->container->get('translator')->trans('operation_denied'),"statut"=>false,"code"=>401];
  6377.                 }
  6378.                 if(!$docShare->getUsers()->contains($user)){
  6379.                     return ['message' =>$this->container->get('translator')->trans('operation_denied'),"statut"=>false,"code"=>401];
  6380.                 }
  6381.             }
  6382.             else{
  6383.                 return ['message' =>$this->container->get('translator')->trans('operation_denied'),"statut"=>false,"code"=>401];
  6384.             }
  6385.         }
  6386.         return ["message"=>"","statut"=>true,"data"=>$doc->toArray()];
  6387.     }
  6388.     public function getDocumentSharedUsersAndGroup(array $data){
  6389.         $u = $this->currenUser;
  6390.         if(!array_key_exists('id',$data)) return ["message"=>"id field is required","statut"=>false,"code"=>""
  6391.         ];
  6392.         $doc = $this->em->getRepository(Document::class)->findOneBy(['id'=>$data['id']]);
  6393.         if($doc === null) return ['message' =>$this->container->get('translator')->trans('document_not_found'),"statut"=>false,"code"=>""];
  6394.         //$users = $this->em->getRepository(User::class)->findBy(['isActive'=>true,'isClose'=>false,'type'=>User::USER]);
  6395.         $users = $this->em->getRepository(User::class)->loadAllUsersExecptAdmin();
  6396.         $uW = $this->em->getRepository(UserWorkgroup::class)->findBy(['user'=>$u,'isActive'=>true,'status'=>true]);
  6397.         $docShare = $this->em->getRepository(DocumentPartage::class)->findOneBy(['document'=>$doc]);
  6398.         $shUser = [];
  6399.         $shGroup = [];
  6400.         $sendUsers= [];
  6401.         $sendGroups= [];
  6402.         if($docShare !== null){
  6403.             $allU = $docShare->getUsers();
  6404.             $allG = $docShare->getWorkgroups();
  6405.             foreach ($allU as $el){
  6406.                 $shUser[]=$el->getId();
  6407.             }
  6408.             foreach ($allG as $el){
  6409.                 $shGroup[]=$el->getId();
  6410.             }
  6411.         }
  6412.         foreach ($users as $el){
  6413.             if($el->getId() !== $u->getId()){
  6414.                 if(in_array($el->getId(),$shUser)){
  6415.                     $sendUsers[]=['user'=>$el->toArray(),'status'=>1];
  6416.                 }
  6417.                 else{
  6418.                     $sendUsers[]=['user'=>$el->toArray(),'status'=>0];
  6419.                 }
  6420.             }
  6421.         }
  6422.         foreach ($uW as $el){
  6423.             if(in_array($el->getWorkgroup()->getId(),$shGroup)){
  6424.                 $sendGroups[]=['group'=>$el->getWorkgroup()->toArray(),'status'=>1];
  6425.             }
  6426.             else{
  6427.                 $sendGroups[]=['group'=>$el->getWorkgroup()->toArray(),'status'=>0];
  6428.             }
  6429.         }
  6430.         return ["message"=>"","statut"=>true,"data"=>['users'=>$sendUsers,'groups'=>$sendGroups]];
  6431.     }
  6432.     public function getRepertoireSharedUsers(array $data){
  6433.         $u = $this->currenUser;
  6434.         if(!array_key_exists('id',$data)) return ["message"=>"id field is required","statut"=>false,"code"=>""
  6435.         ];
  6436.         $rep = $this->em->getRepository(Repertoire::class)->findOneBy(['id'=>$data['id']]);
  6437.         if($rep === null) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>""];
  6438.         //$users = $this->em->getRepository(User::class)->findBy(['isActive'=>true,'isClose'=>false,'type'=>User::USER]);
  6439.         $users = $this->em->getRepository(User::class)->loadAllUsersExecptAdmin();
  6440.         $repShare = $this->em->getRepository(RepertoirePartage::class)->findOneBy(['repertoire'=>$rep]);
  6441.         $shUser = [];
  6442.         $sendUsers= [];
  6443.         if($repShare !== null){
  6444.             $allU = $repShare->getUsers();
  6445.             foreach ($allU as $el){
  6446.                 $shUser[]=$el->getId();
  6447.             }
  6448.         }
  6449.         foreach ($users as $el){
  6450.             if($el->getId() !== $u->getId()){
  6451.                 if(in_array($el->getId(),$shUser)){
  6452.                     $sendUsers[]=['user'=>$el->toArray(),'status'=>1];
  6453.                 }
  6454.                 else{
  6455.                     $sendUsers[]=['user'=>$el->toArray(),'status'=>0];
  6456.                 }
  6457.             }
  6458.         }
  6459.         return ["message"=>"","statut"=>true,"data"=>['users'=>$sendUsers]];
  6460.     }
  6461.     public function getMySharedFileAndFolder(array $data){
  6462.         $user = $this->currenUser;
  6463.         $req=['limit','offset'];
  6464.         foreach ($req as $val)
  6465.         {
  6466.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  6467.         }
  6468.         $folders = $this->em->getRepository(RepertoirePartage::class)->getSharedWithUser($user->getId(),$data['limit'],$data['offset']);
  6469.         $docs = $this->em->getRepository(DocumentPartage::class)->getSharedWithUser($user->getId(),$data['limit'],$data['offset']);
  6470.         $f=[];
  6471.         $d=[];
  6472.         foreach ($folders as $e)
  6473.         {
  6474.             $t = $e->getRepertoire()->toArray();
  6475.             $t['type']=1;
  6476.             $f[] = $t;
  6477.         }
  6478.         foreach ($docs as $e)
  6479.         {
  6480.             $t = $e->getDocument()->toArray();
  6481.             $t['type']=0;
  6482.             $d[] = $t;
  6483.         }
  6484.         return ["message"=>"","statut"=>true,"data"=>['docs'=>$d,'folders'=>$f]];
  6485.     }
  6486.     public function testChat(array $data){
  6487.         $user = $this->currenUser;
  6488.         return ["message"=>"","statut"=>true,"data"=>['user'=>$user->toArray()]];
  6489.     }
  6490.     public function getMercureToken($user){
  6491.         $token = (new Builder())
  6492.             ->withClaim('mercure', ['subscribe' => [
  6493.                 sprintf("/%s",$this->hash->encrypt($user->getEmail()) ),
  6494.                 sprintf("/%s",'chat' ),
  6495.                 sprintf("/%s",'TYPE_'.$user->getType() )
  6496.             ]
  6497.             ])
  6498.             ->getToken(
  6499.                 new Sha256(),
  6500.                 new Key('digitrav')
  6501.             )
  6502.         ;
  6503.         return $token;
  6504.     }
  6505.     public function getCurrentUser(){
  6506.         $u = $this->currenUser;
  6507.         if($u === null) {
  6508.             return ['message' =>"", 'statut' =>false, 'data' =>null];
  6509.         }
  6510.         else {
  6511.             return ['message' =>"", 'statut' =>true, 'data' =>$u->toArray()];
  6512.         }
  6513.     }
  6514.     public function getAllUser()
  6515.     {
  6516.         $user = $this->currenUser;
  6517.         $wkgs = $this->em->getRepository(UserWorkgroup::class)->userGroups($user->getId());
  6518.         $users = $this->em->getRepository(User::class)->loadAllUsersExceptCurrent($this->currenUser->getId(),1000,0);
  6519.         $notReadUsers = $this->em->getRepository(Statut::class)->findNotReadChatUser($user->getId());
  6520.         $notReadGroup = $this->em->getRepository(Statut::class)->findNotReadChatGroup($user->getId());
  6521.         $uno =[];
  6522.         $unosid =[];
  6523.         $wno = [];
  6524.         $wnosid = [];
  6525.         foreach ($notReadUsers as $n){
  6526.             if(!array_key_exists($n['id'],$uno)){
  6527.                 $uno[$n['id']]=1;
  6528.                 $unosid[$n['id']]=[];
  6529.                 $unosid[$n['id']][]=$n['sid'];
  6530.             }else{
  6531.                 $uno[$n['id']]++;
  6532.                 $unosid[$n['id']][]=$n['sid'];
  6533.             }
  6534.         }
  6535.         foreach ($notReadGroup as $n){
  6536.             if(!array_key_exists($n['id'],$wno)){
  6537.                 $wno[$n['id']]=1;
  6538.                 $wnosid[$n['id']]=[];
  6539.                 $wnosid[$n['id']][]=$n['sid'];
  6540.             }else{
  6541.                 $wno[$n['id']]++;
  6542.                 $wnosid[$n['id']][]=$n['sid'];
  6543.             }
  6544.         }
  6545.         $tab = [];
  6546.         $tab2 = [];
  6547.         foreach ($users as $u){
  6548.             $e = $u->toArray();
  6549.             if(array_key_exists($u->getId(),$uno)){
  6550.                 $e['not_read'] =$uno[$u->getId()];
  6551.                 $e['not_read_sid'] =$unosid[$u->getId()];
  6552.             }
  6553.             else{
  6554.                 $e['not_read'] =0;
  6555.             }
  6556.             $tab[] =$e ;
  6557.         }
  6558.         foreach ($wkgs as $w){
  6559.             $e = $w->getWorkgroup()->toArray();
  6560.             if(array_key_exists($w->getWorkgroup()->getId(),$wno)){
  6561.                 $e['not_read'] =$wno[$w->getWorkgroup()->getId()];
  6562.                 $e['not_read_sid'] =$wnosid[$w->getWorkgroup()->getId()];
  6563.             }
  6564.             else{
  6565.                 $e['not_read'] =0;
  6566.             }
  6567.             $tab2[] = $e;
  6568.         }
  6569.         return ['message' =>"", 'statut' =>true, 'data' =>['users'=>$tab,'groups'=>$tab2
  6570.         ]];
  6571.     }
  6572.     public function sendMessageToAll(array $data){
  6573.         $user = $this->currenUser;
  6574.         $req=['message'];
  6575.         foreach ($req as $val)
  6576.         {
  6577.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  6578.         }
  6579.         if(strlen($data['message']) === 0) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  6580.         $msg = new Message();
  6581.         $msg->setSender($user);
  6582.         $msg->setContent($data['message']);
  6583.         if(array_key_exists('file',$data)){
  6584.             $msg->setFile($data['file']);
  6585.         }
  6586.         $msg->setType(Message::MESSAGE_ALL);
  6587.         $this->em->persist($msg);
  6588.         $notif = new Notification();
  6589.         $notif->setUser($user);
  6590.         $notif->setMessage($msg);
  6591.         $notif->setCode(Notification::NEW_MESSAGE);
  6592.         /*$users = $this->em->getRepository(User::class)->loadAllUsersExceptCurrent($user->getId(),1000,0);
  6593.         $uids =[];
  6594.         foreach ($users as $u){
  6595.             $statut = new Statut();
  6596.             $statut->setUser($u);
  6597.             $statut->setNotification($notif);
  6598.             $notif->addStatut($statut);
  6599.             $uids[] = $u->getId();
  6600.         }*/
  6601.         $this->em->persist($notif);
  6602.         $this->em->flush();
  6603.         return ['message' =>"", 'statut' =>true, 'data' =>['message'=>$msg->toArray(),'users'=>[],'except'=>$user->getId()]];
  6604.     }
  6605.     public function sendMessageToUser(array $data){
  6606.         $user = $this->currenUser;
  6607.         $req=['message','user'];
  6608.         foreach ($req as $val)
  6609.         {
  6610.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  6611.         }
  6612.         if(strlen($data['message']) === 0) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  6613.         $r = $this->em->getRepository(User::class)->findOneBy(['id'=>$data['user']]);
  6614.         if($r === null) return ["message"=>$this->container->get('translator')->trans('operation_denied'),"statut"=>false,"code"=>""];
  6615.         $msg = new Message();
  6616.         $msg->setSender($user);
  6617.         $msg->setReceiver($r);
  6618.         $msg->setContent($data['message']);
  6619.         if(array_key_exists('file',$data)){
  6620.             $msg->setFile($data['file']);
  6621.         }
  6622.         $msg->setType(Message::MESSAGE_USER);
  6623.         $this->em->persist($msg);
  6624.         $notif = new Notification();
  6625.         $notif->setUser($user);
  6626.         $notif->setMessage($msg);
  6627.         $notif->setCode(Notification::NEW_MESSAGE);
  6628.         $uids =[];
  6629.         $uids[] = $r->getId();
  6630.         $statut = new Statut();
  6631.         $statut->setUser($r);
  6632.         $statut->setNotification($notif);
  6633.         $notif->addStatut($statut);
  6634.         $this->em->persist($notif);
  6635.         $this->em->flush();
  6636.         return ['message' =>"", 'statut' =>true, 'data' =>['message'=>$msg->toArray(),'users'=>$uids]];
  6637.     }
  6638.     public function sendMessageToGroup(array $data){
  6639.         $user = $this->currenUser;
  6640.         $req=['message','group'];
  6641.         foreach ($req as $val)
  6642.         {
  6643.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  6644.         }
  6645.         if(strlen($data['message']) === 0) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  6646.         $group = $this->em->getRepository(Workgroup::class)->findOneBy(['id'=>$data['group']]);
  6647.         if($group === null) return ["message"=>$this->container->get('translator')->trans('group_not_found'),"statut"=>false,"code"=>""];
  6648.         $msg = new Message();
  6649.         $msg->setSender($user);
  6650.         $msg->setWorkgroup($group);
  6651.         $msg->setContent($data['message']);
  6652.         if(array_key_exists('file',$data)){
  6653.             $msg->setFile($data['file']);
  6654.         }
  6655.         $msg->setType(Message::MESSAGE_GROUP);
  6656.         $this->em->persist($msg);
  6657.         $notif = new Notification();
  6658.         $notif->setUser($user);
  6659.         $notif->setMessage($msg);
  6660.         $notif->setCode(Notification::NEW_MESSAGE);
  6661.         $wkgs = $this->em->getRepository(UserWorkgroup::class)->findBy(['workgroup'=>$group]);
  6662.         $uids =[];
  6663.         foreach ($wkgs as $wk){
  6664.             $u = $wk->getUser();
  6665.             if($u->getId() !== $user->getId()){
  6666.                 $statut = new Statut();
  6667.                 $statut->setUser($u);
  6668.                 $statut->setNotification($notif);
  6669.                 $notif->addStatut($statut);
  6670.                 $uids[] = $u->getId();
  6671.             }
  6672.         }
  6673.         $this->em->persist($notif);
  6674.         $this->em->flush();
  6675.         return ['message' =>"", 'statut' =>true, 'data' =>['message'=>$msg->toArray(),'users'=>$uids]];
  6676.     }
  6677.     public function getUserChatMessage(array $data){
  6678.         $user = $this->currenUser;
  6679.         $req=['limit','offset','id'];
  6680.         foreach ($req as $val)
  6681.         {
  6682.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  6683.         }
  6684.         if((int)$data['id'] === $user->getId()) return ["message"=>$this->container->get('translator')->trans('operation_denied'),"statut"=>false,"code"=>""];
  6685.         $messages = $this->em->getRepository(Message::class)->findForUser($user->getId(),$data['id'], $data['limit'],$data['offset']);
  6686.         $tab = [];
  6687.         if(array_key_exists('status',$data)&& (count($data['status'])>0)){
  6688.             $status = $this->em->getRepository(Statut::class)->findList($user->getId(),$data['status']);
  6689.             foreach ($status as $s){
  6690.                 $s->setStatut(1);
  6691.                 $this->em->persist($s);
  6692.             }
  6693.             if(count($status)>0){
  6694.                 $this->em->flush();
  6695.             }
  6696.         }
  6697.         foreach ($messages as $m){
  6698.             $tab[]=$m->toArray();
  6699.         }
  6700.         return ['message' =>"", 'statut' =>true, 'data' =>$tab];
  6701.     }
  6702.     public function getGroupChatMessage(array $data){
  6703.         $user = $this->currenUser;
  6704.         $req=['limit','offset','id'];
  6705.         foreach ($req as $val)
  6706.         {
  6707.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  6708.         }
  6709.         $group = $this->em->getRepository(UserWorkgroup::class)->findOneBy(['user'=>$user->getId(),'workgroup'=>$data['id']]);
  6710.         if($group === null) return ["message"=>$this->container->get('translator')->trans('operation_denied'),"statut"=>false,"code"=>""];
  6711.         $messages = $this->em->getRepository(Message::class)->findForGroup($data['id'], $data['limit'],$data['offset']);
  6712.         $tab = [];
  6713.         if(array_key_exists('status',$data)&& (count($data['status'])>0)){
  6714.             $status = $this->em->getRepository(Statut::class)->findList($user->getId(),$data['status']);
  6715.             foreach ($status as $s){
  6716.                 $s->setStatut(1);
  6717.                 $this->em->persist($s);
  6718.             }
  6719.             if(count($status)>0){
  6720.                 $this->em->flush();
  6721.             }
  6722.         }
  6723.         foreach ($messages as $m){
  6724.             $tab[]=$m->toArray();
  6725.         }
  6726.         return ['message' =>"", 'statut' =>true, 'data' =>$tab];
  6727.     }
  6728.     public function getAllChatMessage(array $data){
  6729.         $user = $this->currenUser;
  6730.         $req=['limit','offset'];
  6731.         foreach ($req as $val)
  6732.         {
  6733.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  6734.         }
  6735.         $messages = $this->em->getRepository(Message::class)->findForAll( $data['limit'],$data['offset']);
  6736.         $tab = [];
  6737.         foreach ($messages as $m){
  6738.             $tab[]=$m->toArray();
  6739.         }
  6740.         return ['message' =>"", 'statut' =>true, 'data' =>$tab];
  6741.     }
  6742.     public function updateStatus(array $data){
  6743.         $user = $this->currenUser;
  6744.         $req=['list'];
  6745.         foreach ($req as $val)
  6746.         {
  6747.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  6748.         }
  6749.         $status = $this->em->getRepository(Statut::class)->findList($user->getId(),$data['list']);
  6750.         foreach ($status as $s){
  6751.             $s->setStatut(1);
  6752.             $this->em->persist($s);
  6753.         }
  6754.         if(count($status)>0){
  6755.             $this->em->flush();
  6756.         }
  6757.         return ['message' =>"", 'statut' =>true, 'data' => []];
  6758.     }
  6759.     public function registerIncomingMail(array $data){
  6760.         $user = $this->currenUser;
  6761.         $req=['confi','priorite','receiver','actor','courtier','type','contenu','titre','reference','date_enreg','files','ref_int','selected_attached_file'];
  6762.         $reqObli=['confi','priorite','receiver','actor','courtier','type','titre','reference','date_enreg'];
  6763.         foreach ($req as $val)
  6764.         {
  6765.             if(!array_key_exists($val,$data)) {
  6766.                 return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  6767.             }
  6768.             else{
  6769.                 if(in_array($val,$reqObli) && strlen($data[$val]) ===0){
  6770.                     return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  6771.                 }
  6772.             }
  6773.         }
  6774.         $confi = $this->em->getRepository(TypeConfidentialite::class)->findOneBy(array('id' =>$data['confi']));
  6775.         if($confi === null) return ["message"=>" Type confidentialite not found","statut"=>false,"code"=>""];
  6776.         $priorite = $this->em->getRepository(Priorite::class)->findOneBy(array('id' =>$data['priorite']));
  6777.         if($priorite === null) return ["message"=>" Priorite not found","statut"=>false,"code"=>""];
  6778.         $type = $this->em->getRepository(TypeCourrier::class)->findOneBy(array('id' =>$data['type']));
  6779.         if($type === null) return ["message"=>" Type courrier not found","statut"=>false,"code"=>""];
  6780.         $receiver = $this->em->getRepository(User::class)->findOneBy(array('id' =>$data['receiver']));
  6781.         if($receiver === null) return ["message"=>" Destinataire not found","statut"=>false,"code"=>""];
  6782.         $actor = $this->em->getRepository(ActeurExterne::class)->findOneBy(array('id' =>$data['actor']));
  6783.         if($actor === null) return ["message"=>" Expéditeur not found","statut"=>false,"code"=>""];
  6784.         $broker = $this->em->getRepository(Courtier::class)->findOneBy(array('id' =>$data['courtier']));
  6785.         if($broker === null) return ["message"=>" Courtier not found","statut"=>false,"code"=>""];
  6786.         $old = $this->em->getRepository(Courrier::class)->findOneBy(['reference'=>$data['reference']]);
  6787.         if($old !== null) return ["message"=>$this->container->get('translator')->trans("reference already used"),"statut"=>false,"code"=>""];
  6788.         $courrier = new Courrier();
  6789.         $courrier->setType(Courrier::COURRIER_ENTRANT);
  6790.         $courrier->setConfidentialite($confi);
  6791.         $courrier->setPriorite($priorite);
  6792.         $courrier->setDestinataire($receiver);
  6793.         $courrier->setUser($user);
  6794.         $courrier->setTypeCourrier($type);
  6795.         $courrier->setActeur($actor);
  6796.         $courrier->setCourtier($broker);
  6797.         $courrier->setReference($data['reference']);
  6798.         $courrier->setInternalReference($data['ref_int']);
  6799.         $courrier->setContenu($data['contenu']);
  6800.         $courrier->setObjet($data['titre']);
  6801.         $courrier->setDateEnreg(\DateTime::createFromFormat('d/m/Y',$data['date_enreg']));
  6802.         $attachedFiles = $type->getPieceJointes();
  6803.         $nb = 0;
  6804.         foreach($attachedFiles as $item){
  6805.             if($item->getIsActive()){
  6806.                 $p = new PieceJointeAjoutee();
  6807.                 $p->setCourrier($courrier);
  6808.                 $p->setPieceJointe($item);
  6809.                 if(in_array($item->getId(),$data['selected_attached_file'])){
  6810.                     $p->setStatus(1);
  6811.                 }
  6812.                 else{
  6813.                     $p->setStatus(0);
  6814.                 }
  6815.                 $courrier->addPieceJointeAjoutee($p);
  6816.                 $nb++;
  6817.             }
  6818.         }
  6819.         $courrier->setNbPieceJointe($nb);
  6820.         foreach ($data["files"] as $f)
  6821.         {
  6822.             $file = new Fichier();
  6823.             $file->setNom($f["name"]);
  6824.             $file->setFolderNameAndName($courrier->getObjet()." | ". $f["name"]);
  6825.             $file->setExtension($f["extension"]);
  6826.             $file->setType($f["type"]);
  6827.             $file->setTaille($f["size"]);
  6828.             $file->setPath($f["path"]);
  6829.             $file->setAuteur($user->getNom()." ".$user->getPrenom());
  6830.             $file->setCourrier($courrier);
  6831.             $courrier->addFichier($file);
  6832.         }
  6833.         if($user->getId() !== $receiver->getId()){
  6834.             $notif = new Notification();
  6835.             $notif->setCourrier($courrier);
  6836.             $notif->setCode(Notification::NEW_INCOMING_MAIL);
  6837.             $notif->setUser($user);
  6838.             $statut = new Statut();
  6839.             $statut->setUser($receiver);
  6840.             $statut->setNotification($notif);
  6841.             $notif->addStatut($statut);
  6842.             $this->em->persist($notif);
  6843.         }
  6844.         $this->em->persist($courrier);
  6845.         $this->em->flush();
  6846.         $log = new Log();
  6847.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT86'));
  6848.         if($operation !== null)
  6849.         {
  6850.             $log->setOperation($operation);
  6851.             $log->setUser($user);
  6852.             $log->setObservation($courrier->getId());
  6853.             $this->em->persist($log);
  6854.             $this->em->flush();
  6855.         }
  6856.         $res = $courrier->toArray();
  6857.         $res['new_ref']=  strtoupper(uniqid("CE".(new \DateTime())->format("Y"), false));
  6858.         return ["message"=>"","statut"=>true,"data"=>$res];
  6859.     }
  6860.     public function registerOutGoingMail(array $data){
  6861.         $user = $this->currenUser;
  6862.         $req=['confi','priorite','receiver','actor','courtier','type','contenu','titre','reference','date_enreg','files','ref_int'];
  6863.         $reqObli=['confi','priorite','receiver','actor','courtier','type','titre','reference','date_enreg'];
  6864.         foreach ($req as $val)
  6865.         {
  6866.             if(!array_key_exists($val,$data)) {
  6867.                 return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  6868.             }
  6869.             else{
  6870.                 if(in_array($val,$reqObli) && strlen($data[$val]) ===0){
  6871.                     return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  6872.                 }
  6873.             }
  6874.         }
  6875.         $confi = $this->em->getRepository(TypeConfidentialite::class)->findOneBy(array('id' =>$data['confi']));
  6876.         if($confi === null) return ["message"=>" Type confidentialite not found","statut"=>false,"code"=>""];
  6877.         $priorite = $this->em->getRepository(Priorite::class)->findOneBy(array('id' =>$data['priorite']));
  6878.         if($priorite === null) return ["message"=>" Priorite not found","statut"=>false,"code"=>""];
  6879.         $type = $this->em->getRepository(TypeCourrier::class)->findOneBy(array('id' =>$data['type']));
  6880.         if($type === null) return ["message"=>" Type courrier not found","statut"=>false,"code"=>""];
  6881.         $receiver = $this->em->getRepository(User::class)->findOneBy(array('id' =>$data['receiver']));
  6882.         if($receiver === null) return ["message"=>" Destinataire not found","statut"=>false,"code"=>""];
  6883.         $actor = $this->em->getRepository(ActeurExterne::class)->findOneBy(array('id' =>$data['actor']));
  6884.         if($actor === null) return ["message"=>" Expéditeur not found","statut"=>false,"code"=>""];
  6885.         $broker = $this->em->getRepository(Courtier::class)->findOneBy(array('id' =>$data['courtier']));
  6886.         if($broker === null) return ["message"=>" Courtier not found","statut"=>false,"code"=>""];
  6887.         $old = $this->em->getRepository(Courrier::class)->findOneBy(['reference'=>$data['reference']]);
  6888.         if($old !== null) return ["message"=>$this->container->get('translator')->trans("reference already used"),"statut"=>false,"code"=>""];
  6889.         $courrier = new Courrier();
  6890.         $courrier->setType(Courrier::COURRIER_SORTANT);
  6891.         $courrier->setConfidentialite($confi);
  6892.         $courrier->setPriorite($priorite);
  6893.         $courrier->setDestinataire($receiver);
  6894.         $courrier->setUser($user);
  6895.         $courrier->setTypeCourrier($type);
  6896.         $courrier->setActeur($actor);
  6897.         $courrier->setCourtier($broker);
  6898.         $courrier->setReference($data['reference']);
  6899.         $courrier->setInternalReference($data['ref_int']);
  6900.         $courrier->setContenu($data['contenu']);
  6901.         $courrier->setObjet($data['titre']);
  6902.         $courrier->setStatut(Courrier::STATUT_RANGE);
  6903.         $courrier->setDateCloture(new \DateTime());
  6904.         $courrier->setDateEnreg(\DateTime::createFromFormat('d/m/Y',$data['date_enreg']));
  6905.         foreach ($data["files"] as $f)
  6906.         {
  6907.             $file = new Fichier();
  6908.             $file->setNom($f["name"]);
  6909.             $file->setFolderNameAndName($courrier->getObjet()." | ". $f["name"]);
  6910.             $file->setExtension($f["extension"]);
  6911.             $file->setType($f["type"]);
  6912.             $file->setTaille($f["size"]);
  6913.             $file->setPath($f["path"]);
  6914.             $file->setAuteur($user->getNom()." ".$user->getPrenom());
  6915.             $file->setCourrier($courrier);
  6916.             $courrier->addFichier($file);
  6917.         }
  6918.         if($user->getId() !== $receiver->getId()){
  6919.             $notif = new Notification();
  6920.             $notif->setCourrier($courrier);
  6921.             $notif->setCode(Notification::NEW_OUTGOING_MAIL);
  6922.             $notif->setUser($user);
  6923.             $statut = new Statut();
  6924.             $statut->setUser($receiver);
  6925.             $statut->setNotification($notif);
  6926.             $notif->addStatut($statut);
  6927.             $this->em->persist($notif);
  6928.         }
  6929.         $this->em->persist($courrier);
  6930.         $this->em->flush();
  6931.         $log = new Log();
  6932.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT86'));
  6933.         if($operation !== null)
  6934.         {
  6935.             $log->setOperation($operation);
  6936.             $log->setUser($user);
  6937.             $log->setObservation($courrier->getId());
  6938.             $this->em->persist($log);
  6939.             $this->em->flush();
  6940.         }
  6941.         return ["message"=>"","statut"=>true,"data"=>$courrier->toArray()];
  6942.     }
  6943.     public function getOneMail(array $data)
  6944.     {
  6945.         if(!array_key_exists("id",$data))
  6946.         {
  6947.             return ["message"=>"type or id is missing","statut"=>false,"data"=>[],"code"=>401];
  6948.         }
  6949.         else
  6950.         {
  6951.             $mail = $this->em->getRepository(Courrier::class)->findOneBy(array("id"=>$data["id"]));
  6952.             if($mail === null) return ["message"=>"courrier not found","statut"=>false,"data"=>[],"code"=>401];
  6953.             else
  6954.             {
  6955.                 $files = $this->em->getRepository(Fichier::class)->findBy(array("courrier"=>$mail,"isActive"=>true));
  6956.                 $res=[];
  6957.                 foreach ($files as $f)
  6958.                 {
  6959.                     $res[]=$f->toArray();
  6960.                 }
  6961.                 $collabo = $this->em->getRepository(CourrierCollaborateur::class)->findBy(['courrier'=>$mail,'isActive'=>1]);
  6962.                 $co = [];
  6963.                 foreach ($collabo as $c)
  6964.                 {
  6965.                     $co[]=$c->toArray();
  6966.                 }
  6967.                 if($mail->getStatut()=== Courrier::STATUT_NOUVEAU){
  6968.                     if($this->currenUser->getId() === $mail->getDestinataire()->getId()){
  6969.                         $mail->setStatut(Courrier::STATUT_EN_COURS);
  6970.                         $this->em->persist($mail);
  6971.                         $this->em->flush();
  6972.                     }
  6973.                 }
  6974.                 $attachedFile = $mail->getPieceJointeAjoutees();
  6975.                 $attachedFileTab = [];
  6976.                 foreach ($attachedFile as $item){
  6977.                     $attachedFileTab[]=$item->toArray();
  6978.                 }
  6979.                 return ["message"=>"","statut"=>true,"data"=>['mail'=>$mail->toArray(),'files'=>$res,'collabo'=>$co,'attached_files'=>$attachedFileTab],"code"=>201];
  6980.             }
  6981.         }
  6982.     }
  6983.     public function editIncomingMail(array $data){
  6984.         $user = $this->currenUser;
  6985.         $req=['id','confi','priorite','receiver','actor','courtier','type','contenu','titre','date_enreg','added_files','remove_files','ref_int','attached_files'];
  6986.         $reqObli=['confi','priorite','receiver','actor','courtier','type','titre','date_enreg'];
  6987.         foreach ($req as $val)
  6988.         {
  6989.             if(!array_key_exists($val,$data)) {
  6990.                 return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  6991.             }
  6992.             else{
  6993.                 if(in_array($val,$reqObli) && strlen($data[$val]) ===0){
  6994.                     return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  6995.                 }
  6996.             }
  6997.         }
  6998.         $courrier = $this->em->getRepository(Courrier::class)->findOneBy(array("id"=>$data["id"]));
  6999.         if($courrier === null) return ["message"=>"courrier not found","statut"=>false,"code"=>401];
  7000.         $confi = $this->em->getRepository(TypeConfidentialite::class)->findOneBy(array('id' =>$data['confi']));
  7001.         if($confi === null) return ["message"=>" Type confidentialite not found","statut"=>false,"code"=>""];
  7002.         $priorite = $this->em->getRepository(Priorite::class)->findOneBy(array('id' =>$data['priorite']));
  7003.         if($priorite === null) return ["message"=>" Priorite not found","statut"=>false,"code"=>""];
  7004.         $type = $this->em->getRepository(TypeCourrier::class)->findOneBy(array('id' =>$data['type']));
  7005.         if($type === null) return ["message"=>" Type courrier not found","statut"=>false,"code"=>""];
  7006.         $receiver = $this->em->getRepository(User::class)->findOneBy(array('id' =>$data['receiver']));
  7007.         if($receiver === null) return ["message"=>" Destinataire not found","statut"=>false,"code"=>""];
  7008.         $actor = $this->em->getRepository(ActeurExterne::class)->findOneBy(array('id' =>$data['actor']));
  7009.         if($actor === null) return ["message"=>" Expéditeur not found","statut"=>false,"code"=>""];
  7010.         $broker = $this->em->getRepository(Courtier::class)->findOneBy(array('id' =>$data['courtier']));
  7011.         if($broker === null) return ["message"=>" Coursier not found","statut"=>false,"code"=>""];
  7012.         $courrier->setConfidentialite($confi);
  7013.         $courrier->setPriorite($priorite);
  7014.         $courrier->setDestinataire($receiver);
  7015.         $courrier->setUser($user);
  7016.         $courrier->setTypeCourrier($type);
  7017.         $courrier->setActeur($actor);
  7018.         $courrier->setInternalReference($data['ref_int']);
  7019.         $courrier->setCourtier($broker);
  7020.         $courrier->setContenu($data['contenu']);
  7021.         $courrier->setObjet($data['titre']);
  7022.         $courrier->setDateEnreg(\DateTime::createFromFormat('d/m/Y',$data['date_enreg']));
  7023.         foreach ($data["remove_files"] as $id)
  7024.         {
  7025.             $file = $this->em->getRepository(Fichier::class)->findOneBy(array("id"=>$id));
  7026.             if($file !== null)
  7027.             {
  7028.                 $courrier->removeFichier($file);
  7029.             }
  7030.         }
  7031.         foreach ($data["added_files"] as $f)
  7032.         {
  7033.             $file = new Fichier();
  7034.             $file->setNom($f["name"]);
  7035.             $file->setFolderNameAndName($courrier->getObjet()." | ". $f["name"]);
  7036.             $file->setExtension($f["extension"]);
  7037.             $file->setType($f["type"]);
  7038.             $file->setTaille($f["size"]);
  7039.             $file->setPath($f["path"]);
  7040.             $file->setAuteur($user->getNom()." ".$user->getPrenom());
  7041.             $file->setCourrier($courrier);
  7042.             $courrier->addFichier($file);
  7043.         }
  7044.         if(count($data['attached_files'])>0){
  7045.             foreach($courrier->getPieceJointeAjoutees() as $i){
  7046.                 if(in_array($i->getId(),$data['attached_files'])){
  7047.                     $i->setStatus(1);
  7048.                 }else{
  7049.                     $i->setStatus(0)  ;
  7050.                 }
  7051.                 $courrier->addPieceJointeAjoutee($i);
  7052.             }
  7053.         }else{
  7054.             foreach($courrier->getPieceJointeAjoutees() as $i){
  7055.                 $i->setStatus(0)  ;
  7056.                 $courrier->addPieceJointeAjoutee($i);
  7057.             }
  7058.         }
  7059.         $this->em->persist($courrier);
  7060.         $this->em->flush();
  7061.         $log = new Log();
  7062.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'1021'));
  7063.         if($operation !== null)
  7064.         {
  7065.             $log->setOperation($operation);
  7066.             $log->setUser($user);
  7067.             $log->setObservation($courrier->getId());
  7068.             $this->em->persist($log);
  7069.             $this->em->flush();
  7070.         }
  7071.         return ["message"=>"","statut"=>true,"data"=>$courrier->toArray()];
  7072.     }
  7073.     public function getMailTask(array $data)
  7074.     {
  7075.         if(!array_key_exists("id",$data))
  7076.         {
  7077.             return ["message"=>"type or id is missing","statut"=>false,"data"=>[],"code"=>401];
  7078.         }
  7079.         else
  7080.         {
  7081.             $mail = $this->em->getRepository(Courrier::class)->findOneBy(array("id"=>$data["id"]));
  7082.             if($mail === null) return ["message"=>"courrier not found","statut"=>false,"data"=>[],"code"=>401];
  7083.             else
  7084.             {
  7085.                 $tasks = $this->em->getRepository(Tache::class)->findBy(array("courrier"=>$mail,"isActive"=>true));
  7086.                 $res=[];
  7087.                 foreach ($tasks as $f)
  7088.                 {
  7089.                     $res[]=$f->toArray();
  7090.                 }
  7091.                 return ["message"=>"","statut"=>true,"data"=>$res,"code"=>201];
  7092.             }
  7093.         }
  7094.     }
  7095.     /**
  7096.      * Internal method to create a single task
  7097.      * Extracted from createTask() to support batch creation
  7098.      * Does not auto-flush - caller is responsible for transaction management
  7099.      *
  7100.      * @param array $data Task data
  7101.      * @return array Result with task data or error
  7102.      */
  7103.     private function createTaskInternal(array $data)
  7104.     {
  7105.         $user = $this->currenUser;
  7106.         $req=['instruction','user','priority','type','files','mail_id','date','cotation','cotation_file'];
  7107.         foreach ($req as $val)
  7108.         {
  7109.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  7110.         }
  7111.         $mail = $this->em->getRepository(Courrier::class)->findOneBy(['id'=>$data['mail_id']]);
  7112.         if($mail === null) return ["message"=>'related mail not found',"statut"=>false,"code"=>""];
  7113.         if(!in_array($mail->getStatut(),[Courrier::STATUT_EN_COURS,Courrier::STATUT_NOUVEAU]) ) return ["message"=>$this->container->get('translator')->trans("operation_denied"),"statut"=>false,"code"=>""];
  7114.         $u = $this->em->getRepository(User::class)->findOneBy(['id'=>$data['user']]);
  7115.         if($u === null) return ["message"=>$this->container->get('translator')->trans("user_not_found"),"statut"=>false,"code"=>""];
  7116.         $pri = $this->em->getRepository(Priorite::class)->findOneBy(['id'=>$data['priority']]);
  7117.         if($pri === null) return ["message"=>'priority not found',"statut"=>false,"code"=>""];
  7118.         $type = $this->em->getRepository(TypeTache::class)->findOneBy(['id'=>$data['type']]);
  7119.         if($type === null) return ["message"=>'Task type not found',"statut"=>false,"code"=>""];
  7120.         $task = new Tache();
  7121.         $task->setUser($u);
  7122.         $task->setCourrier($mail);
  7123.         $task->setEmetteur($user);
  7124.         $task->setInstruction($data['instruction']);
  7125.         try {
  7126.             $task->setDateButtoir(\DateTime::createFromFormat('d/m/Y',$data["date"]));
  7127.         } catch (\Exception $e) {
  7128.             return ["message"=>$e->getMessage(),"statut"=>false,"code"=>""];
  7129.         }
  7130.         $task->setPriorite($pri);
  7131.         $task->setTypeTache($type);
  7132.         $task->setCode(uniqid('TA-', true));
  7133.         if($user->getId()===$u->getId()){
  7134.             $task->setStatut(Tache::STATUT_EN_COURS);
  7135.         }
  7136.         foreach ($data['files'] as $f){
  7137.             $file = new Fichier();
  7138.             $file->setNom($f['name']);
  7139.             $file->setFolderNameAndName($task->getInstruction()." | ". $f["name"]);
  7140.             $file->setExtension($f['extension']);
  7141.             $file->setType($f['type']);
  7142.             $file->setTaille($f['size']);
  7143.             $file->setPath($f['path']);
  7144.             $file->setAuteur($user->getNom()." ".$user->getPrenom());
  7145.             $file->setTache($task);
  7146.             $task->addFichier($file);
  7147.         }
  7148.         if($data['cotation']==1){
  7149.             $task->setHasMailFile(true);
  7150.         }else{
  7151.             if($data['cotation_file']==1){
  7152.                 $task->setHasMailFile(true);
  7153.             }
  7154.         }
  7155.         $courCol = null;
  7156.         $alreadyCourCol = false;
  7157.         if($user->getId()!==$u->getId()){
  7158.             $courColAll = $this->em->getRepository(CourrierCollaborateur::class)->findBy(['courrier'=>$mail]);
  7159.             if(count($courColAll)===0){
  7160.                 $courCol = new CourrierCollaborateur();
  7161.                 $courCol->setCourrier($mail);
  7162.                 $courCol->setUser($u);
  7163.                 if($data['cotation'] == 1){
  7164.                     $courCol->setCotation(true);
  7165.                     $courCol->setStatut(true);
  7166.                 }
  7167.                 $this->em->persist($courCol);
  7168.             }
  7169.             else{
  7170.                 $courCol= $this->em->getRepository(CourrierCollaborateur::class)->findOneBy(['courrier'=>$mail,'user'=>$u]);
  7171.                 if($courCol === null){
  7172.                     $courCol = new CourrierCollaborateur();
  7173.                     $courCol->setCourrier($mail);
  7174.                     $courCol->setUser($u);
  7175.                     if($data['cotation'] == 1){
  7176.                         $courCol->setCotation(true);
  7177.                         $courCol->setStatut(true);
  7178.                     }
  7179.                     $this->em->persist($courCol);
  7180.                 }
  7181.                 else{
  7182.                     $alreadyCourCol = true;
  7183.                 }
  7184.             }
  7185.             $notif = new Notification();
  7186.             $notif->setUser($user);
  7187.             $notif->setTache($task);
  7188.             $notif->setCode(Notification::NEW_TASK);
  7189.             if($data['cotation'] == 1){
  7190.                 $notif->setCode(Notification::MAIL_COTATION);
  7191.             }
  7192.             $status = new Statut();
  7193.             $status->setNotification($notif);
  7194.             $status->setUser($u);
  7195.             $notif->addStatut($status);
  7196.             $this->em->persist($notif);
  7197.         }
  7198.         $this->em->persist($task);
  7199.         $this->em->flush();
  7200.         $log = new Log();
  7201.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'1002'));
  7202.         if($operation !== null)
  7203.         {
  7204.             $log->setOperation($operation);
  7205.             $log->setUser($this->currenUser);
  7206.             $log->setObservation($task->getId());
  7207.             $this->em->persist($log);
  7208.             $this->em->flush();
  7209.         }
  7210.         if($alreadyCourCol == false){
  7211.             if($courCol !== null){
  7212.                 $sta = $courCol->getStatut();
  7213.                 $id = $courCol->getId();
  7214.                 $courCol = $courCol->getUser()->getMiniArray();
  7215.                 $courCol['collabo_status'] = $sta;
  7216.                 $courCol['collabo_id'] = $id;
  7217.             }
  7218.         }
  7219.         else{
  7220.             $courCol = null;
  7221.         }
  7222.         return ["message"=>"","statut"=>true,"data"=>['tache'=>$task->toArray(),'collabo'=>$courCol]];
  7223.     }
  7224.     /**
  7225.      * Create a single task (public interface)
  7226.      * Delegates to createTaskInternal()
  7227.      *
  7228.      * @param array $data Task data
  7229.      * @return array Result with task data or error
  7230.      */
  7231.     public function createTask(array $data){
  7232.         return $this->createTaskInternal($data);
  7233.     }
  7234.     /**
  7235.      * Create multiple tasks in a single atomic transaction
  7236.      * All tasks succeed together or fail together (no partial creation)
  7237.      *
  7238.      * @param array $tasksData Array of task data objects
  7239.      * @return array Result with created tasks or error
  7240.      */
  7241.     public function createMultipleTasks(array $tasksData)
  7242.     {
  7243.         $createdTasks = [];
  7244.         // Start transaction for atomicity
  7245.         $this->em->getConnection()->beginTransaction();
  7246.         try {
  7247.             foreach ($tasksData as $index => $taskData) {
  7248.                 // Create task using internal method
  7249.                 $result = $this->createTaskInternal($taskData);
  7250.                 if ($result["statut"] == false) {
  7251.                     throw new \Exception("Task " . ($index + 1) . ": " . $result["message"]);
  7252.                 }
  7253.                 $createdTasks[] = $result;
  7254.             }
  7255.             // Commit transaction if all tasks created successfully
  7256.             $this->em->getConnection()->commit();
  7257.             return [
  7258.                 "message" => $this->container->get('translator')->trans("operation_done"),
  7259.                 "statut" => true,
  7260.                 "data" => [
  7261.                     "created_tasks" => $createdTasks,
  7262.                     "count" => count($createdTasks)
  7263.                 ]
  7264.             ];
  7265.         } catch (\Exception $e) {
  7266.             // Rollback transaction on any error
  7267.             $this->em->getConnection()->rollBack();
  7268.             return [
  7269.                 "message" => $e->getMessage(),
  7270.                 "statut" => false,
  7271.                 "code" => ""
  7272.             ];
  7273.         }
  7274.     }
  7275.     public function updateMailManager(array $data){
  7276.         $user = $this->currenUser;
  7277.         $req=['collabo_id'];
  7278.         foreach ($req as $val)
  7279.         {
  7280.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  7281.         }
  7282.         $collabo = $this->em->getRepository(CourrierCollaborateur::class)->findOneBy(['id'=>$data['collabo_id']]);
  7283.         if($collabo === null) return ["message"=>$this->container->get('translator')->trans("user_not_found"),"statut"=>false,"code"=>""];
  7284.         $mail = $collabo->getCourrier();
  7285.         if($mail->getStatut()!== Courrier::STATUT_EN_COURS) return ["message"=>$this->container->get('translator')->trans("operation_denied"),"statut"=>false,"code"=>""];
  7286.         if($user->getId() !== $mail->getDestinataire()->getId()){
  7287.             return ["message"=>$this->container->get('translator')->trans("operation_denied"),"statut"=>false,"code"=>""];
  7288.         }
  7289.         $allCollabo = $this->em->getRepository(CourrierCollaborateur::class)->findBy(['courrier'=>$mail]);
  7290.         $all=[];
  7291.         foreach ($allCollabo as $c){
  7292.             if($c->getId() === $collabo->getId()){
  7293.                 $collabo->setStatut(true);
  7294.                 $c->setStatut(true);
  7295.                 $this->em->persist($collabo);
  7296.             }
  7297.             else{
  7298.                 if($c->getStatut()===true){
  7299.                     $c->setStatut(false);
  7300.                     $this->em->persist($c);
  7301.                 }
  7302.             }
  7303.             $all[]=$c->toArray();
  7304.         }
  7305.         $this->em->flush();
  7306.         return ["message"=>'',"data"=>$all, "statut"=>true,"code"=>201];
  7307.     }
  7308.     public function mailAction(array $data){
  7309.         $user = $this->currenUser;
  7310.         $req=['id','action'];
  7311.         foreach ($req as $val)
  7312.         {
  7313.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  7314.         }
  7315.         if(!in_array($data['action'],['end','order','archive','open'])){
  7316.             return ["message"=>"bad action","statut"=>false,"code"=>""];
  7317.         }
  7318.         if ($data['action'] === 'archive'){
  7319.             if(!array_key_exists('place',$data)) return ["message"=>"place field is required","statut"=>false,"code"=>""];
  7320.         }
  7321.         $mail = $this->em->getRepository(Courrier::class)->findOneBy(['id'=>$data['id']]);
  7322.         if($mail === null) return ["message"=>"mail not found","statut"=>false,"code"=>""];
  7323.         if($mail->getDestinataire()->getId() !== $user->getId())
  7324.         {
  7325.             return ["message"=>$this->container->get('translator')->trans("operation_denied"),"statut"=>false,"code"=>""];
  7326.         }
  7327.         if($data['action'] === 'end'){
  7328.             $mail->setStatut(Courrier::STATUT_EN_TERMINE);
  7329.             $mail->setDateCloture(new \DateTime());
  7330.             $this->em->persist($mail);
  7331.             $tasks = $this->em->getRepository(Tache::class)->findBy(['courrier'=>$mail]);
  7332.             foreach ($tasks as $t){
  7333.                 if(in_array($t->getStatut(),[ Tache::STATUT_EN_COURS,Tache::STATUT_NOUVEAU])){
  7334.                     $t->setStatut(Tache::STATUT_EN_TERMINE);
  7335.                     $t->setDateFin(new \DateTime());
  7336.                     $this->em->persist($t);
  7337.                 }
  7338.             }
  7339.             $allCollabo = $this->em->getRepository(CourrierCollaborateur::class)->findBy(['courrier'=>$mail]);
  7340.             $notif = new Notification();
  7341.             $notif->setUser($user);
  7342.             $notif->setCourrier($mail);
  7343.             $notif->setCode(Notification::MAIL_ENDED);
  7344.             foreach ($allCollabo as $co){
  7345.                 $status = new Statut();
  7346.                 $status->setNotification($notif);
  7347.                 $status->setUser($co->getUser());
  7348.                 $notif->addStatut($status);
  7349.             }
  7350.             $this->em->persist($notif);
  7351.         }
  7352.         else if($data['action'] === 'open'){
  7353.             $mail->setStatut(Courrier::STATUT_EN_COURS);
  7354.             $mail->setDateCloture(null);
  7355.             $this->em->persist($mail);
  7356.             $allCollabo = $this->em->getRepository(CourrierCollaborateur::class)->findBy(['courrier'=>$mail]);
  7357.             $notif = new Notification();
  7358.             $notif->setUser($user);
  7359.             $notif->setCourrier($mail);
  7360.             $notif->setCode(Notification::MAIL_REOPEN);
  7361.             foreach ($allCollabo as $co){
  7362.                 $status = new Statut();
  7363.                 $status->setNotification($notif);
  7364.                 $status->setUser($co->getUser());
  7365.                 $notif->addStatut($status);
  7366.             }
  7367.             $this->em->persist($notif);
  7368.         }
  7369.         else if($data['action'] === 'order'){
  7370.             $mail->setStatut(Courrier::STATUT_RANGE);
  7371.             $this->em->persist($mail);
  7372.         }
  7373.         else{
  7374.             $mail->setStatut(Courrier::STATUT_ARCHIVE);
  7375.             $mail->setArchive($data['place']);
  7376.             $this->em->persist($mail);
  7377.         }
  7378.         $this->em->flush();
  7379.         return ['message'=>'','data'=>$mail->toArray(),'statut'=>true,'code'=>201];
  7380.     }
  7381.     public function getOneTask(array $data)
  7382.     {
  7383.         if(!array_key_exists("id",$data))
  7384.         {
  7385.             return ["message"=>"id is missing","statut"=>false,"data"=>[],"code"=>401];
  7386.         }
  7387.         else
  7388.         {
  7389.             $task = $this->em->getRepository(Tache::class)->findOneBy(array("id"=>$data["id"]));
  7390.             if($task === null) return ["message"=>"Tache not found","statut"=>false,"data"=>[],"code"=>401];
  7391.             else
  7392.             {
  7393.                 $files = $this->em->getRepository(Fichier::class)->findBy(array("tache"=>$task,"isActive"=>true));
  7394.                 $res=[];
  7395.                 foreach ($files as $f)
  7396.                 {
  7397.                     $res[]=$f->toArray();
  7398.                 }
  7399.                 $mail = $task->getCourrier();
  7400.                 $mailFiles = [];
  7401.                 if($this->currentUser->getId() == $task->getEmetteur()->getId() || $task->isHasMailFile()){
  7402.                     $mailFiles = $this->em->getRepository(Fichier::class)->findBy(array("courrier"=>$mail,"isActive"=>true));
  7403.                 }else{
  7404.                     $collabo = $this->em->getRepository(CourrierCollaborateur::class)->findOneBy(["courrier"=>$mail,"user"=>$this->currentUser]);
  7405.                     if($collabo != null && $collabo->getCotation()){
  7406.                         $mailFiles = $this->em->getRepository(Fichier::class)->findBy(array("courrier"=>$mail,"isActive"=>true));
  7407.                     }
  7408.                 }
  7409.                 $resMain=[];
  7410.                 foreach ($mailFiles as $f)
  7411.                 {
  7412.                     $resMain[]=$f->toArray();
  7413.                 }
  7414.                 $attachedFile = $mail->getPieceJointeAjoutees();
  7415.                 $attachedFileTab = [];
  7416.                 foreach ($attachedFile as $item){
  7417.                     $attachedFileTab[]=$item->toArray();
  7418.                 }
  7419.                 if($task->getStatut()=== Tache::STATUT_NOUVEAU){
  7420.                     if($this->currenUser->getId() === $task->getUser()->getId()){
  7421.                         $task->setStatut(Courrier::STATUT_EN_COURS);
  7422.                         $this->em->persist($task);
  7423.                         $this->em->flush();
  7424.                     }
  7425.                 }
  7426.                 return ["message"=>"","statut"=>true,"data"=>['task'=>$task->toArray(),'files'=>$res,'main_files'=>$resMain,"attached_files"=>$attachedFileTab],"code"=>201];
  7427.             }
  7428.         }
  7429.     }
  7430.     public function endTask(array $data)
  7431.     {
  7432.         $user = $this->currenUser;
  7433.         if(!array_key_exists("id",$data))
  7434.         {
  7435.             return ["message"=>"id is missing","statut"=>false,"data"=>[],"code"=>401];
  7436.         }
  7437.         if(!array_key_exists("observation",$data))
  7438.         {
  7439.             return ["message"=>"observation is missing","statut"=>false,"data"=>[],"code"=>401];
  7440.         }
  7441.         $task = $this->em->getRepository(Tache::class)->findOneBy(array("id"=>$data["id"]));
  7442.         if($task === null) return ["message"=>"Tache not found","statut"=>false,"data"=>[],"code"=>401];
  7443.         if($task->getUser()->getId() !== $user->getId() ) {
  7444.             return ["message"=>$this->container->get('translator')->trans("operation_denied"),"statut"=>false,"code"=>""];
  7445.         }
  7446.         $task->setStatut(Tache::STATUT_EN_TERMINE);
  7447.         $task->setObservation($data['observation']);
  7448.         $task->setDateFin(new \DateTime());
  7449.         $notif = new Notification();
  7450.         $notif->setUser($user);
  7451.         $notif->setTache($task);
  7452.         $notif->setCode(Notification::TASK_END);
  7453.         $status = new Statut();
  7454.         $status->setNotification($notif);
  7455.         $status->setUser($task->getEmetteur());
  7456.         $notif->addStatut($status);
  7457.         $this->em->persist($notif);
  7458.         $this->em->persist($task);
  7459.         $this->em->flush();
  7460.         $log = new Log();
  7461.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'1004'));
  7462.         if($operation !== null)
  7463.         {
  7464.             $log->setOperation($operation);
  7465.             $log->setUser($this->currenUser);
  7466.             $log->setObservation($task->getId());
  7467.             $this->em->persist($log);
  7468.             $this->em->flush();
  7469.         }
  7470.         return ["message"=>"","statut"=>true,"data"=>$task->toArray(),"code"=>201];
  7471.     }
  7472.     public function addTaskFile(array $data)
  7473.     {
  7474.         $user = $this->currenUser;
  7475.         if(!array_key_exists("file",$data))
  7476.         {
  7477.             return ["message"=>"file is missing","statut"=>false,"data"=>[],"code"=>401];
  7478.         }
  7479.         if(!array_key_exists("id",$data))
  7480.         {
  7481.             return ["message"=>"id is missing","statut"=>false,"data"=>[],"code"=>401];
  7482.         }
  7483.         $task = $this->em->getRepository(Tache::class)->findOneBy(array("id"=>$data["id"]));
  7484.         if($task === null) return ["message"=>"Tache not found","statut"=>false,"data"=>[],"code"=>401];
  7485.         if($task->getUser()->getId() !== $user->getId() ) {
  7486.             return ["message"=>$this->container->get('translator')->trans("operation_denied"),"statut"=>false,"code"=>""];
  7487.         }
  7488.         if($task->getStatut() === Tache::STATUT_EN_TERMINE)
  7489.         {
  7490.             return ["message"=>$this->container->get('translator')->trans("operation_denied"),"statut"=>false,"code"=>""];
  7491.         }
  7492.         $file = new Fichier();
  7493.         $file->setNom($data['file']['name']);
  7494.         $file->setFolderNameAndName($task->getInstruction()." | ". $data['file']["name"]);
  7495.         $file->setExtension($data['file']['extension']);
  7496.         $file->setType($data['file']['type']);
  7497.         $file->setTaille($data['file']['size']);
  7498.         $file->setPath($data['file']['path']);
  7499.         $file->setAuteur($user->getNom()." ".$user->getPrenom());
  7500.         $file->setTache($task);
  7501.         $task->addFichier($file);
  7502.         $this->em->persist($task);
  7503.         $this->em->flush();
  7504.         $log = new Log();
  7505.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'1006'));
  7506.         if($operation !== null)
  7507.         {
  7508.             $log->setOperation($operation);
  7509.             $log->setUser($this->currenUser);
  7510.             $log->setObservation($task->getId());
  7511.             $this->em->persist($log);
  7512.             $this->em->flush();
  7513.         }
  7514.         return ["message"=>"","statut"=>true,"data"=>$file->toArray(),"code"=>201];
  7515.     }
  7516.     public function  getStatisticMail(array $data)
  7517.     {
  7518.         if(!array_key_exists("start_date",$data)) return ["message"=>"start_date field is required","statut"=>false,"code"=>401];
  7519.         if(!array_key_exists("end_date",$data)) return ["message"=>"end_date field is required","statut"=>false,"code"=>401];
  7520.         if(!array_key_exists("type_filter",$data)) return ["message"=>"type_filter field is required","statut"=>false,"code"=>401];
  7521.         if(!array_key_exists("type",$data)) return ["message"=>"type field is required","statut"=>false,"code"=>401];
  7522.         $s = \DateTime::createFromFormat('d.m.Y',$data["start_date"])->format("Y-m-d");
  7523.         $e = \DateTime::createFromFormat('d.m.Y',$data["end_date"])->format("Y-m-d");
  7524.         $res=[];
  7525.         switch ($data["type"])
  7526.         {
  7527.             case 1:
  7528.                 //pyramide des états
  7529.                 $mailIn = $this->em->getRepository(Courrier::class)->findStatSimple($s,$e, Courrier::COURRIER_ENTRANT);
  7530.                 $totalIn = count($mailIn);
  7531.                 $doneIn=0;
  7532.                 $awaitIn=0;
  7533.                 foreach ($mailIn as $m)
  7534.                 {
  7535.                     if($m->getStatut()>=2){
  7536.                         $doneIn  ++;
  7537.                     }
  7538.                     else{
  7539.                         $awaitIn ++;
  7540.                     }
  7541.                 }
  7542.                 if($totalIn==0){
  7543.                     $res=[
  7544.                         ["name"=>$this->container->get('translator')->trans("mail_incoming_treated"),"value"=>0],
  7545.                         ["name"=>$this->container->get('translator')->trans("mail_incoming_untreated"),"value"=>0]];
  7546.                 }
  7547.                 else{
  7548.                     $res=[
  7549.                         ["name"=>$this->container->get('translator')->trans("mail_incoming_treated"),"value"=>round($doneIn/$totalIn,4)*100],
  7550.                         ["name"=>$this->container->get('translator')->trans("mail_incoming_untreated"),"value"=>round($awaitIn/$totalIn,4)*100]];
  7551.                 }
  7552.                 break;
  7553.             case 2:
  7554.                 //courbe de versement
  7555.                 $mailIn = $this->em->getRepository(Courrier::class)->findStatSimple($s,$e, Courrier::COURRIER_ENTRANT);
  7556.                 $mailOut = $this->em->getRepository(Courrier::class)->findStatSimple($s,$e, Courrier::COURRIER_SORTANT);
  7557.                 $res=[];
  7558.                 $typesIn=[];
  7559.                 $typesOut=[];
  7560.                 $dates=$this->getDatesFromRange($s, $e);
  7561.                 foreach ($dates as $t)
  7562.                 {
  7563.                     $typesIn[$t]=0;
  7564.                     $typesOut[$t]=0;
  7565.                 }
  7566.                 foreach ($mailIn as $d)
  7567.                 {
  7568.                     $typesIn[$d->getDate()->format("Y-m-d")]++;
  7569.                 }
  7570.                 foreach ($mailOut as $d)
  7571.                 {
  7572.                     $typesOut[$d->getDate()->format("Y-m-d")]++;
  7573.                 }
  7574.                 $tabIn[]=$this->container->get('translator')->trans('mail_incoming');
  7575.                 $tabOut[]=$this->container->get('translator')->trans('mail_outgoing');
  7576.                 foreach ($dates as $t)
  7577.                 {
  7578.                     $tabIn[] =  $typesIn[$t];
  7579.                     $tabOut[] =  $typesOut[$t];
  7580.                 }
  7581.                 $tabInFinal[]=$this->container->get('translator')->trans('mail_incoming');
  7582.                 $tabOutFinal[]=$this->container->get('translator')->trans('mail_outgoing');
  7583.                 $tabDateFinal[]='Dates';
  7584.                 foreach ($dates as $t)
  7585.                 {
  7586.                     if($typesIn[$t] !=0 || $typesOut[$t]!=0 ){
  7587.                         $tabDateFinal[]=$t;
  7588.                         $tabInFinal[]=$typesIn[$t];
  7589.                         $tabOutFinal[]=$typesOut[$t];
  7590.                     }
  7591.                 }
  7592.                 $res["data_in"]=$tabInFinal;
  7593.                 $res["data_out"]=$tabOutFinal;
  7594.                 $res["dates"]=$tabDateFinal;
  7595.                 break;
  7596.             case 3:
  7597.                 //disque des courriers
  7598.                 $folders= $this->em->getRepository(Courrier::class)->findStatSimple($s,$e, Courrier::COURRIER_ENTRANT);
  7599.                 $types=[];
  7600.                 $in=[];
  7601.                 $aty=[];
  7602.                 foreach ($folders as $d)
  7603.                 {
  7604.                     if(!in_array($d->getTypeCourrier()->getId(),$in))
  7605.                     {
  7606.                         $in[]=$d->getTypeCourrier()->getId();
  7607.                         $types[$d->getTypeCourrier()->getCode()]=1;
  7608.                         $aty[$d->getTypeCourrier()->getCode()]=$d->getTypeCourrier()->getNomFr();
  7609.                     }
  7610.                     else
  7611.                     {
  7612.                         $types[$d->getTypeCourrier()->getCode()]++;
  7613.                     }
  7614.                 }
  7615.                 $res=[];
  7616.                 foreach ($aty as $k => $v)
  7617.                 {
  7618.                     $res[]=[$v,$types[$k]];
  7619.                 }
  7620.                 break;
  7621.             case 4:
  7622.                 //Courbe des recherches
  7623.                 break;
  7624.             case 5:
  7625.                 //courriers traité dans les délais
  7626.                 $folders= $this->em->getRepository(Courrier::class)->findStatSimpleTreated($s,$e, Courrier::COURRIER_ENTRANT);
  7627.                 $types[$this->container->get('translator')->trans("in_time")]=0;
  7628.                 $types[$this->container->get('translator')->trans("out_time")]=0;
  7629.                 foreach ($folders as $d)
  7630.                 {
  7631.                     $ext = $d->getDate();
  7632.                     $end = $d->getDateCloture();
  7633.                     $pri = $d->getPriorite();
  7634.                     switch ($pri->getType()){
  7635.                         case Priorite::PRI_DAY:
  7636.                             $p ='P'.$pri->getDelais().'D';
  7637.                             $ext->add(new \DateInterval($p));
  7638.                             break;
  7639.                         case Priorite::PRI_WEEK:
  7640.                             $p ='P'.($pri->getDelais()*7).'D';
  7641.                             $ext->add(new \DateInterval($p));
  7642.                             break;
  7643.                         case Priorite::PRI_MONTH:
  7644.                             $p ='P'.$pri->getDelais().'M';
  7645.                             $ext->add(new \DateInterval($p));
  7646.                             break;
  7647.                     }
  7648.                     if($end>=$ext){
  7649.                         $types[$this->container->get('translator')->trans("out_time")]++;
  7650.                     }else{
  7651.                         $types[$this->container->get('translator')->trans("in_time")]++;
  7652.                     }
  7653.                 }
  7654.                 $res[]=[$this->container->get('translator')->trans("in_time"),$types[$this->container->get('translator')->trans("in_time")]];
  7655.                 $res[]=[$this->container->get('translator')->trans("out_time"),$types[$this->container->get('translator')->trans("out_time")]];
  7656.                 break;
  7657.             case 6:
  7658.                 //pyramide des tâches
  7659.                 $mailIn = $this->em->getRepository(Tache::class)->findStatSimple($s,$e);
  7660.                 $totalIn = count($mailIn);
  7661.                 $doneIn=0;
  7662.                 $awaitIn=0;
  7663.                 foreach ($mailIn as $m)
  7664.                 {
  7665.                     if($m->getStatut()>1){
  7666.                         $doneIn  ++;
  7667.                     }
  7668.                     else{
  7669.                         $awaitIn ++;
  7670.                     }
  7671.                 }
  7672.                 if($totalIn==0){
  7673.                     $res=[
  7674.                         ["name"=>$this->container->get('translator')->trans("task_treated"),"value"=>0],
  7675.                         ["name"=>$this->container->get('translator')->trans("task_in_progress"),"value"=>0]];
  7676.                 }
  7677.                 else{
  7678.                     $res=[
  7679.                         ["name"=>$this->container->get('translator')->trans("task_treated"),"value"=>round($doneIn/$totalIn,4)*100],
  7680.                         ["name"=>$this->container->get('translator')->trans("task_in_progress"),"value"=>round($awaitIn/$totalIn,4)*100]];
  7681.                 }
  7682.                 break;
  7683.             case 7:
  7684.                 // tâches effectuées dans les délais
  7685.                 $folders= $this->em->getRepository(Tache::class)->findStatSimpleTreated($s,$e);
  7686.                 $types[$this->container->get('translator')->trans("in_time")]=0;
  7687.                 $types[$this->container->get('translator')->trans("out_time")]=0;
  7688.                 foreach ($folders as $d)
  7689.                 {
  7690.                     $ext = $d->getDateButtoir();
  7691.                     $end = $d->getDateFin();
  7692.                     if($end>$ext){
  7693.                         $types[$this->container->get('translator')->trans("out_time")]++;
  7694.                     }else{
  7695.                         $types[$this->container->get('translator')->trans("in_time")]++;
  7696.                     }
  7697.                 }
  7698.                 $res[]=[$this->container->get('translator')->trans("in_time"),$types[$this->container->get('translator')->trans("in_time")]];
  7699.                 $res[]=[$this->container->get('translator')->trans("out_time"),$types[$this->container->get('translator')->trans("out_time")]];
  7700.                 break;
  7701.             default:
  7702.                 break;
  7703.         }
  7704.         /* if(!is_null($operation))
  7705.          {
  7706.              $log->setOperation($operation);
  7707.              $log->setUser($this->currenUser);
  7708.              $this->em->persist($log);
  7709.              $this->em->flush();
  7710.          }*/
  7711.         return ["message"=>"operation_done","data"=>$res, "statut"=>true,"code"=>201];
  7712.     }
  7713.     public function getMonitoring(array $data){
  7714.         if(!array_key_exists("start_date",$data)) return ["message"=>"start_date field is required","statut"=>false,"code"=>401];
  7715.         if(!array_key_exists("end_date",$data)) return ["message"=>"end_date field is required","statut"=>false,"code"=>401];
  7716.         if(!array_key_exists("type",$data)) return ["message"=>"type field is required","statut"=>false,"code"=>401];
  7717.         $s = \DateTime::createFromFormat('d.m.Y',$data["start_date"])->format("Y-m-d");
  7718.         $e = \DateTime::createFromFormat('d.m.Y',$data["end_date"])->format("Y-m-d");
  7719.         $res=[];
  7720.         switch ($data['type']){
  7721.             case 1:
  7722.                 $mail = $this->em->getRepository(Courrier::class)->findStatSimpleNonRead($s,$e);
  7723.                 foreach ($mail as $m){
  7724.                     $res[]=$m->toArray();
  7725.                 }
  7726.                 break;
  7727.             case 2:
  7728.                 $mail = $this->em->getRepository(Courrier::class)->findStatSimpleOutTime($s,$e);
  7729.                 $end = new \DateTime();
  7730.                 foreach ($mail as $m){
  7731.                     $ext = clone $m->getDate();
  7732.                     $pri = $m->getPriorite();
  7733.                     switch ($pri->getType()){
  7734.                         case Priorite::PRI_DAY:
  7735.                             $p ='P'.$pri->getDelais().'D';
  7736.                             $ext->add(new \DateInterval($p));
  7737.                             break;
  7738.                         case Priorite::PRI_WEEK:
  7739.                             $p ='P'.($pri->getDelais()*7).'D';
  7740.                             $ext->add(new \DateInterval($p));
  7741.                             break;
  7742.                         case Priorite::PRI_MONTH:
  7743.                             $p ='P'.$pri->getDelais().'M';
  7744.                             $ext->add(new \DateInterval($p));
  7745.                             break;
  7746.                     }
  7747.                     if($end>$ext){
  7748.                         $el = $m->toArray();
  7749.                         //$dif = $end->diff($ext);
  7750.                         $dif = $end->diff($ext,true);
  7751.                         if($dif->days>0){
  7752.                             $el['exceed'] = $dif->days;
  7753.                             $res[]=$el;
  7754.                         }
  7755.                     }
  7756.                 }
  7757.                 break;
  7758.             case 3:
  7759.                 $tasks = $this->em->getRepository(Tache::class)->findStatSimpleNotRead($s,$e);
  7760.                 foreach ($tasks as $t){
  7761.                     $res[] = $t->toArray();
  7762.                 }
  7763.                 break;
  7764.             case 5:
  7765.                 $tasks = $this->em->getRepository(Tache::class)->findStatSimpleOutTime($s,$e);
  7766.                 $end = new \DateTime();
  7767.                 foreach ($tasks as $m){
  7768.                     /*var_dump($m->getInstruction());
  7769.                     var_dump($m->getDateButtoir()->format('Y-m-d'));
  7770.                     var_dump($end->format('Y-m-d'));*/
  7771.                     $ext = $m->getDateButtoir();
  7772.                     if($end>$ext){
  7773.                         $el = $m->toArray();
  7774.                         //$dif = $end->diff($ext);
  7775.                         $dif = $end->diff($ext,true);
  7776.                         if($dif->days>0){
  7777.                             $el['exceed'] = $dif->days;
  7778.                             $res[]=$el;
  7779.                         }
  7780.                     }
  7781.                 }
  7782.                 break;
  7783.         }
  7784.         return ["message"=>"operation_done","data"=>$res, "statut"=>true,"code"=>201];
  7785.     }
  7786.     public function notifiedRelaunch(array $data){
  7787.         if(!array_key_exists("type",$data)) return ["message"=>"type field is required","statut"=>false,"code"=>401];
  7788.         if(!array_key_exists("motif",$data)) return ["message"=>"motif field is required","statut"=>false,"code"=>401];
  7789.         if(!array_key_exists("id",$data)) return ["message"=>"id field is required","statut"=>false,"code"=>401];
  7790.         if(!in_array($data['type'],[0,1])) return ["message"=>"bad type field ","statut"=>false,"code"=>401];
  7791.         if(!in_array($data['motif'],[0,1])) return ["message"=>"bad motif field ","statut"=>false,"code"=>401];
  7792.         if($data['type'] == 0){
  7793.             $elt = $this->em->getRepository(Courrier::class)->findOneBy(['id'=>$data['id']]);
  7794.         }
  7795.         else{
  7796.             $elt = $this->em->getRepository(Tache::class)->findOneBy(['id'=>$data['id']]);
  7797.         }
  7798.         if($elt === null) return ["message"=>"item not found","statut"=>false,"code"=>401];
  7799.         $relance = $elt->getRelance();
  7800.         if($relance !== null){
  7801.             $relance->setDate(new \DateTime());
  7802.             if($data['motif'] == 0){
  7803.                 $relance->setNonLu($relance->getNonLu()+1);
  7804.             }
  7805.             else{
  7806.                 $relance->setNonTraite($relance->getNonTraite()+1);
  7807.             }
  7808.             $elt->setRelance($relance);
  7809.         }
  7810.         else{
  7811.             $relance = new Relance();
  7812.             $relance->setUser($this->currenUser);
  7813.             if($data['motif'] == 0){
  7814.                 $relance->setNonLu(1);
  7815.             }
  7816.             else{
  7817.                 $relance->setNonTraite(1);
  7818.             }
  7819.             if($data['type'] == 0){
  7820.                 $relance->setCourrier($elt);
  7821.                 $relance->setType(Relance::RELANCE_COURRIER);
  7822.             }
  7823.             else{
  7824.                 $relance->setTache($elt);
  7825.                 $relance->setType(Relance::RELANCE_TACHE);
  7826.             }
  7827.             $elt->setRelance($relance);
  7828.         }
  7829.         $notif = new Notification();
  7830.         $notif->setRelance($relance);
  7831.         $notif->setUser($this->currenUser);
  7832.         $notif->setCode(Notification::RELAUNCH);
  7833.         $statut = new Statut();
  7834.         $statut->setNotification($notif);
  7835.         if($data['type'] == 0){
  7836.             $notif->setCourrier($elt);
  7837.             $statut->setUser($elt->getDestinataire());
  7838.         }
  7839.         else{
  7840.             $notif->setTache($elt);
  7841.             $statut->setUser($elt->getUser());
  7842.         }
  7843.         $notif->addStatut($statut);
  7844.         $this->em->persist($notif);
  7845.         $this->em->persist($elt);
  7846.         $this->em->flush();
  7847.         return ["message"=>"operation_done","data"=>$elt->toArray(), "statut"=>true,"code"=>201];
  7848.     }
  7849.     public function generateReferenceMail($data)
  7850.     {
  7851.         if(!array_key_exists('key',$data)) return ["message"=>"key field is required","statut"=>false,"code"=>""];
  7852.         $ref=$data['key'];
  7853.         $date = new \DateTime();
  7854.         $ref = strtoupper(uniqid($ref.$date->format("Y"), false));
  7855.         return ["message"=>"","statut"=>true,"data"=>$ref];
  7856.     }
  7857.     public function allUserExecptAdmin(array $data)
  7858.     {
  7859.         $users = $this->em->getRepository(User::class)->loadAllUsersExecptAdmin();
  7860.         $tab = [];
  7861.         foreach ($users as $u){
  7862.             $tab[]=$u->toArray();
  7863.         }
  7864.         return ["message"=>"","statut"=>true,"data"=>$tab];
  7865.     }
  7866.     public function createTypeCourrier(array $data)
  7867.     {
  7868.         $req=["nom_fr","nom_en","code","attached_file"];
  7869.         foreach ($req as $val)
  7870.         {
  7871.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  7872.             else
  7873.             {
  7874.                 if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  7875.             }
  7876.         }
  7877.         $t = new TypeCourrier();
  7878.         $t->setNomEn($data["nom_en"]);
  7879.         $t->setNomFr($data["nom_fr"]);
  7880.         $t->setCode($data["code"]);
  7881.         $t->setPossedePieceJointe($data["attached_file"]);
  7882.         $this->em->persist($t);
  7883.         $this->em->flush();
  7884.         return ["message"=>"","statut"=>true,"data"=>$t->toArray()];
  7885.     }
  7886.     public function createPieceJointe(array $data)
  7887.     {
  7888.         $req=["nom_fr","nom_en","mail_type_id"];
  7889.         foreach ($req as $val)
  7890.         {
  7891.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  7892.             else
  7893.             {
  7894.                 if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  7895.             }
  7896.         }
  7897.         $mailType = $this->em->getRepository(TypeCourrier::class)->findOneBy(['id'=>$data['mail_type_id']]);
  7898.         if($mailType === null){
  7899.             return ["message"=>"mail type not found","statut"=>false,"data"=>[]];
  7900.         }
  7901.         $t = new PieceJointe();
  7902.         $t->setNomEn($data["nom_en"]);
  7903.         $t->setNomFr($data["nom_fr"]);
  7904.         $t->setTypeCourrier($mailType);
  7905.         $this->em->persist($t);
  7906.         $this->em->flush();
  7907.         return ["message"=>"","statut"=>true,"data"=>$t->toArray()];
  7908.     }
  7909.     public function createTypeTache(array $data)
  7910.     {
  7911.         $req=["nom_fr","nom_en","code"];
  7912.         foreach ($req as $val)
  7913.         {
  7914.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  7915.             else
  7916.             {
  7917.                 if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  7918.             }
  7919.         }
  7920.         $t = new TypeTache();
  7921.         $t->setNomEn($data["nom_en"]);
  7922.         $t->setNomFr($data["nom_fr"]);
  7923.         $t->setCode($data["code"]);
  7924.         $this->em->persist($t);
  7925.         $this->em->flush();
  7926.         return ["message"=>"","statut"=>true,"data"=>$t->toArray()];
  7927.     }
  7928.     public function editTypeCourrier(array $data)
  7929.     {
  7930.         $req=["code","nom_fr","nom_en","id","user","attached_file"];
  7931.         $reqObli=["code","nom_fr","nom_en","id","attached_file"];
  7932.         foreach ($req as $val)
  7933.         {
  7934.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  7935.             else{
  7936.                 if(in_array($val,$reqObli))
  7937.                 {
  7938.                     if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  7939.                 }
  7940.             }
  7941.         }
  7942.         $typeCourrier = $this->em->getRepository(TypeCourrier::class)->findOneBy(array("id"=>$data["id"]));
  7943.         if($typeCourrier === null) return ["message"=>"type courrier not found","statut"=>false,"code"=>""];
  7944.         $old = $this->em->getRepository(TypeCourrier::class)->findOneBy(array("code"=>$data["code"],"isActive"=>1));
  7945.         if($old !== null) {
  7946.             if($old->getId()!=$typeCourrier->getId())return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  7947.         }
  7948.         $typeCourrier->setCode($data["code"]);
  7949.         $typeCourrier->setNomEn($data["nom_en"]);
  7950.         $typeCourrier->setNomFr($data["nom_fr"]);
  7951.         $typeCourrier->setPossedePieceJointe($data["attached_file"]);
  7952.         if($data['user'] == ''){
  7953.             $typeCourrier->setUser(null);
  7954.         }
  7955.         else{
  7956.             $n = $this->em->getRepository(User::class)->findOneBy(['id'=>$data['user']]);
  7957.             if($n === null) return ["message"=>"user_not_found","statut"=>false,"code"=>"USER_NOT_FOUND"];
  7958.             $typeCourrier->setUser($n);
  7959.         }
  7960.         $this->em->persist($typeCourrier);
  7961.         $this->em->flush();
  7962.         $log = new Log();
  7963.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT78'));
  7964.         if($operation !== null)
  7965.         {
  7966.             $log->setOperation($operation);
  7967.             $log->setUser($this->currenUser);
  7968.             $log->setObservation($typeCourrier->getId());
  7969.             $this->em->persist($log);
  7970.             $this->em->flush();
  7971.         }
  7972.         return ["message"=>"","statut"=>true,"data"=>$typeCourrier->toArray()];
  7973.     }
  7974.     public function editPiecejointe(array $data)
  7975.     {
  7976.         $req=["nom_fr","nom_en","id"];
  7977.         $reqObli=["nom_fr","nom_en","id"];
  7978.         foreach ($req as $val)
  7979.         {
  7980.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  7981.             else{
  7982.                 if(in_array($val,$reqObli))
  7983.                 {
  7984.                     if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  7985.                 }
  7986.             }
  7987.         }
  7988.         $piece = $this->em->getRepository(PieceJointe::class)->findOneBy(array("id"=>$data["id"]));
  7989.         if($piece === null) return ["message"=>"attached file not found","statut"=>false,"code"=>""];
  7990.         $piece->setNomEn($data["nom_en"]);
  7991.         $piece->setNomFr($data["nom_fr"]);
  7992.         $this->em->persist($piece);
  7993.         $this->em->flush();
  7994.         $log = new Log();
  7995.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT61'));
  7996.         if($operation !== null)
  7997.         {
  7998.             $log->setOperation($operation);
  7999.             $log->setUser($this->currenUser);
  8000.             $log->setObservation($piece->getId());
  8001.             $this->em->persist($log);
  8002.             $this->em->flush();
  8003.         }
  8004.         return ["message"=>"","statut"=>true,"data"=>$piece->toArray()];
  8005.     }
  8006.     public function editTypeTache(array $data)
  8007.     {
  8008.         $req=["code","nom_fr","nom_en","id"];
  8009.         $reqObli=["code","nom_fr","nom_en","id"];
  8010.         foreach ($req as $val)
  8011.         {
  8012.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  8013.             else{
  8014.                 if(in_array($val,$reqObli))
  8015.                 {
  8016.                     if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  8017.                 }
  8018.             }
  8019.         }
  8020.         $typeTache = $this->em->getRepository(TypeTache::class)->findOneBy(array("id"=>$data["id"]));
  8021.         if($typeTache === null) return ["message"=>"type tache not found","statut"=>false,"code"=>""];
  8022.         $old = $this->em->getRepository(TypeTache::class)->findOneBy(array("code"=>$data["code"],"isActive"=>1));
  8023.         if($old !== null) {
  8024.             if($old->getId()!=$typeTache->getId())return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  8025.         }
  8026.         $typeTache->setCode($data["code"]);
  8027.         $typeTache->setNomEn($data["nom_en"]);
  8028.         $typeTache->setNomFr($data["nom_fr"]);
  8029.         $this->em->persist($typeTache);
  8030.         $this->em->flush();
  8031.         $log = new Log();
  8032.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT79'));
  8033.         if($operation !== null)
  8034.         {
  8035.             $log->setOperation($operation);
  8036.             $log->setUser($this->currenUser);
  8037.             $log->setObservation($typeTache->getId());
  8038.             $this->em->persist($log);
  8039.             $this->em->flush();
  8040.         }
  8041.         return ["message"=>"","statut"=>true,"data"=>$typeTache->toArray()];
  8042.     }
  8043.     public function editPriorite(array $data)
  8044.     {
  8045.         $req=["type","delais","niveau","nom_en","nom_fr","code","id"];
  8046.         foreach ($req as $el)
  8047.         {
  8048.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>""];
  8049.         }
  8050.         foreach ($req as $el)
  8051.         {
  8052.             if(strlen($data[$el])===0) return ["message"=>$el." field is empty","statut"=>false,"code"=>""];
  8053.         }
  8054.         $d = $this->em->getRepository(Priorite::class)->findOneBy(array("id"=>$data["id"]));
  8055.         if($d === null) return ["message"=>"Priorite not found","statut"=>false,"code"=>""];
  8056.         $d->setType($data["type"]);
  8057.         $d->setCode($data["code"]);
  8058.         $d->setNiveau($data["niveau"]);
  8059.         $d->setDelais($data["delais"]);
  8060.         $d->setNomFr($data["nom_fr"]);
  8061.         $d->setNomEn($data["nom_en"]);
  8062.         $this->em->persist($d);
  8063.         $this->em->flush();
  8064.         return ["message"=>"","statut"=>true,"data"=>$d->toArray()];
  8065.     }
  8066.     public function createCourtier(array $data)
  8067.     {
  8068.         $req=["nom","phone","cni"];
  8069.         foreach ($req as $val)
  8070.         {
  8071.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  8072.         }
  8073.         if(strlen($data["nom"])<1) return ["message"=>"nom field is empty","statut"=>false,"code"=>""];
  8074.         if(strlen($data["cni"])<1) return ["message"=>"cni field is empty","statut"=>false,"code"=>""];
  8075.         //if(strlen($data["phone"])<9) return ["message"=>"phone field is empty (min 9 characters)","statut"=>false,"code"=>""];
  8076.         $actor = new Courtier();
  8077.         $actor->setNom($data["nom"]);
  8078.         $actor->setCni($data["cni"]);
  8079.         $actor->setTelephone($data["phone"]);
  8080.         $this->em->persist($actor);
  8081.         $this->em->flush();
  8082.         return ["message"=>"","statut"=>true,"data"=>$actor->toArray()];
  8083.     }
  8084.     public function editExternalActor(array $data)
  8085.     {
  8086.         $req=["nom","phone","type","email","id","category"];
  8087.         foreach ($req as $val)
  8088.         {
  8089.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  8090.         }
  8091.         if(strlen($data["nom"])<1) return ["message"=>"nom field is empty","statut"=>false,"code"=>""];
  8092.         if(strlen($data["phone"])===0) return ["message"=>"phone field is empty","statut"=>false,"code"=>""];
  8093.         $actor = $this->em->getRepository(ActeurExterne::class)->findOneBy(['id'=>$data['id']]);
  8094.         if($actor === null) return ["message"=>"Actor not found","statut"=>false,"code"=>""];
  8095.         $actor->setNom($data["nom"]);
  8096.         $actor->setType((int)$data["type"]);
  8097.         $actor->setTelephone($data["phone"]);
  8098.         $actor->setCategory($data["category"]);
  8099.         /*if($data["email"]!='')
  8100.         {
  8101.             if(!filter_var($data["email"], FILTER_VALIDATE_EMAIL))
  8102.             {
  8103.                 return ["message"=>"invalid_email","statut"=>false,"code"=>"EMAIL_INVALID"];
  8104.             }
  8105.         }*/
  8106.         $actor->setEmail($data["email"]);
  8107.         $this->em->persist($actor);
  8108.         $this->em->flush();
  8109.         return ["message"=>"","statut"=>true,"data"=>$actor->toArray()];
  8110.     }
  8111.     public function uploadCadre($data){
  8112.         $maxlevel = 7;
  8113.         $tabALL = [];
  8114.         $tabALL[0] = [];
  8115.         foreach ($data as $t){
  8116.             for ($i=1;$i<=$maxlevel;$i++){
  8117.                 $test = $i+1;
  8118.                 if(count($t)== $test){
  8119.                     $c = new CadreClassement();
  8120.                     $c->setCode($t[1]);
  8121.                     $c->setIsActive(1);
  8122.                     if($test>2){
  8123.                         $c->setDescEn($t[2]);
  8124.                     }
  8125.                     $c->setDescFr("");
  8126.                     $c->setNomEn($t[0]);
  8127.                     $c->setNomFr($t[0]);
  8128.                     $c->setNiveau($i);
  8129.                     $c->setOrdre(0);
  8130.                     if(!array_key_exists($i,$tabALL)){
  8131.                         $tabALL[$i]=[];
  8132.                         $tabALL[$i][]=$c;
  8133.                     }
  8134.                     else{
  8135.                         $tabALL[$i][]=$c;
  8136.                     }
  8137.                 }
  8138.             }
  8139.         }
  8140.         $tl = count($tabALL);
  8141.         for ($i=2;$i<=$tl;$i++){
  8142.             $parents = $tabALL[$i-1];
  8143.             if(array_key_exists($i,$tabALL)){
  8144.                 $sons = $tabALL[$i];
  8145.                 foreach ($sons as $key=>$val){
  8146.                     foreach ($parents as $p){
  8147.                         if($p->getCode()===$val->getDescEn()){
  8148.                             $p->addCadreClassement($val);
  8149.                             $val->setCardreClassement($p);
  8150.                             $val->setDescEn("");
  8151.                         }
  8152.                     }
  8153.                 }
  8154.             }
  8155.         }
  8156.         foreach ($tabALL[1] as $p){
  8157.             $this->em->persist($p);
  8158.         }
  8159.         $this->em->flush();
  8160.         return [];
  8161.     }
  8162.     public function importNewCategories($data){
  8163.         $okVal = [];
  8164.         foreach ($data as $d){
  8165.             $old = $this->em->getRepository(TypeDossier::class)->findOneBy(["code"=>$d]);
  8166.             if($old === null){
  8167.                 $okVal[]=$d;
  8168.                 $d = new TypeDossier();
  8169.                 $d->setCode($d);
  8170.                 $d->setNomEn($d);
  8171.                 $d->setNomFr($d);
  8172.                 $this->em->persist($d);
  8173.             }
  8174.         }
  8175.         $this->em->flush();
  8176.         return $d;
  8177.     }
  8178.     public function saveMultiple(string $fi)
  8179.     {
  8180.         $fp = fopen($fi, "r");
  8181.         $i=0;
  8182.         $tab=[];
  8183.         // lecture ligne par ligne tant qu'on ne rencontre pas le code: fin de fichier(feof)
  8184.         while(!feof($fp))
  8185.         {
  8186.             $tab[$i]=fgetcsv($fp, 100000, ",");
  8187.             $i++;
  8188.         }
  8189.         $j=-1;
  8190.         //$operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT38'));
  8191.         foreach ($tab as $r) {
  8192.             $j++;
  8193.             if(count($r)==16 && $j>=1) {
  8194.                 //var_dump(trim($r[5]));
  8195.                 $type = $this->em->getRepository(TypeDossier::class)->findOneBy(array("code"=>trim($r[1])));
  8196.                 if(is_null($type)){
  8197.                     $type = new TypeDossier();
  8198.                     $type->setNomFr($r[1]);
  8199.                     $type->setNomEn($r[1]);
  8200.                     $type->setCode($r[1]);
  8201.                     $this->em->persist($type);
  8202.                     $this->em->flush();
  8203.                 }
  8204.                 $b = $this->em->getRepository(Bordereau::class)->findOneBy(array("numero"=>"000001"));
  8205.                 //if(is_null($b)) return ["message"=>"bordereau not found","statut"=>false,"code"=>""];
  8206.                 $conf = $this->em->getRepository(TypeConfidentialite::class)->findOneBy(array("niveau"=>1));
  8207.                 //if(is_null($conf)) return ["message"=>"type confidentialite not found","statut"=>false,"code"=>""];
  8208.                 $cadre = $this->em->getRepository(CadreClassement::class)->findOneBy(array("code"=>trim($r[13])));
  8209.                 //if(is_null($cadre)) return ["message"=>"cadre de classement not found","statut"=>false,"code"=>""];
  8210.                 if(is_null($cadre)) return "cadre de classement not found ".$r[0];
  8211.                 $rayon = $this->em->getRepository(Rayon::class)->findOneBy(array("code"=>trim($r[9])));
  8212.                 //if(is_null($rayon)) return ["message"=>"rayonnage not found","statut"=>false,"code"=>""];
  8213.                 $dossier = new Dossier();
  8214.                 $dossier->setType($type);
  8215.                 $dossier->setBordereau($b);
  8216.                 $dossier->setTitre(trim($r[2]));
  8217.                 $dossier->setObservation("");
  8218.                 $dossier->setLangue(strtolower(trim($r[5])));
  8219.                 $dossier->setCadreClassement($cadre);
  8220.                 $dossier->setRayon($rayon);
  8221.                 $dossier->setEtagere(trim($r[10]));
  8222.                 $dossier->setBoite(trim($r[11]));
  8223.                 $dossier->setOrdreRangement(trim($r[14]));
  8224.                 $dossier->setNbPiece(1);
  8225.                 $dossier->setCoteDossier($cadre->getCode());
  8226.                 $dossier->setDescription("");
  8227.                 $dossier->setReference($this->generateReference()["data"]);
  8228.                 $dossier->setTypeConfidentialite($conf);
  8229.                 $dossier->setContent(trim($r[12]));
  8230.                 $dossier->setStatut(1);
  8231.                 $dossier->setDateCloture(\DateTime::createFromFormat('d/m/Y',trim($r[15])));
  8232.                 $dossier->setDateCreation(\DateTime::createFromFormat('d/m/Y',trim($r[4])));
  8233.                 $dossier->setDateType(Dossier::DATE_NORMAL);
  8234.                 $file_a = new Fichier();
  8235.                 $file_a->setNom(trim($r[0]));
  8236.                 $file_a->setFolderNameAndName(trim($r[2])." | ". trim($r[0]));
  8237.                 $file_a->setExtension(".");
  8238.                 $file_a->setType("application/pdf");
  8239.                 $file_a->setTaille(120000);
  8240.                 $file_a->setPath(trim($r[0]));
  8241.                 $file_a->setAuteur("admin admin");
  8242.                 $file_a->setDossier($dossier);
  8243.                 $dossier->addFichier($file_a);
  8244.                 $this->em->persist($dossier);
  8245.             }
  8246.         }
  8247.         try{
  8248.             $this->em->flush();
  8249.         }
  8250.         catch (\Exception $e)
  8251.         {
  8252.             return $e->getMessage()." ".$e->getFile()."line ".$e->getLine();
  8253.         }
  8254.         fclose($fp);
  8255.         return "operation_done ".$j;
  8256.     }
  8257.     public function createEtagere(array $data)
  8258.     {
  8259.         $req=["code","rayon","face"];
  8260.         $reqObli=["code","rayon","face"];
  8261.         foreach ($req as $val)
  8262.         {
  8263.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  8264.             else{
  8265.                 if(in_array($val,$reqObli))
  8266.                 {
  8267.                     if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  8268.                 }
  8269.             }
  8270.         }
  8271.         $old = $this->em->getRepository(Etagere::class)->findOneBy(array("code"=>$data["code"],"rayon"=>$data["rayon"], "isActive"=>1));
  8272.         if($old !== null) return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  8273.         $rayon = $this->em->getRepository(Rayon::class)->findOneBy(['id'=>$data['rayon']]);
  8274.         if($rayon === null) return ["message"=>$this->container->get('translator')->trans('shelving_not_found'),"statut"=>false,"code"=>401];
  8275.         $eta = new Etagere();
  8276.         $eta->setCode($data["code"]);
  8277.         $eta->setFace($data["face"]);
  8278.         $eta->setRayon($rayon);
  8279.         $this->em->persist($eta);
  8280.         $this->em->flush();
  8281.         $log = new Log();
  8282.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT73'));
  8283.         if(!is_null($operation))
  8284.         {
  8285.             $log->setOperation($operation);
  8286.             $log->setUser($this->currenUser);
  8287.             $log->setObservation($eta->getId());
  8288.             $this->em->persist($log);
  8289.             $this->em->flush();
  8290.         }
  8291.         return ["message"=>"","statut"=>true,"data"=>$eta->toArray()];
  8292.     }
  8293.     public function createBoite(array $data)
  8294.     {
  8295.         $req=["code","etagere","type"];
  8296.         $reqObli=["code","etagere","type"];
  8297.         foreach ($req as $val)
  8298.         {
  8299.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  8300.             else{
  8301.                 if(in_array($val,$reqObli))
  8302.                 {
  8303.                     if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  8304.                 }
  8305.             }
  8306.         }
  8307.         $old = $this->em->getRepository(Boite::class)->findOneBy(array("code"=>$data["code"],"isActive"=>1));
  8308.         if($old !== null) return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  8309.         $eta = $this->em->getRepository(Etagere::class)->findOneBy(['id'=>$data['etagere']]);
  8310.         if($eta === null) return ["message"=>$this->container->get('translator')->trans('rack_not_found'),"statut"=>false,"code"=>401];
  8311.         $box = new Boite();
  8312.         $box->setCode($data["code"]);
  8313.         $box->setType((int)$data["type"]);
  8314.         $box->setEtagere($eta);
  8315.         $this->em->persist($box);
  8316.         $this->em->flush();
  8317.         $log = new Log();
  8318.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT74'));
  8319.         if(!is_null($operation))
  8320.         {
  8321.             $log->setOperation($operation);
  8322.             $log->setUser($this->currenUser);
  8323.             $log->setObservation($box->getId());
  8324.             $this->em->persist($log);
  8325.             $this->em->flush();
  8326.         }
  8327.         return ["message"=>"","statut"=>true,"data"=>$eta->toArray()];
  8328.     }
  8329.     public function editEtagere(array $data)
  8330.     {
  8331.         $req=["code","rayon","id","face"];
  8332.         $reqObli=["code","rayon","id","face"];
  8333.         foreach ($req as $val)
  8334.         {
  8335.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  8336.             else{
  8337.                 if(in_array($val,$reqObli))
  8338.                 {
  8339.                     if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  8340.                 }
  8341.             }
  8342.         }
  8343.         $eta = $this->em->getRepository(Etagere::class)->findOneBy(array("id"=>$data["id"]));
  8344.         if($eta === null) return ["message"=>"shelf not found","statut"=>false,"code"=>""];
  8345.         $old = $this->em->getRepository(Etagere::class)->findOneBy(array("code"=>$data["code"],"rayon"=>$data["rayon"],"isActive"=>1));
  8346.         if($old !== null) {
  8347.             if($old->getId()!=$eta->getId())return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  8348.         }
  8349.         $rayon = $this->em->getRepository(Rayon::class)->findOneBy(['id'=>$data['rayon']]);
  8350.         if($rayon === null) return ["message"=>$this->container->get('translator')->trans('shelving_not_found'),"statut"=>false,"code"=>401];
  8351.         $eta->setCode($data["code"]);
  8352.         $eta->setFace($data["face"]);
  8353.         $eta->setRayon($rayon);
  8354.         $this->em->persist($eta);
  8355.         $this->em->flush();
  8356.         $log = new Log();
  8357.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT75'));
  8358.         if(!is_null($operation))
  8359.         {
  8360.             $log->setOperation($operation);
  8361.             $log->setUser($this->currenUser);
  8362.             $log->setObservation($eta->getId());
  8363.             $this->em->persist($log);
  8364.             $this->em->flush();
  8365.         }
  8366.         return ["message"=>"","statut"=>true,"data"=>$eta->toArray()];
  8367.     }
  8368.     public function editBoite(array $data)
  8369.     {
  8370.         $req=["code","etagere","id","type"];
  8371.         $reqObli=["code","etagere","id","type"];
  8372.         foreach ($req as $val)
  8373.         {
  8374.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  8375.             else{
  8376.                 if(in_array($val,$reqObli))
  8377.                 {
  8378.                     if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  8379.                 }
  8380.             }
  8381.         }
  8382.         $box = $this->em->getRepository(Boite::class)->findOneBy(array("id"=>$data["id"]));
  8383.         if($box === null) return ["message"=>"box not found","statut"=>false,"code"=>""];
  8384.         $old = $this->em->getRepository(Boite::class)->findOneBy(array("code"=>$data["code"],"isActive"=>1));
  8385.         if($old !== null) {
  8386.             if($old->getId()!=$box->getId())return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  8387.         }
  8388.         $eta = $this->em->getRepository(Etagere::class)->findOneBy(['id'=>$data['etagere']]);
  8389.         if($eta === null) return ["message"=>$this->container->get('translator')->trans('rack_not_found'),"statut"=>false,"code"=>401];
  8390.         $box->setCode($data["code"]);
  8391.         $box->setType((int)$data["type"]);
  8392.         $box->setEtagere($eta);
  8393.         $this->em->persist($box);
  8394.         $this->em->flush();
  8395.         $log = new Log();
  8396.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT76'));
  8397.         if(!is_null($operation))
  8398.         {
  8399.             $log->setOperation($operation);
  8400.             $log->setUser($this->currenUser);
  8401.             $log->setObservation($box->getId());
  8402.             $this->em->persist($log);
  8403.             $this->em->flush();
  8404.         }
  8405.         return ["message"=>"","statut"=>true,"data"=>$box->toArray()];
  8406.     }
  8407.     public function simpleSearchBordereau(array $data)
  8408.     {
  8409.         if(!array_key_exists("keywords",$data))  return ["message"=>"keywords field is required","statut"=>false,"code"=>""];
  8410.         $res = $this->em->getRepository(Bordereau::class)->searchSimple($data["keywords"]);
  8411.         $datas=[];
  8412.         foreach ($res as $el)
  8413.         {
  8414.             $datas[]=$el->toArray();
  8415.         }
  8416. /*
  8417.         $log = new Log();
  8418.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT06'));
  8419.         if(!is_null($operation))
  8420.         {
  8421.             $log->setOperation($operation);
  8422.             $log->setUser($this->currenUser);
  8423.             $log->setObservation($data["keywords"]);
  8424.             $this->em->persist($log);
  8425.             $this->em->flush();
  8426.         }
  8427.         */
  8428.         return ["message"=>"","statut"=>true,"data"=>$datas];
  8429.     }
  8430.     public function listOfFolderAwaiting(array $data)
  8431.     {
  8432.         $offset = 0;
  8433.         $limit = 100;
  8434.         if(array_key_exists("offset",$data)){
  8435.             $offset = intval($data["offset"]);
  8436.         }
  8437.         if(array_key_exists("limit",$data)){
  8438.             $limit = intval($data["limit"]);
  8439.         }
  8440.         if(!array_key_exists('category',$data)){
  8441.             return ["message"=>"field category is required","statut"=>false,"code"=>401];
  8442.         }
  8443.         $total = $this->em->getRepository(Dossier::class)->findForTreatNb($data['search']['value'],$this->currenUser->getLevel(),$data['category']);
  8444.         $folders = $this->em->getRepository(Dossier::class)->findForTreat($data['search']['value'],$this->currenUser->getLevel(),$data['category'],$offset,$limit);
  8445.         //var_dump(count($total));
  8446.         //var_dump(count($folders));
  8447.         $res =[];
  8448.         foreach ($folders as $f)
  8449.         {
  8450.             $res[] = $f->toArray();
  8451.         }
  8452.         return ["message"=>"","statut"=>true,"data"=>["folders"=>$res,"total_item"=>$total[0]["nb"],"current_page"=>1 + $offset/$limit,"code"=>201]];
  8453.     }
  8454.     public function listOfFolderToDelete(array $data)
  8455.     {
  8456.         $offset = 0;
  8457.         $limit = 100;
  8458.         if(array_key_exists("offset",$data)){
  8459.             $offset = intval($data["offset"]);
  8460.         }
  8461.         if(array_key_exists("limit",$data)){
  8462.             $limit = intval($data["limit"]);
  8463.         }
  8464.         $regles = $this->em->getRepository(RegleConservation::class)->findBy(array("isActive"=>true,"sortFinal"=>"1"));
  8465.         $ty=[];
  8466.         $types=[];
  8467.         $final=[];
  8468.         foreach ($regles as $r)
  8469.         {
  8470.             $types[]=$r->getTypeDossier()->getId();
  8471.             switch ($r->getDureeDossier()->getTypeConsevation())
  8472.             {
  8473.                 case DureeDossier::ANNEE:
  8474.                     $nb=$r->getDureeDossier()->getConservation();
  8475.                     $add = 365*$nb;
  8476.                     $ty["type_".$r->getTypeDossier()->getId()]=$add;
  8477.                     break;
  8478.                 case DureeDossier::MOIS:
  8479.                     $nb=$r->getDureeDossier()->getConservation();
  8480.                     $ty["type_".$r->getTypeDossier()->getId()]=30*$nb;
  8481.                     break;
  8482.                 case DureeDossier::SEMAINE:
  8483.                     $nb=$r->getDureeDossier()->getConservation();
  8484.                     $add = 7*$nb;
  8485.                     $ty["type_".$r->getTypeDossier()->getId()]=$add;
  8486.                     break;
  8487.                 case DureeDossier::JOUR:
  8488.                     $nb=$r->getDureeDossier()->getConservation();
  8489.                     $ty["type_".$r->getTypeDossier()->getId()]=$nb;
  8490.                     break;
  8491.                 default:
  8492.                     $ty["type_".$r->getTypeDossier()->getId()]=365*4;
  8493.                     break;
  8494.             }
  8495.         }
  8496.         $level = $this->currenUser->getLevel();
  8497.         //$total = $this->em->getRepository(Dossier::class)->findForDeleteNb($level,$types);
  8498.         $folders = $this->em->getRepository(Dossier::class)->findForDelete($level,$types);
  8499.         $empty = $this->em->getRepository(Dossier::class)->findEmptyFolder();
  8500.         if(count($empty)>0){
  8501.             foreach ($empty as $e){
  8502.                 $e->setIsActive(false);
  8503.                 $e->setDossierParent(null);
  8504.                 $subFolders = $e->getSousDossiers();
  8505.                 foreach ($subFolders as $s){
  8506.                     $s->setDossierParent(null);
  8507.                     $this->em->persist($s);
  8508.                 }
  8509.                 $demandes= $this->em->getRepository(DossierDemande::class)->findBy(['dossier'=>$e,'isActive'=>1]);
  8510.                 $wkg= $this->em->getRepository(DossierWorkgroup::class)->findBy(['dossier'=>$e,'isActive'=>1]);
  8511.                 foreach ($demandes as $d){
  8512.                     $d->setIsActive(false);
  8513.                     $this->em->persist($d);
  8514.                 }
  8515.                 foreach ($wkg as $w){
  8516.                     $w->setIsActive(false);
  8517.                     $this->em->persist($w);
  8518.                 }
  8519.                 $this->em->persist($e);
  8520.             }
  8521.             $this->em->flush();
  8522.         }
  8523.         foreach ($folders as $d)
  8524.         {
  8525.             $date = new \DateTime();
  8526.             $tocompare = $d->getDateCreation();
  8527.             $diff = $date->diff($tocompare)->days;
  8528.             if($diff>$ty["type_".$d->getType()->getId()])
  8529.             {
  8530.                 $final[]=$d->toArray();
  8531.             }
  8532.         }
  8533.         $total = count($final);
  8534.         $send = [];
  8535.         $i = -1;
  8536.         $max = $offset + $limit - 1;
  8537.         if($max <= 0){
  8538.             $max = 0;
  8539.         }
  8540.         foreach ($final as $f){
  8541.             $i=$i+1;
  8542.             if($i>=$offset and $i<= $max){
  8543.                 $send[]=$f;
  8544.             }
  8545.         }
  8546.         $log = new Log();
  8547.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT52'));
  8548.         if(!is_null($operation))
  8549.         {
  8550.             $log->setOperation($operation);
  8551.             $log->setUser($this->currenUser);
  8552.             $this->em->persist($log);
  8553.             $this->em->flush();
  8554.         }
  8555.         return ["message"=>"","statut"=>true,"data"=>["empty_folder"=>count($empty), "folders"=>$send,"total_item"=>$total,"current_page"=>1 + $offset/$limit,"code"=>201]];
  8556.     }
  8557.     private function manageDatatable(array  $data){
  8558.     }
  8559.     public function listOfUserNewRequest(array $data)
  8560.     {
  8561.         $offset = 0;
  8562.         $limit = 100;
  8563.         if(array_key_exists("offset",$data)){
  8564.             $offset = intval($data["offset"]);
  8565.         }
  8566.         if(array_key_exists("limit",$data)){
  8567.             $limit = intval($data["limit"]);
  8568.         }
  8569.         $total = $this->em->getRepository(DemandeArchive::class)->findForUserNewNb($this->currenUser->getId());
  8570.         $folders = $this->em->getRepository(DemandeArchive::class)->findForUserNew($this->currenUser->getId(),$offset,$limit);
  8571.         $res =[];
  8572.         foreach ($folders as $f)
  8573.         {
  8574.             $res[] = $f->toArray();
  8575.         }
  8576.         return ["message"=>"","statut"=>true,"data"=>["folders"=>$res,"total_item"=>$total[0]["nb"],"current_page"=>1 + $offset/$limit,"code"=>201]];
  8577.     }
  8578.     public function listOfUserTreatedRequest(array $data)
  8579.     {
  8580.         $offset = 0;
  8581.         $limit = 100;
  8582.         if(array_key_exists("offset",$data)){
  8583.             $offset = intval($data["offset"]);
  8584.         }
  8585.         if(array_key_exists("limit",$data)){
  8586.             $limit = intval($data["limit"]);
  8587.         }
  8588.         $total = $this->em->getRepository(DemandeArchive::class)->findForUserTreatedNb($this->currenUser->getId());
  8589.         $folders = $this->em->getRepository(DemandeArchive::class)->findForUserTreated($this->currenUser->getId(),$offset,$limit);
  8590.         $res =[];
  8591.         foreach ($folders as $f)
  8592.         {
  8593.             $res[] = $f->toArray();
  8594.         }
  8595.         return ["message"=>"","statut"=>true,"data"=>["folders"=>$res,"total_item"=>$total[0]["nb"],"current_page"=>1 + $offset/$limit,"code"=>201]];
  8596.     }
  8597.     private function testRole($role): bool
  8598.     {
  8599.         if ($this->currentUser === "anon.") {
  8600.             return false;
  8601.         }
  8602.         if ($this->currentUser->getType() == 1) {
  8603.             return true;
  8604.         }
  8605.         $userRoles = $this->currentUser->getUserRoles();
  8606.         $serviceRoles = $this->currentUser->getService()->getRoles();
  8607.         $roles = array_merge(
  8608.             is_array($userRoles) ? $userRoles : $userRoles->toArray(),
  8609.             is_array($serviceRoles) ? $serviceRoles : $serviceRoles->toArray()
  8610.         );
  8611.         foreach ($roles as $r) {
  8612.             if ($r->getCode() === $role) {
  8613.                 return true;
  8614.             }
  8615.         }
  8616.         return false;
  8617.     }
  8618.     public function listOfAllNewRequest(array $data)
  8619.     {
  8620.         if(!$this->testRole('M_DAT')){
  8621.             return ["message"=>"operation denied","statut"=>false,"code"=>401,"data"=>""];
  8622.         }
  8623.         $offset = 0;
  8624.         $limit = 100;
  8625.         if(array_key_exists("offset",$data)){
  8626.             $offset = intval($data["offset"]);
  8627.         }
  8628.         if(array_key_exists("limit",$data)){
  8629.             $limit = intval($data["limit"]);
  8630.         }
  8631.         $total = $this->em->getRepository(DemandeArchive::class)->findForAllUserNewNb();
  8632.         $folders = $this->em->getRepository(DemandeArchive::class)->findForAllUserNew($offset,$limit);
  8633.         $res =[];
  8634.         foreach ($folders as $f)
  8635.         {
  8636.             $res[] = $f->toArray();
  8637.         }
  8638.         return ["message"=>"","statut"=>true,"data"=>["folders"=>$res,"total_item"=>$total[0]["nb"],"current_page"=>1 + $offset/$limit,"code"=>201]];
  8639.     }
  8640.     public function listOfAllTreatedRequest(array $data)
  8641.     {
  8642.         if(!$this->testRole('M_DAT')){
  8643.             return ["message"=>"operation denied","statut"=>false,"code"=>401,"data"=>""];
  8644.         }
  8645.         $offset = 0;
  8646.         $limit = 100;
  8647.         if(array_key_exists("offset",$data)){
  8648.             $offset = intval($data["offset"]);
  8649.         }
  8650.         if(array_key_exists("limit",$data)){
  8651.             $limit = intval($data["limit"]);
  8652.         }
  8653.         $total = $this->em->getRepository(DemandeArchive::class)->findForAllUserTreatedNb();
  8654.         $folders = $this->em->getRepository(DemandeArchive::class)->findForAllUserTreated($offset,$limit);
  8655.         $res =[];
  8656.         foreach ($folders as $f)
  8657.         {
  8658.             $res[] = $f->toArray();
  8659.         }
  8660.         return ["message"=>"","statut"=>true,"data"=>["folders"=>$res,"total_item"=>$total[0]["nb"],"current_page"=>1 + $offset/$limit,"code"=>201]];
  8661.     }
  8662.     public function simpleSearchBoite(array $data)
  8663.     {
  8664.         if(!array_key_exists("keywords",$data))  return ["message"=>"keywords field is required","statut"=>false,"code"=>""];
  8665.         $res = $this->em->getRepository(Boite::class)->searchSimple($data["keywords"]);
  8666.         $datas=[];
  8667.         foreach ($res as $el)
  8668.         {
  8669.             $datas[]=$el->toArray();
  8670.         }
  8671.         return ["message"=>"","statut"=>true,"data"=>$datas];
  8672.     }
  8673.     public function uploadMultipleCadre(array $data)
  8674.     {
  8675.         if(!array_key_exists("file",$data)) return ["message"=>"file field is required","statut"=>false,"code"=>401];
  8676.         $file =$this->container->get('upload_service')->uploadBase64($data["file"]);
  8677.         if($file["statut"]==false) return ["message"=>"error_file_upload","statut"=>false,"code"=>401];
  8678.         $f = $this->container->get('upload_service')->getTargetDirectory()."/FOLDER/".$file["file"]["path"];
  8679.         $tab = [];
  8680.         $allCodeFull = $this->em->getRepository(CadreClassement::class)->findAllCode();
  8681.         $allCode =[];
  8682.         foreach ($allCodeFull as $el){
  8683.             $allCode[]=$el["code"];
  8684.         }
  8685.         if (($handle = fopen($f, "r")) !== FALSE) {
  8686.             while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
  8687.                 //$num = count($data);
  8688.                 $t = [];
  8689.                 foreach ($data as $index=>$val){
  8690.                     if($val!==""){
  8691.                         $t[] =$val;
  8692.                     }
  8693.                 }
  8694.                 /*for ($c=0; $c < $num; $c++) {
  8695.                     $t[] = $data[$c];
  8696.                 }*/
  8697.                 $tab[]=$t;
  8698.             }
  8699.             fclose($handle);
  8700.             $maxlevel = 7;
  8701.             $tabALL = [];
  8702.             $tabALL[0] = [];
  8703.             foreach ($tab as $index=> $t){
  8704.                 for ($i=1;$i<=$maxlevel;$i++){
  8705.                     $test = $i+1;
  8706.                     if(count($t) === $test){
  8707.                         if(in_array($t[1],$allCode)){
  8708.                             $c = $this->em->getRepository(CadreClassement::class)->findOneBy(['code'=>$t[1]]);
  8709.                             if($c === null){
  8710.                                 return ["message"=>"oops cadre not founded","statut"=>false, "code"=>401,"data"=>[]];
  8711.                             }
  8712.                         }
  8713.                         else{
  8714.                             $c = new CadreClassement();
  8715.                             $c->setCode($t[1]);
  8716.                             $c->setIsActive(1);
  8717.                             if($test>2){
  8718.                                 $c->setDescEn($t[2]);
  8719.                             }
  8720.                             $c->setDescFr("");
  8721.                             $c->setNomEn($t[0]);
  8722.                             $c->setNomFr($t[0]);
  8723.                             $c->setNiveau($i);
  8724.                             $c->setOrdre(0);
  8725.                         }
  8726.                         if(!array_key_exists($i,$tabALL)){
  8727.                             $tabALL[$i]=[];
  8728.                             $tabALL[$i][]=$c;
  8729.                         }
  8730.                         else{
  8731.                                 $tabALL[$i][]=$c;
  8732.                             }
  8733.                     }
  8734.                 }
  8735.             }
  8736.             $tl = count($tabALL);
  8737.             for ($i=2;$i<=$tl;$i++){
  8738.                 if(array_key_exists($i-1,$tabALL)){
  8739.                     $parents = $tabALL[$i-1];
  8740.                     if(array_key_exists($i,$tabALL)){
  8741.                         $sons = $tabALL[$i];
  8742.                         foreach ($sons as $key=>$val){
  8743.                             foreach ($parents as $p){
  8744.                                 if($p->getCode()===$val->getDescEn()){
  8745.                                     $p->addCadreClassement($val);
  8746.                                     $val->setCardreClassement($p);
  8747.                                     $val->setDescEn("");
  8748.                                 }
  8749.                             }
  8750.                         }
  8751.                     }
  8752.                 }
  8753.             }
  8754.              $added = 0;
  8755.             foreach ($tabALL[1] as $p){
  8756.                     $this->em->persist($p);
  8757.                     $added++;
  8758.             }
  8759.             $this->em->flush();
  8760.             unlink($f);
  8761.             return ["message"=>$this->container->get('translator')->trans('item_added')." ".$added,"statut"=>true, "code"=>201,"data"=>[]];
  8762.         }else{
  8763.             return ["message"=>$this->container->get('translator')->trans('file_incorrect'),"statut"=>false, "code"=>401,"data"=>[]];
  8764.         }
  8765.     }
  8766.     public function uploadAllRoomInfo(array $data)
  8767.     {
  8768.         if(!array_key_exists("file",$data)) return ["message"=>"file field is required","statut"=>false,"code"=>401];
  8769.         $file =$this->container->get('upload_service')->uploadBase64($data["file"]);
  8770.         if($file["statut"]==false) return ["message"=>"error_file_upload","statut"=>false,"code"=>401];
  8771.         $f = $this->container->get('upload_service')->getTargetDirectory()."/FOLDER/".$file["file"]["path"];
  8772.         $tab = [];
  8773.         $allCodeFullBoite = $this->em->getRepository(Boite::class)->findAllCode();
  8774.         $allCodeBoite =[];
  8775.         foreach ($allCodeFullBoite as $el){
  8776.             $allCodeBoite[]=$el["code"];
  8777.         }
  8778.         $allCodeFullSalle = $this->em->getRepository(Salle::class)->findAllCode();
  8779.         $allCodeSalle =[];
  8780.         foreach ($allCodeFullSalle as $el){
  8781.             $allCodeSalle[]=$el["code"];
  8782.         }
  8783.         $tabArchiveLocation = [];
  8784.         if (($handle = fopen($f, "r")) !== FALSE) {
  8785.             while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
  8786.                 $num = count($data);
  8787.                 $t = [];
  8788.                 foreach ($data as $index=>$val){
  8789.                     if($val!==""){
  8790.                         $t[] =$val;
  8791.                     }
  8792.                 }
  8793.                 if(count($t)===6){
  8794.                     $tab[]=$t;
  8795.                 }
  8796.             }
  8797.             fclose($handle);
  8798.             foreach ($tab as $t){
  8799.                 if(!in_array($t[0],$allCodeBoite)){
  8800.                     $archiveLocationCode = $t[5];
  8801.                     $roomCode = $t[4];
  8802.                     if(!array_key_exists($archiveLocationCode,$tabArchiveLocation)){
  8803.                         $tabArchiveLocation[$archiveLocationCode]=[];
  8804.                         $tabArchiveLocation[$archiveLocationCode]["rooms"]=[];
  8805.                     }
  8806.                     if(!array_key_exists($roomCode,$tabArchiveLocation[$archiveLocationCode]["rooms"])){
  8807.                         $tabArchiveLocation[$archiveLocationCode]["rooms"][$roomCode]=[];
  8808.                         $tabArchiveLocation[$archiveLocationCode]["rooms"][$roomCode]["rayon"]=[];
  8809.                     }
  8810.                     if(!array_key_exists($t[2],$tabArchiveLocation[$archiveLocationCode]["rooms"][$roomCode]["rayon"])){
  8811.                         $tabArchiveLocation[$archiveLocationCode]["rooms"][$roomCode]["rayon"][$t[2]]=[];
  8812.                         $tabArchiveLocation[$archiveLocationCode]["rooms"][$roomCode]["rayon"][$t[2]]['etagere']=[];
  8813.                         $tabArchiveLocation[$archiveLocationCode]["rooms"][$roomCode]["rayon"][$t[2]]['face']=[];
  8814.                         $tabArchiveLocation[$archiveLocationCode]["rooms"][$roomCode]["rayon"][$t[2]]['face'][]=$t[3];
  8815.                         $tabArchiveLocation[$archiveLocationCode]["rooms"][$roomCode]["rayon"][$t[2]]['etagere'][$t[1]]=['code'=>$t[1],'face'=>$t[3],'box'=>[]];
  8816.                         $tabArchiveLocation[$archiveLocationCode]["rooms"][$roomCode]["rayon"][$t[2]]['etagere'][$t[1]]['box'][]=$t[0];
  8817.                     }else{
  8818.                         if(!in_array($t[3],$tabArchiveLocation[$archiveLocationCode]["rooms"][$roomCode]["rayon"][$t[2]]['face'])){
  8819.                             $tabArchiveLocation[$archiveLocationCode]["rooms"][$roomCode]["rayon"][$t[2]]['face'][]=$t[3];
  8820.                         }
  8821.                         if(!array_key_exists($t[1],$tabArchiveLocation[$archiveLocationCode]["rooms"][$roomCode]["rayon"][$t[2]]['etagere'])){
  8822.                             $tabArchiveLocation[$archiveLocationCode]["rooms"][$roomCode]["rayon"][$t[2]]['etagere'][$t[1]]=['code'=>$t[1],'face'=>$t[3],'box'=>[]];
  8823.                             $tabArchiveLocation[$archiveLocationCode]["rooms"][$roomCode]["rayon"][$t[2]]['etagere'][$t[1]]['box'][]=$t[0];
  8824.                         }
  8825.                         else{
  8826.                             $tabArchiveLocation[$archiveLocationCode]["rooms"][$roomCode]["rayon"][$t[2]]['etagere'][$t[1]]['box'][]=$t[0];
  8827.                         }
  8828.                     }
  8829.                 }
  8830.             }
  8831.             $nb=0;
  8832.             foreach ($tabArchiveLocation as $archiveLocationKey=>$archiveLocationData){
  8833.                 $archiveLocation = $this->em->getRepository(ArchiveLocation::class)->findOneBy(['code'=>$archiveLocationKey]);
  8834.                 if($archiveLocation === null){
  8835.                     $archiveLocation = new ArchiveLocation();
  8836.                     $archiveLocation->setCode($archiveLocationKey);
  8837.                 }
  8838.                 foreach ($archiveLocationData['rooms'] as $roomKey=>$room){
  8839.                     if(in_array($roomKey,$allCodeSalle)){
  8840.                         $salle = $this->em->getRepository(Salle::class)->findOneBy(['code'=>$roomKey]);
  8841.                         if($salle === null){
  8842.                             return ["message"=>"oops room not founded","statut"=>false, "code"=>401,"data"=>[]];
  8843.                         }
  8844.                     }
  8845.                     else{
  8846.                         $salle = new Salle();
  8847.                         $salle->setCode($roomKey);
  8848.                     }
  8849.                     $allRayon = $this->em->getRepository(Rayon::class)->findAllByRoomCode($roomKey);
  8850.                     $allRayonCode = [];
  8851.                     foreach ($allRayon as $el){
  8852.                         $allRayonCode[]=$el["code"];
  8853.                     }
  8854.                     foreach ($room['rayon'] as $rayonKey=>$r){
  8855.                         if(in_array($rayonKey,$allRayonCode)){
  8856.                             $rayon = $this->em->getRepository(Rayon::class)->findOneBy(['code'=>$rayonKey]);
  8857.                             if($rayon === null){
  8858.                                 return ["message"=>"oops rayon not founded","statut"=>false, "code"=>401,"data"=>[]];
  8859.                             }
  8860.                         }
  8861.                         else{
  8862.                             $rayon = new Rayon();
  8863.                             $rayon->setCode($rayonKey);
  8864.                             $rayon->setSalle($salle);
  8865.                             $rayon->setNbFace(count($r['face']));
  8866.                         }
  8867.                         $allEtagere = $this->em->getRepository(Etagere::class)->findAllByRayonCode($rayonKey);
  8868.                         $allEtagereCode = [];
  8869.                         foreach ($allEtagere as $el){
  8870.                             $allEtagereCode[]=$el["code"];
  8871.                         }
  8872.                         foreach ($r['etagere'] as $etKey=>$eta){
  8873.                             if(in_array($etKey,$allEtagereCode)){
  8874.                                 $etagere = $this->em->getRepository(Etagere::class)->findOneBy(['code'=>$etKey]);
  8875.                                 if($etagere === null){
  8876.                                     return ["message"=>"oops etagere not founded","statut"=>false, "code"=>401,"data"=>[]];
  8877.                                 }
  8878.                             }
  8879.                             else{
  8880.                                 $etagere = new Etagere();
  8881.                                 $etagere->setCode($etKey);
  8882.                                 $etagere->setRayon($rayon);
  8883.                                 $etagere->setFace($eta['face']);
  8884.                             }
  8885.                             foreach ($eta['box'] as $b){
  8886.                                 if(!in_array($b,$allCodeBoite)){
  8887.                                     $boite = new Boite();
  8888.                                     $boite->setCode($b);
  8889.                                     $boite->setEtagere($etagere);
  8890.                                     $etagere->addBoite($boite);
  8891.                                     $nb++;
  8892.                                 }
  8893.                             }
  8894.                             $rayon->addEtagere($etagere);
  8895.                         }
  8896.                         $salle->addRayon($rayon);
  8897.                     }
  8898.                     $archiveLocation->addSalle($salle);
  8899.                 }
  8900.                 $this->em->persist($archiveLocation);
  8901.             }
  8902.             $this->em->flush();
  8903.             unlink($f);
  8904.             return ["message"=>$this->container->get('translator')->trans('item_added'),"statut"=>true, "code"=>201,"data"=>[]];
  8905.         }else{
  8906.             return ["message"=>$this->container->get('translator')->trans('file_incorrect'),"statut"=>false, "code"=>401,"data"=>[]];
  8907.         }
  8908.     }
  8909.     public function sendSms(array  $data){
  8910.         $req =['phones','message'];
  8911.         foreach ($req as $val)
  8912.         {
  8913.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  8914.         }
  8915.         $phones = [];
  8916.         foreach ($data['phones'] as $p){
  8917.             $phones[]='237'.$p;
  8918.         }
  8919.         $headers=['token' => $this->container->getParameter('app.sms_api_token'),
  8920.             'Content-Type' => 'application/json',];
  8921.         $body = \Unirest\Request\Body::json([
  8922.             'from'=>$this->container->getParameter('app.name'),
  8923.             'to'=>$phones,
  8924.             'type'=>'Text',
  8925.             'content'=>$data['message'],
  8926.             'sendDateTime'=>''
  8927.         ]);
  8928.         $response = \Unirest\Request::post($this->container->getParameter('app.sms_api_url'), $headers, $body);
  8929.         $result= json_decode($response->raw_body,true);
  8930.         if($response->code==200)
  8931.         {
  8932.             return ["message"=>"","statut"=>true,"data"=>$result];
  8933.         }
  8934.         return ["message"=>"error","statut"=>false,"data"=>$result];
  8935.     }
  8936.     public function listOfFolderAwaitingPersonnel(array $data)
  8937.     {
  8938.         $offset = 0;
  8939.         $limit = 100;
  8940.         if(array_key_exists("offset",$data)){
  8941.             $offset = intval($data["offset"]);
  8942.         }
  8943.         if(array_key_exists("limit",$data)){
  8944.             $limit = intval($data["limit"]);
  8945.         }
  8946.         if(!array_key_exists('category',$data)){
  8947.             return ["message"=>"field category is required","statut"=>false,"code"=>401];
  8948.         }
  8949.         $total1 = $this->em->getRepository(Dossier::class)->findForTreatNbPersonnelOfficer($this->currenUser->getLevel());
  8950.         $total2 = $this->em->getRepository(Dossier::class)->findForTreatNbPersonnelSOfficer($this->currenUser->getLevel());
  8951.         $folders1 = $this->em->getRepository(Dossier::class)->findForTreatPersonnelOfficer($this->currenUser->getLevel(),$offset,$limit);
  8952.         $folders2 = $this->em->getRepository(Dossier::class)->findForTreatPersonnelSOfficer($this->currenUser->getLevel(),$offset,$limit);
  8953.         $res =[];
  8954.         foreach ($folders1 as $f)
  8955.         {
  8956.             $res[] = $f->toArray();
  8957.         }
  8958.         foreach ($folders2 as $f)
  8959.         {
  8960.             $res[] = $f->toArray();
  8961.         }
  8962.         return ["message"=>"","statut"=>true,"data"=>["folders"=>$res,"total_item"=>count($total1) + count($total2),"current_page"=>1 + $offset/$limit,"code"=>201]];
  8963.     }
  8964.     public function createRegisterItem(array $data)
  8965.     {
  8966.         $req=["reference","date", "matricule","name","motif","taux",'type',"unit","mention","grade","folder","departure_date","come_back_date","hospital_enter_date","file"];
  8967.         $reqObli=["reference","type","grade","name","date"];
  8968.         foreach ($req as $val)
  8969.         {
  8970.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  8971.             else{
  8972.                 if(in_array($val,$reqObli))
  8973.                 {
  8974.                     if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  8975.                 }
  8976.             }
  8977.         }
  8978.         $item = new RegisterItem();
  8979.         $item->setReference($data["reference"]);
  8980.         $item->setMatricule($data["matricule"]);
  8981.         $item->setName($data["name"]);
  8982.         $item->setMotif($data["motif"]);
  8983.         $item->setTaux($data["taux"]);
  8984.         $item->setType($data["type"]);
  8985.         $item->setUnit($data["unit"]);
  8986.         $item->setMention($data["mention"]);
  8987.         $item->setGrade($data["grade"]);
  8988.         $haveAfolder = false;
  8989.         if(strlen($data["folder"])>0){
  8990.             $folder = $this->em->getRepository(Dossier::class)->findOneBy(['refInterne'=>$data["folder"]]);
  8991.             if($folder === null){
  8992.                 return ["message"=>"folder not found","statut"=>false,"code"=>401];
  8993.             }
  8994.             $item->setFolder($folder);
  8995.             $haveAfolder = true;
  8996.         }
  8997.         try {
  8998.             if(strlen($data["departure_date"])>0){
  8999.                 $s = \DateTime::createFromFormat('d/m/Y',$data["departure_date"]);
  9000.                 $item->setDepartureDate($s);
  9001.             }
  9002.             if(strlen($data["come_back_date"])>0){
  9003.                 $s = \DateTime::createFromFormat('d/m/Y',$data["come_back_date"]);
  9004.                 $item->setComeBackDate($s);
  9005.             }
  9006.             if(strlen($data["date"])>0){
  9007.                 $s = \DateTime::createFromFormat('d/m/Y',$data["date"]);
  9008.                 $item->setDateOperation($s);
  9009.             }
  9010.             if(strlen($data["hospital_enter_date"])>0){
  9011.                 $s = \DateTime::createFromFormat('d/m/Y',$data["hospital_enter_date"]);
  9012.                 $item->setHospitalEnterDate($s);
  9013.             }
  9014.         }
  9015.         catch (\Exception $e){
  9016.             return ["message"=>$e->getMessage(),"statut"=>false,"code"=>401];
  9017.         }
  9018.         if(is_array($data['file'])&&count($data['file'])>0){
  9019.             $f = $data['file'];
  9020.             $file = new Fichier();
  9021.             $file->setFolderNameAndName($item->getMatricule()." | ". $data['file']["name"]);
  9022.             $file->setNom($f["name"]);
  9023.             $file->setExtension($f["extension"]);
  9024.             $file->setType($f["type"]);
  9025.             $file->setTaille($f["size"]);
  9026.             $file->setPath($f["path"]);
  9027.             $userU = $this->getCurrentUser();
  9028.             $file->setAuteur($userU["data"]["nom"]." ".$userU["data"]["prenom"]);
  9029.             if($haveAfolder){
  9030.                 $file->setDossier($folder);
  9031.                 $folder->addFichier($file);
  9032.                 $this->em->persist($folder);
  9033.             }
  9034.             $item->setFile($file);
  9035.         }
  9036.         $this->em->persist($item);
  9037.         $this->em->flush();
  9038.        /* $log = new Log();
  9039.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT09'));
  9040.         if(!is_null($operation))
  9041.         {
  9042.             $log->setOperation($operation);
  9043.             $log->setUser($this->currenUser);
  9044.             $log->setObservation($service->getId());
  9045.             $this->em->persist($log);
  9046.             $this->em->flush();
  9047.         }*/
  9048.         return ["message"=>"","statut"=>true,"data"=>$item->toArray()];
  9049.     }
  9050.     public function editRegisterItem(array $data)
  9051.     {
  9052.         $req=["id","date", "reference","matricule","name","motif","taux",'type',"unit","mention","grade","folder","departure_date","come_back_date","hospital_enter_date","file"];
  9053.         $reqObli=["id", "reference","type","date"];
  9054.         foreach ($req as $val)
  9055.         {
  9056.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  9057.             else{
  9058.                 if(in_array($val,$reqObli))
  9059.                 {
  9060.                     if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  9061.                 }
  9062.             }
  9063.         }
  9064.         $item = $this->em->getRepository(RegisterItem::class)->findOneBy(['id'=>$data['id']]);
  9065.         if($item === null){
  9066.             return ["message"=>"register item not found","statut"=>false,"code"=>401];
  9067.         }
  9068.         $item->setReference($data["reference"]);
  9069.         $item->setMatricule($data["matricule"]);
  9070.         $item->setName($data["name"]);
  9071.         $item->setMotif($data["motif"]);
  9072.         $item->setTaux($data["taux"]);
  9073.         $item->setType($data["type"]);
  9074.         $item->setUnit($data["unit"]);
  9075.         $item->setMention($data["mention"]);
  9076.         $item->setGrade($data["grade"]);
  9077.         $haveAfolder = false;
  9078.         if(strlen($data["folder"])>0){
  9079.             $folder = $this->em->getRepository(Dossier::class)->findOneBy(['refInterne'=>$data["folder"]]);
  9080.             if($folder === null){
  9081.                 return ["message"=>"folder not found","statut"=>false,"code"=>401];
  9082.             }
  9083.             $item->setFolder($folder);
  9084.             $haveAfolder = true;
  9085.         }
  9086.         try {
  9087.             if(strlen($data["departure_date"])>0){
  9088.                 $s = \DateTime::createFromFormat('d/m/Y',$data["departure_date"]);
  9089.                 $item->setDepartureDate($s);
  9090.             }
  9091.             if(strlen($data["come_back_date"])>0){
  9092.                 $s = \DateTime::createFromFormat('d/m/Y',$data["come_back_date"]);
  9093.                 $item->setComeBackDate($s);
  9094.             }
  9095.             if(strlen($data["date"])>0){
  9096.                 $s = \DateTime::createFromFormat('d/m/Y',$data["date"]);
  9097.                 $item->setDateOperation($s);
  9098.             }
  9099.             if(strlen($data["hospital_enter_date"])>0){
  9100.                 $s = \DateTime::createFromFormat('d/m/Y',$data["hospital_enter_date"]);
  9101.                 $item->setHospitalEnterDate($s);
  9102.             }
  9103.         }
  9104.         catch (\Exception $e){
  9105.             return ["message"=>$e->getMessage(),"statut"=>false,"code"=>401];
  9106.         }
  9107.         if(is_array($data['file'])&&count($data['file'])>0){
  9108.             $f = $data['file'];
  9109.             $file = new Fichier();
  9110.             $file->setNom($f["name"]);
  9111.             $file->setFolderNameAndName($item->getMatricule()." | ". $data['file']["name"]);
  9112.             $file->setExtension($f["extension"]);
  9113.             $file->setType($f["type"]);
  9114.             $file->setTaille($f["size"]);
  9115.             $file->setPath($f["path"]);
  9116.             $userU = $this->getCurrentUser();
  9117.             $file->setAuteur($userU["data"]["nom"]." ".$userU["data"]["prenom"]);
  9118.             if($haveAfolder){
  9119.                 $file->setDossier($folder);
  9120.                 $folder->addFichier($file);
  9121.                 $this->em->persist($folder);
  9122.             }
  9123.             $item->setFile($file);
  9124.         }
  9125.         if($item->getFolder()!== null){
  9126.             $fol = $item->getFolder();
  9127.             if($item->getFile() !== null){
  9128.                 $fileE = $item->getFile();
  9129.                 if(!$fol->getFichiers()->contains($fileE)){
  9130.                     $fileE->setDossier($fol);
  9131.                     $fol->addFichier($fileE);
  9132.                     $this->em->persist($fol);
  9133.                 }
  9134.             }
  9135.         }
  9136.         $this->em->persist($item);
  9137.         $this->em->flush();
  9138.        /* $log = new Log();
  9139.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT09'));
  9140.         if(!is_null($operation))
  9141.         {
  9142.             $log->setOperation($operation);
  9143.             $log->setUser($this->currenUser);
  9144.             $log->setObservation($service->getId());
  9145.             $this->em->persist($log);
  9146.             $this->em->flush();
  9147.         }*/
  9148.         return ["message"=>"","statut"=>true,"data"=>$item->toArray()];
  9149.     }
  9150.     public function getRegisterItems(array $data)
  9151.     {
  9152.         if(!array_key_exists("type",$data)) return ["message"=>"field type is required","statut"=>false,"data"=>"","code"=>401];
  9153.         $offset = 0;
  9154.         $limit = 100;
  9155.         if(array_key_exists("offset",$data)){
  9156.             $offset = intval($data["offset"]);
  9157.         }
  9158.         if(array_key_exists("limit",$data)){
  9159.             $limit = intval($data["limit"]);
  9160.         }
  9161.         $total = $this->em->getRepository(RegisterItem::class)->findItemsNb($data['search']['value'],$data["type"]);
  9162.         $folders = $this->em->getRepository(RegisterItem::class)->findItems($data['search']['value'],$data["type"],$offset,$limit);
  9163.         $res =[];
  9164.         foreach ($folders as $f)
  9165.         {
  9166.             $res[] = $f->toArray();
  9167.         }
  9168.         return ["message"=>"","statut"=>true,"data"=>["folders"=>$res,"total_item"=>$total[0]["nb"],"current_page"=>1 + $offset/$limit,"code"=>201]];
  9169.     }
  9170.     public function  getStatisticRegister(array $data)
  9171.     {
  9172.         if(!array_key_exists("start_date",$data)) return ["message"=>"start_date field is required","statut"=>false,"code"=>401];
  9173.         if(!array_key_exists("end_date",$data)) return ["message"=>"end_date field is required","statut"=>false,"code"=>401];
  9174.          if(!array_key_exists("type",$data)) return ["message"=>"type field is required","statut"=>false,"code"=>401];
  9175.         $s = \DateTime::createFromFormat('d.m.Y',$data["start_date"])->format("Y-m-d");
  9176.         $e = \DateTime::createFromFormat('d.m.Y',$data["end_date"])->format("Y-m-d");
  9177.         $res=[];
  9178.         switch ($data["type"])
  9179.         {
  9180.             case 1:
  9181.                 $dossiers = $this->em->getRepository(RegisterItem::class)->findStatSimple($s,$e, 1);
  9182.                 $res=[];
  9183.                 $res["dates"]=$this->getDatesFromRange($s, $e);
  9184.                 $res["x"][]='Dates';
  9185.                 foreach ($res["dates"] as $t)
  9186.                 {
  9187.                     $res["x"][]=$t;
  9188.                 }
  9189.                 $types=[];
  9190.                 $dates=$res["dates"];
  9191.                 foreach ($dates as $t)
  9192.                 {
  9193.                     $types[$t]=0;
  9194.                 }
  9195.                 foreach ($dossiers as $d)
  9196.                 {
  9197.                     $types[$d->getDateOperation()->format("Y-m-d")]++;
  9198.                 }
  9199.                 $tab=[];
  9200.                 $tab[]=$this->container->get('translator')->trans("punition");
  9201.                 foreach ($types as $key=>$val)
  9202.                 {
  9203.                     $tab[]=$val;
  9204.                 }
  9205.                 $res["data"][]=$tab;
  9206.                 $res["type"]=$types;
  9207.                 $length = count($res["data"]);
  9208.                 $totald= count($dates)+1;
  9209.                 $removeindex=[];
  9210.                 for($j=1;$j<$totald;$j++)
  9211.                 {
  9212.                     $som=0;
  9213.                     for($i=0;$i<$length;$i++)
  9214.                     {
  9215.                         $som=$som+$res["data"][$i][$j];
  9216.                     }
  9217.                     if($som==0)
  9218.                     {
  9219.                         $removeindex[]=$j;
  9220.                     }
  9221.                 }
  9222.                 $main=[];
  9223.                 foreach ($res["data"] as $t)
  9224.                 {
  9225.                     $ta=[];
  9226.                     for($j=0;$j<$totald;$j++)
  9227.                     {
  9228.                         if(!in_array($j,$removeindex))
  9229.                         {
  9230.                             $ta[]=$t[$j];
  9231.                         }
  9232.                     }
  9233.                     $main[]=$ta;
  9234.                 }
  9235.                 //$res["data2"]=$main;
  9236.                 $res["data"]=[$tab];
  9237.                 $res["total"]=count($dossiers);
  9238.                 break;
  9239.             case 2:
  9240.                 $dossiers = $this->em->getRepository(RegisterItem::class)->findStatSimple($s,$e, 2);
  9241.                 $res=[];
  9242.                 $res["dates"]=$this->getDatesFromRange($s, $e);
  9243.                 $res["x"][]='Dates';
  9244.                 foreach ($res["dates"] as $t)
  9245.                 {
  9246.                     $res["x"][]=$t;
  9247.                 }
  9248.                 $types=[];
  9249.                 $dates=$res["dates"];
  9250.                 foreach ($dates as $t)
  9251.                 {
  9252.                     $types[$t]=0;
  9253.                 }
  9254.                 foreach ($dossiers as $d)
  9255.                 {
  9256.                     $types[$d->getDateOperation()->format("Y-m-d")]++;
  9257.                 }
  9258.                 $tab=[];
  9259.                 $tab[]=$this->container->get('translator')->trans("evasant");
  9260.                 foreach ($types as $key=>$val)
  9261.                 {
  9262.                     $tab[]=$val;
  9263.                 }
  9264.                 $res["data"][]=$tab;
  9265.                 $res["type"]=$types;
  9266.                 $length = count($res["data"]);
  9267.                 $totald= count($dates)+1;
  9268.                 $removeindex=[];
  9269.                 for($j=1;$j<$totald;$j++)
  9270.                 {
  9271.                     $som=0;
  9272.                     for($i=0;$i<$length;$i++)
  9273.                     {
  9274.                         $som=$som+$res["data"][$i][$j];
  9275.                     }
  9276.                     if($som==0)
  9277.                     {
  9278.                         $removeindex[]=$j;
  9279.                     }
  9280.                 }
  9281.                 $main=[];
  9282.                 foreach ($res["data"] as $t)
  9283.                 {
  9284.                     $ta=[];
  9285.                     for($j=0;$j<$totald;$j++)
  9286.                     {
  9287.                         if(!in_array($j,$removeindex))
  9288.                         {
  9289.                             $ta[]=$t[$j];
  9290.                         }
  9291.                     }
  9292.                     $main[]=$ta;
  9293.                 }
  9294.                 //$res["data2"]=$main;
  9295.                 $res["data"]=[$tab];
  9296.                 $res["total"]=count($dossiers);
  9297.                 break;
  9298.             case 3:
  9299.                 $dossiers = $this->em->getRepository(RegisterItem::class)->findStatSimple($s,$e, 3);
  9300.                 $res=[];
  9301.                 $res["dates"]=$this->getDatesFromRange($s, $e);
  9302.                 $res["x"][]='Dates';
  9303.                 foreach ($res["dates"] as $t)
  9304.                 {
  9305.                     $res["x"][]=$t;
  9306.                 }
  9307.                 $types=[];
  9308.                 $dates=$res["dates"];
  9309.                 foreach ($dates as $t)
  9310.                 {
  9311.                     $types[$t]=0;
  9312.                 }
  9313.                 foreach ($dossiers as $d)
  9314.                 {
  9315.                     $types[$d->getDateOperation()->format("Y-m-d")]++;
  9316.                 }
  9317.                 $tab=[];
  9318.                 $tab[]=$this->container->get('translator')->trans("desertion");
  9319.                 foreach ($types as $key=>$val)
  9320.                 {
  9321.                     $tab[]=$val;
  9322.                 }
  9323.                 $res["data"][]=$tab;
  9324.                 $res["type"]=$types;
  9325.                 $length = count($res["data"]);
  9326.                 $totald= count($dates)+1;
  9327.                 $removeindex=[];
  9328.                 for($j=1;$j<$totald;$j++)
  9329.                 {
  9330.                     $som=0;
  9331.                     for($i=0;$i<$length;$i++)
  9332.                     {
  9333.                         $som=$som+$res["data"][$i][$j];
  9334.                     }
  9335.                     if($som==0)
  9336.                     {
  9337.                         $removeindex[]=$j;
  9338.                     }
  9339.                 }
  9340.                 $main=[];
  9341.                 foreach ($res["data"] as $t)
  9342.                 {
  9343.                     $ta=[];
  9344.                     for($j=0;$j<$totald;$j++)
  9345.                     {
  9346.                         if(!in_array($j,$removeindex))
  9347.                         {
  9348.                             $ta[]=$t[$j];
  9349.                         }
  9350.                     }
  9351.                     $main[]=$ta;
  9352.                 }
  9353.                 //$res["data2"]=$main;
  9354.                 $res["data"]=[$tab];
  9355.                 $res["total"]=count($dossiers);
  9356.                 break;
  9357.             case 4:
  9358.                 $dossiers = $this->em->getRepository(RegisterItem::class)->findStatSimple($s,$e, 4);
  9359.                 $res=[];
  9360.                 $res["dates"]=$this->getDatesFromRange($s, $e);
  9361.                 $res["x"][]='Dates';
  9362.                 foreach ($res["dates"] as $t)
  9363.                 {
  9364.                     $res["x"][]=$t;
  9365.                 }
  9366.                 $types=[];
  9367.                 $dates=$res["dates"];
  9368.                 foreach ($dates as $t)
  9369.                 {
  9370.                     $types[$t]=0;
  9371.                 }
  9372.                 foreach ($dossiers as $d)
  9373.                 {
  9374.                     $types[$d->getDateOperation()->format("Y-m-d")]++;
  9375.                 }
  9376.                 $tab=[];
  9377.                 $tab[]=$this->container->get('translator')->trans("all");
  9378.                 foreach ($types as $key=>$val)
  9379.                 {
  9380.                     $tab[]=$val;
  9381.                 }
  9382.                 $res["data"][]=$tab;
  9383.                 $res["type"]=$types;
  9384.                 $length = count($res["data"]);
  9385.                 $totald= count($dates)+1;
  9386.                 $removeindex=[];
  9387.                 for($j=1;$j<$totald;$j++)
  9388.                 {
  9389.                     $som=0;
  9390.                     for($i=0;$i<$length;$i++)
  9391.                     {
  9392.                         $som=$som+$res["data"][$i][$j];
  9393.                     }
  9394.                     if($som==0)
  9395.                     {
  9396.                         $removeindex[]=$j;
  9397.                     }
  9398.                 }
  9399.                 $main=[];
  9400.                 foreach ($res["data"] as $t)
  9401.                 {
  9402.                     $ta=[];
  9403.                     for($j=0;$j<$totald;$j++)
  9404.                     {
  9405.                         if(!in_array($j,$removeindex))
  9406.                         {
  9407.                             $ta[]=$t[$j];
  9408.                         }
  9409.                     }
  9410.                     $main[]=$ta;
  9411.                 }
  9412.                 //$res["data2"]=$main;
  9413.                 $res["data"]=[$tab];
  9414.                 $res["total"]=count($dossiers);
  9415.                 break;
  9416.             default:
  9417.                 break;
  9418.         }
  9419.         /* if(!is_null($operation))
  9420.          {
  9421.              $log->setOperation($operation);
  9422.              $log->setUser($this->currenUser);
  9423.              $this->em->persist($log);
  9424.              $this->em->flush();
  9425.          }*/
  9426.         return ["message"=>"operation_done","data"=>$res, "statut"=>true,"code"=>201];
  9427.     }
  9428.     public function deleteSingleFolder(array $data)
  9429.     {
  9430.         $req =["id"];
  9431.         foreach ($req as $r)
  9432.         {
  9433.             if(!array_key_exists($r,$data)) return ["message"=>$r." field is required","statut"=>false,"code"=>401];
  9434.         }
  9435.         $d= $this->em->getRepository(Dossier::class)->findOneBy(array("id"=>$data['id'],"isActive"=>true));
  9436.         if(!is_null($d)){
  9437.             $d->setIsActive(false);
  9438.         }
  9439.         $this->em->persist($d);
  9440.         $this->em->flush();
  9441.         return ["message"=>"operation_done","statut"=>true,"code"=>201,"data"=>[]];
  9442.     }
  9443.     public function advancedSearchMail(array $data)
  9444.     {
  9445.         $req=["titre","type_courrier","reference","start_date","end_date"];
  9446.         foreach ($req as $el)
  9447.         {
  9448.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>401];
  9449.         }
  9450.         if($data["start_date"]!="")
  9451.         {
  9452.             if(preg_match("/^[a-zA-Z]+$/", $data["start_date"])==false){
  9453.                 $d = \DateTime::createFromFormat('d/m/Y',$data["start_date"]);
  9454.                 $data["start_date"] =$d->format("Y-m-d")." 00:00:01";
  9455.                 $data["start_date_1"] =$d->format("Y-m-d");
  9456.                 $data["start_date_2"] =$d->format("Y-m-d")." 23:59:59";
  9457.             }
  9458.         }
  9459.         if($data["end_date"]!="")
  9460.         {
  9461.             if(preg_match("/^[a-zA-Z]+$/", $data["end_date"])==false){
  9462.                 $d = \DateTime::createFromFormat('d/m/Y',$data["end_date"]);
  9463.                 $data["end_date"] =$d->format("Y-m-d")." 00:00:01";
  9464.                 $data["end_date_1"] =$d->format("Y-m-d");
  9465.                 $data["end_date_2"] =$d->format("Y-m-d")." 23:59:59";
  9466.             }
  9467.         }
  9468.         //$da = $this->em->getRepository(Dossier::class)->findAdvanced($level,$data);
  9469.         $level = $this->currenUser->getLevel();
  9470.         try {
  9471.             $da =  $this->container->get(FOSElasticSearchServiceMail::class)->searchAdvancedMail($data,$level);
  9472.         }
  9473.         catch (\Exception $e){
  9474.             return ["message"=>$e->getMessage()." ".$e->getLine(),"data"=>[], "statut"=>false,"code"=>401];
  9475.         }
  9476.         $res=[];
  9477.         foreach ($da as $d)
  9478.         {
  9479.             $res[]=$d->toArray();
  9480.         }
  9481.         return ["message"=>"operation_done","data"=>$res, "statut"=>true,"code"=>201];
  9482.     }
  9483.     public function advancedSearchAttachment(array $data)
  9484.     {
  9485.         $req=["titre","reference","bordereau"];
  9486.         foreach ($req as $el)
  9487.         {
  9488.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>401];
  9489.         }
  9490.         $level = $this->currenUser->getLevel();
  9491.         try {
  9492.             $da =  $this->container->get(FOSElasticSearchAttachmentService::class)->advancedSearchAttachment($data,$level);
  9493.         }
  9494.         catch (\Exception $e){
  9495.             return ["message"=>$e->getMessage()." ".$e->getLine(),"data"=>[], "statut"=>false,"code"=>401];
  9496.         }
  9497.         $res=[];
  9498.         foreach ($da as $d)
  9499.         {
  9500.             $res[]=$d->toArrayForSearch();
  9501.         }
  9502.         return ["message"=>"operation_done","data"=>$res, "statut"=>true,"code"=>201];
  9503.     }
  9504.     public function listWaitingMail(array $data)
  9505.     {
  9506.         $offset = 0;
  9507.         $limit = 100;
  9508.         if(array_key_exists("offset",$data)){
  9509.             $offset = intval($data["offset"]);
  9510.         }
  9511.         if(array_key_exists("limit",$data)){
  9512.             $limit = intval($data["limit"]);
  9513.         }
  9514.         $total = $this->em->getRepository(Courrier::class)->findWaitingNb($this->currenUser->getLevel());
  9515.         $folders = $this->em->getRepository(Courrier::class)->findWaiting($this->currenUser->getLevel(),$offset,$limit);
  9516.         $res =[];
  9517.         foreach ($folders as $f)
  9518.         {
  9519.             $res[] = $f->toArray();
  9520.         }
  9521.         return ["message"=>"","statut"=>true,"data"=>["folders"=>$res,"total_item"=>$total[0]["nb"],"current_page"=>1 + $offset/$limit,"code"=>201]];
  9522.     }
  9523.     public function saveMultipleMail(array $data)
  9524.     {
  9525.         if(!array_key_exists("file",$data)) return ["message"=>"file field is required","statut"=>false,"code"=>401];
  9526.         if(!array_key_exists("type",$data)) return ["message"=>"type field is required","statut"=>false,"code"=>401];
  9527.         $file =$this->container->get('upload_service')->uploadBase64($data["file"]);
  9528.         if($file["statut"]==false) return ["message"=>"error_file_upload","statut"=>false,"code"=>401];
  9529.         if(!in_array(strtolower($file["file"]["encoding"]),["utf-8","iso-8859-1"]))
  9530.         {
  9531.             $f = $this->container->get('upload_service')->getTargetDirectory()."/FOLDER/".$file["file"]["path"];
  9532.             unlink($f);
  9533.             return ["message"=>$this->container->get('translator')->trans("bad_encoding")." ".$file["file"]["encoding"],"statut"=>false,"code"=>401];
  9534.         }
  9535.         $f = $this->container->get('upload_service')->getTargetDirectory()."/FOLDER/".$file["file"]["path"];
  9536.         //mb_internal_encoding('UTF-8');
  9537.         $fileError = fopen($this->container->get('upload_service')->getImportDirectory()."file_error.txt", "a");
  9538.         file_put_contents($this->container->get('upload_service')->getImportDirectory()."file_error.txt",'');
  9539.         // Remplacer l'ouverture du fichier et la lecture
  9540.         $fp = fopen($f, "r");
  9541. // Détecter le séparateur sur la première ligne
  9542.         $firstLine = fgets($fp);
  9543.         rewind($fp);
  9544. // BOM cleanup si nécessaire
  9545.         $bom = "\xEF\xBB\xBF";
  9546.         if (strncmp($firstLine, $bom, 3) === 0) {
  9547.             $firstLine = substr($firstLine, 3);
  9548.         }
  9549.         $delimiter = ','; // défaut
  9550.         $semicolonCount = substr_count($firstLine, ';');
  9551.         $commaCount     = substr_count($firstLine, ',');
  9552.         if ($semicolonCount > $commaCount) {
  9553.             $delimiter = ';';
  9554.         }
  9555. // Puis dans la boucle :
  9556.         while (($datai = fgetcsv($fp, 10000, $delimiter)) !== FALSE) {
  9557.             $tab[] = $datai;
  9558.         }
  9559.     //fclose($fp);
  9560.         $j=0;
  9561.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT86'));
  9562.         $this->em->getConnection()->beginTransaction();
  9563.         foreach ($tab as $r) {
  9564.             $j++;
  9565.             if($j>1){
  9566.                 if(count($r)==7 ) {
  9567.                     $type = $this->em->getRepository(TypeCourrier::class)->findOneBy(array("code"=>trim($r[1])));
  9568.                     if(is_null($type)) return ["message"=>"type courrier not found","statut"=>false,"code"=>""];
  9569.                     $conf = $this->em->getRepository(TypeConfidentialite::class)->findOneBy(array("niveau"=>1));
  9570.                     if(is_null($conf)) return ["message"=>"type confidentialite not found","statut"=>false,"code"=>""];
  9571.                     $actor = $this->em->getRepository(ActeurExterne::class)->findOneBy(array("telephone"=>trim($r[3])));
  9572.                     $receiver = $this->em->getRepository(User::class)->findOneBy(array("email"=>trim($r[4])));
  9573.                     //if(is_null($receiver) && is_null($actor)) return ["message"=>"receiver not found","statut"=>false,"code"=>""];
  9574.                     if(is_null($receiver)) return ["message"=> "receiver : ".trim($r[4]) ." not found","statut"=>false,"code"=>""];
  9575.                     if(is_null($actor)) return ["message"=>"actor : ".trim($r[3])." not found","statut"=>false,"code"=>""];
  9576.                     // $sender= $this->em->getRepository(User::class)->findOneBy(array("email"=>trim($r[5])));
  9577.                     // if(is_null($sender)) return ["message"=>"receiver not found","statut"=>false,"code"=>""];
  9578.                     $coursier = $this->em->getRepository(Courtier::class)->findOneBy(['id'=>1]);
  9579.                     if(is_null($coursier)) {
  9580.                         $coursier = $this->em->getRepository(Courtier::class)->findOneBy(['nom'=>"internal"]);
  9581.                     }
  9582.                     if(is_null($coursier)){
  9583.                         return ["message"=>"Default system Courier not in database / courtier par defaut non disponible dans la base de donnée","statut"=>false,"code"=>""];
  9584.                     }
  9585.                     $priorite = $this->em->getRepository(Priorite::class)->findOneBy(['id'=>1]);
  9586.                     $dossier = new Courrier();
  9587.                     $dossier->setTypeCourrier($type);
  9588.                     $dossier->setObjet(trim($r[5]));
  9589.                     $dossier->setContenu(trim($r[6]));
  9590.                     $dossier->setInternalReference(trim($r[0]));
  9591.                     $dossier->setReference($this->generateReference()["data"]);
  9592.                     $dossier->setConfidentialite($conf);
  9593.                     $dossier->setUser($this->currenUser );
  9594.                     $dossier->setDestinataire($receiver);
  9595.                     $dossier->setActeur($actor);
  9596.                     $dossier->setCourtier($coursier);
  9597.                     $dossier->setPriorite($priorite);
  9598.                     if(intval(strtolower(trim($data["type"])))==0){
  9599.                         $dossier->setType(0);
  9600.                     }else{
  9601.                         $dossier->setType(1);
  9602.                     }
  9603.                     $dossier->setIsWaiting(1);
  9604.                     try{
  9605.                         $df = $r[2];
  9606.                         $dossier->setDateEnreg(\DateTime::createFromFormat('d/m/Y',$df));
  9607.                         $this->em->persist($dossier);
  9608.                         if(!is_null($operation))
  9609.                         {
  9610.                             $log = new Log();
  9611.                             $log->setOperation($operation);
  9612.                             $log->setUser($this->currenUser);
  9613.                             $log->setObservation($dossier->getId());
  9614.                             $this->em->persist($log);
  9615.                         }
  9616.                     }
  9617.                     catch (\Exception $e)
  9618.                     {
  9619.                         //return ["message"=>$e->getMessage()." ".$e->getFile()."line ".$e->getLine() ,"statut"=>false,"code"=>401];
  9620.                         return ["message"=>$e->getMessage().$e->getLine() ,"statut"=>false,"code"=>401];
  9621.                     }
  9622.                     catch (\Error $e)
  9623.                     {
  9624.                         //return ["message"=>$e->getMessage()." ".$e->getFile()."line ".$e->getLine() ,"statut"=>false,"code"=>401];
  9625.                         return ["message"=>$e->getMessage() ,"statut"=>false,"code"=>401];
  9626.                     }
  9627.                 }else{
  9628.                     return ["message"=>$this->container->get('translator')->trans('file_incorrect'),"statut"=>false,"code"=>401];
  9629.                 }
  9630.             }
  9631.         }
  9632.         try{
  9633.             $this->em->flush();
  9634.             $this->em->getConnection()->commit();
  9635.         }
  9636.         catch (\Exception $e)
  9637.         {
  9638.             $this->em->getConnection()->rollBack();
  9639.             return ["message"=>$e->getMessage()." ".$e->getFile()."line ".$e->getLine(),"statut"=>false,"code"=>401];
  9640.         }
  9641.         fclose($fp);
  9642.         unlink($f);
  9643.         $j--;
  9644.         return ["message"=>$this->container->get('translator')->trans("folder_saved")." : ".$j,"statut"=>true, "code"=>201,"data"=>[]];
  9645.     }
  9646.     public function simpleSearchMail(array $data)
  9647.     {
  9648.         if(!array_key_exists("keywords",$data)) return ["message"=>"keywords field is required","statut"=>false,"code"=>401];
  9649.         $q = $data["keywords"];
  9650.         $level = $this->currenUser->getLevel();
  9651.         $res =  $this->container->get(FOSElasticSearchServiceMail::class)->search($q,$level);
  9652.         // $res = $this->em->getRepository(Dossier::class)->findSimple($level, $data['keywords']);
  9653.         $all=[];
  9654.         foreach ($res as $d)
  9655.         {
  9656.             $all[]=$d->getMiniArray();
  9657.         }
  9658.         return ["message"=>"","data"=>$all, "statut"=>true,"code"=>201];
  9659.     }
  9660.     public function simpleSearchAttachment(array $data)
  9661.     {
  9662.         if(!array_key_exists("keywords",$data)) return ["message"=>"keywords field is required","statut"=>false,"code"=>401];
  9663.         $q = $data["keywords"];
  9664.         $level = $this->currenUser->getLevel();
  9665.         $res =  $this->container->get(FOSElasticSearchAttachmentService::class)->search($q,$level);
  9666.         // $res = $this->em->getRepository(Dossier::class)->findSimple($level, $data['keywords']);
  9667.         $all=[];
  9668.         foreach ($res as $d)
  9669.         {
  9670.             $all[]=$d->toArrayForSearch();
  9671.         }
  9672.         return ["message"=>"","data"=>$all, "statut"=>true,"code"=>201];
  9673.     }
  9674.     public function markMailAsOk(array $data)
  9675.     {
  9676.         if(!array_key_exists("id",$data)) return ["message"=>"id field is required","statut"=>false,"code"=>401];
  9677.         $dossier = $this->em->getRepository(Courrier::class)->findOneBy(array("id"=>$data["id"]));
  9678.         if(is_null($dossier)) return ["message"=>"Mail not found","statut"=>false,"code"=>401];
  9679.         $dossier->setIsWaiting(false);
  9680.         $this->em->persist($dossier);
  9681.         $this->em->flush();
  9682.         return ["message"=>"operation_done","data"=>$dossier->toArray(), "statut"=>true,"code"=>201];
  9683.     }
  9684.     public function allUserExecptAdminAndCurrent(array $data)
  9685.     {
  9686.         $users = $this->em->getRepository(User::class)->loadAllUsersExecptAdminAndCurrent($this->currentUser->getId());
  9687.         $tab = [];
  9688.         foreach ($users as $u){
  9689.             $tab[]=$u->toArray();
  9690.         }
  9691.         return ["message"=>"","statut"=>true,"data"=>$tab];
  9692.     }
  9693.     public function registerInternalMail(array $data){
  9694.         $user = $this->currenUser;
  9695.         $req=['confi','priorite','receiver','type','contenu','titre','reference','date_enreg','files','ref_int'];
  9696.         $reqObli=['confi','priorite','receiver','type','titre','reference','date_enreg'];
  9697.         foreach ($req as $val)
  9698.         {
  9699.             if(!array_key_exists($val,$data)) {
  9700.                 return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  9701.             }
  9702.             else{
  9703.                 if(in_array($val,$reqObli) && strlen($data[$val]) ===0){
  9704.                     return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  9705.                 }
  9706.             }
  9707.         }
  9708.         $confi = $this->em->getRepository(TypeConfidentialite::class)->findOneBy(array('id' =>$data['confi']));
  9709.         if($confi === null) return ["message"=>" Type confidentialite not found","statut"=>false,"code"=>""];
  9710.         $priorite = $this->em->getRepository(Priorite::class)->findOneBy(array('id' =>$data['priorite']));
  9711.         if($priorite === null) return ["message"=>" Priorite not found","statut"=>false,"code"=>""];
  9712.         $type = $this->em->getRepository(TypeCourrier::class)->findOneBy(array('id' =>$data['type']));
  9713.         if($type === null) return ["message"=>" Type courrier not found","statut"=>false,"code"=>""];
  9714.         $receiver = $this->em->getRepository(User::class)->findOneBy(array('id' =>$data['receiver']));
  9715.         if($receiver === null) return ["message"=>" Destinataire not found","statut"=>false,"code"=>""];
  9716.         $broker = $this->em->getRepository(Courtier::class)->findOneBy(array('nom' =>"internal"));
  9717.         if($broker === null) {
  9718.             $broker = new Courtier();
  9719.             $broker->setNom('internal');
  9720.             $broker->setCni('00000000000');
  9721.             $broker->setTelephone('00000000000');
  9722.             $broker->setIsActive(false);
  9723.             $this->em->persist($broker);
  9724.             $this->em->flush();
  9725.         }
  9726.         $old = $this->em->getRepository(Courrier::class)->findOneBy(['reference'=>$data['reference']]);
  9727.         if($old !== null) return ["message"=>$this->container->get('translator')->trans("reference already used"),"statut"=>false,"code"=>""];
  9728.         $courrier = new Courrier();
  9729.         $courrier->setType(Courrier::COURRIER_INTERNE);
  9730.         $courrier->setConfidentialite($confi);
  9731.         $courrier->setPriorite($priorite);
  9732.         $courrier->setDestinataire($receiver);
  9733.         $courrier->setUser($user);
  9734.         $courrier->setEmetteur($user);
  9735.         $courrier->setTypeCourrier($type);
  9736.         $courrier->setCourtier($broker);
  9737.         $courrier->setReference($data['reference']);
  9738.         $courrier->setInternalReference($data['ref_int']);
  9739.         $courrier->setContenu($data['contenu']);
  9740.         $courrier->setObjet($data['titre']);
  9741.         $courrier->setStatut(Courrier::STATUT_NOUVEAU);
  9742.         $courrier->setDateCloture(new \DateTime());
  9743.         $courrier->setDateEnreg(\DateTime::createFromFormat('d/m/Y',$data['date_enreg']));
  9744.         foreach ($data["files"] as $f)
  9745.         {
  9746.             $file = new Fichier();
  9747.             $file->setNom($f["name"]);
  9748.             $file->setFolderNameAndName($courrier->getObjet()." | ". $f["name"]);
  9749.             $file->setExtension($f["extension"]);
  9750.             $file->setType($f["type"]);
  9751.             $file->setTaille($f["size"]);
  9752.             $file->setPath($f["path"]);
  9753.             $file->setAuteur($user->getNom()." ".$user->getPrenom());
  9754.             $file->setCourrier($courrier);
  9755.             $courrier->addFichier($file);
  9756.         }
  9757.         if($user->getId() !== $receiver->getId()){
  9758.             $notif = new Notification();
  9759.             $notif->setCourrier($courrier);
  9760.             $notif->setCode(Notification::NEW_INTERNAL_MAIL);
  9761.             $notif->setUser($user);
  9762.             $statut = new Statut();
  9763.             $statut->setUser($receiver);
  9764.             $statut->setNotification($notif);
  9765.             $notif->addStatut($statut);
  9766.             $this->em->persist($notif);
  9767.         }
  9768.         $this->em->persist($courrier);
  9769.         $this->em->flush();
  9770.         $log = new Log();
  9771.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'1003'));
  9772.         if($operation !== null)
  9773.         {
  9774.             $log->setOperation($operation);
  9775.             $log->setUser($user);
  9776.             $log->setObservation($courrier->getId());
  9777.             $this->em->persist($log);
  9778.             $this->em->flush();
  9779.         }
  9780.         return ["message"=>"","statut"=>true,"data"=>$courrier->toArray()];
  9781.     }
  9782.     public function editInternalMail(array $data){
  9783.         $user = $this->currenUser;
  9784.         $req=['id','confi','priorite','type','contenu','titre','date_enreg','added_files','remove_files','ref_int'];
  9785.         $reqObli=['confi','priorite','type','titre','date_enreg'];
  9786.         foreach ($req as $val)
  9787.         {
  9788.             if(!array_key_exists($val,$data)) {
  9789.                 return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  9790.             }
  9791.             else{
  9792.                 if(in_array($val,$reqObli) && strlen($data[$val]) ===0){
  9793.                     return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  9794.                 }
  9795.             }
  9796.         }
  9797.         $courrier = $this->em->getRepository(Courrier::class)->findOneBy(array("id"=>$data["id"]));
  9798.         if($courrier === null) return ["message"=>"courrier not found","statut"=>false,"code"=>401];
  9799.         $confi = $this->em->getRepository(TypeConfidentialite::class)->findOneBy(array('id' =>$data['confi']));
  9800.         if($confi === null) return ["message"=>" Type confidentialite not found","statut"=>false,"code"=>""];
  9801.         $priorite = $this->em->getRepository(Priorite::class)->findOneBy(array('id' =>$data['priorite']));
  9802.         if($priorite === null) return ["message"=>" Priorite not found","statut"=>false,"code"=>""];
  9803.         $type = $this->em->getRepository(TypeCourrier::class)->findOneBy(array('id' =>$data['type']));
  9804.         if($type === null) return ["message"=>" Type courrier not found","statut"=>false,"code"=>""];
  9805.         $courrier->setConfidentialite($confi);
  9806.         $courrier->setPriorite($priorite);
  9807.         $courrier->setTypeCourrier($type);
  9808.         $courrier->setInternalReference($data['ref_int']);
  9809.         $courrier->setContenu($data['contenu']);
  9810.         $courrier->setObjet($data['titre']);
  9811.         $courrier->setDateEnreg(\DateTime::createFromFormat('d/m/Y',$data['date_enreg']));
  9812.         foreach ($data["remove_files"] as $id)
  9813.         {
  9814.             $file = $this->em->getRepository(Fichier::class)->findOneBy(array("id"=>$id));
  9815.             if($file !== null)
  9816.             {
  9817.                 $courrier->removeFichier($file);
  9818.             }
  9819.         }
  9820.         foreach ($data["added_files"] as $f)
  9821.         {
  9822.             $file = new Fichier();
  9823.             $file->setNom($f["name"]);
  9824.             $file->setFolderNameAndName($courrier->getObjet()." | ". $f["name"]);
  9825.             $file->setExtension($f["extension"]);
  9826.             $file->setType($f["type"]);
  9827.             $file->setTaille($f["size"]);
  9828.             $file->setPath($f["path"]);
  9829.             $file->setAuteur($user->getNom()." ".$user->getPrenom());
  9830.             $file->setCourrier($courrier);
  9831.             $courrier->addFichier($file);
  9832.         }
  9833.         /*if(count($data['attached_files'])>0){
  9834.             foreach($courrier->getPieceJointeAjoutees() as $i){
  9835.                 if(in_array($i->getId(),$data['attached_files'])){
  9836.                     $i->setStatus(1);
  9837.                 }else{
  9838.                     $i->setStatus(0)  ;
  9839.                 }
  9840.                 $courrier->addPieceJointeAjoutee($i);
  9841.             }
  9842.         }else{
  9843.             foreach($courrier->getPieceJointeAjoutees() as $i){
  9844.                 $i->setStatus(0)  ;
  9845.                 $courrier->addPieceJointeAjoutee($i);
  9846.             }
  9847.         }*/
  9848.         $this->em->persist($courrier);
  9849.         $this->em->flush();
  9850.         $log = new Log();
  9851.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'1021'));
  9852.         if($operation !== null)
  9853.         {
  9854.             $log->setOperation($operation);
  9855.             $log->setUser($user);
  9856.             $log->setObservation($courrier->getId());
  9857.             $this->em->persist($log);
  9858.             $this->em->flush();
  9859.         }
  9860.         return ["message"=>"","statut"=>true,"data"=>$courrier->toArray()];
  9861.     }
  9862.     public function mailHistory(array $data)
  9863.     {
  9864.         if(!array_key_exists("id",$data))
  9865.         {
  9866.             return ["message"=>"id is missing","statut"=>false,"data"=>[],"code"=>401];
  9867.         }
  9868.         else
  9869.         {
  9870.             $mail = $this->em->getRepository(Courrier::class)->findOneBy(array("id"=>$data["id"]));
  9871.             if($mail === null) return ["message"=>"courrier not found","statut"=>false,"data"=>[],"code"=>401];
  9872.             else
  9873.             {
  9874.                 $collabo = $this->em->getRepository(CourrierCollaborateur::class)->findBy(['courrier'=>$mail,'isActive'=>1],['date'=>'DESC']);
  9875.                 $co = [];
  9876.                 foreach ($collabo as $c)
  9877.                 {
  9878.                     $co[]=$c->toArray();
  9879.                 }
  9880.                 if($mail->getStatut()=== Courrier::STATUT_NOUVEAU){
  9881.                     if($this->currenUser->getId() === $mail->getDestinataire()->getId()){
  9882.                         $mail->setStatut(Courrier::STATUT_EN_COURS);
  9883.                         $this->em->persist($mail);
  9884.                         $this->em->flush();
  9885.                     }
  9886.                 }
  9887.                 $tasks = $this->em->getRepository(Tache::class)->findBy(['courrier'=>$mail,'isActive'=>1],['date'=>'DESC']);
  9888.                 $ts = [];
  9889.                 foreach ($tasks as $c)
  9890.                 {
  9891.                     $ts[]=$c->toArray();
  9892.                 }
  9893.                 return ["message"=>"","statut"=>true,"data"=>['mail'=>$mail->toArray(),'taches'=>$ts,'collabo'=>$co],"code"=>201];
  9894.             }
  9895.         }
  9896.     }
  9897.     public function createArticle(array $data){
  9898.         $req=["title","content"];
  9899.         foreach ($req as $el)
  9900.         {
  9901.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>""];
  9902.         }
  9903.         if(strlen($data["title"])===0) return ["message"=>"title field is empty","statut"=>false,"code"=>""];
  9904.         $b= new Article();
  9905.         $b->setTitle($data["title"]);
  9906.         $b->setContent($data["content"]);
  9907.         $b->setUser($this->currenUser);
  9908.         $b->addRelatedUser($this->currenUser);
  9909.         if(array_key_exists("file",$data)&&array_key_exists("name",$data["file"]))
  9910.         {
  9911.             $b->setImageCover($data["file"]["name"]);
  9912.         }
  9913.         $this->em->persist($b);
  9914.         $this->em->flush();
  9915.         return ["message"=>"","statut"=>true,"data"=>$b->toArray()];
  9916.     }
  9917.     public function editArticle(array $data)
  9918.     {
  9919.         $req=["id","title","content"];
  9920.         foreach ($req as $el)
  9921.         {
  9922.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>""];
  9923.         }
  9924.         if(strlen($data["title"])===0) return ["message"=>"title field is empty","statut"=>false,"code"=>""];
  9925.         $b= $this->em->getRepository(Article::class)->findOneBy(array("id"=>$data["id"]));
  9926.         if($b === null) return ["message"=>"subject not found","statut"=>false,"code"=>""];
  9927.         $b->setTitle($data["title"]);
  9928.         $b->setContent($data["content"]);
  9929.         $b->setUser($this->currenUser);
  9930.         if(array_key_exists("file",$data)&&array_key_exists("name",$data["file"]))
  9931.         {
  9932.             $b->setImageCover($data["file"]["name"]);
  9933.         }
  9934.         $this->em->persist($b);
  9935.         $this->em->flush();
  9936.        $log = new Log();
  9937.         $operation = $this->em->getRepository(Operation::class)->findOneBy(array("code"=>'MVT77'));
  9938.         if($operation !== null)
  9939.         {
  9940.             $log->setOperation($operation);
  9941.             $log->setUser($this->currenUser);
  9942.             $log->setObservation($b->getId());
  9943.             $this->em->persist($log);
  9944.             $this->em->flush();
  9945.         }
  9946.         return ["message"=>"","statut"=>true,"data"=>$b->toArray()];
  9947.     }
  9948.     public function commentArticle(array $data): array
  9949.     {
  9950.         $req=["id","content"];
  9951.         foreach ($req as $el)
  9952.         {
  9953.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>""];
  9954.         }
  9955.         if(strlen($data["content"])===0) return ["message"=>"content field is empty","statut"=>false,"code"=>""];
  9956.         $b= $this->em->getRepository(Article::class)->findOneBy(array("id"=>$data["id"]));
  9957.         if($b === null) return ["message"=>"subject not found","statut"=>false,"code"=>""];
  9958.         $comment = new Comment();
  9959.         $comment->setArticle($b);
  9960.         $comment->setContent($data['content']);
  9961.         $comment->setUser($this->currenUser);
  9962.         $b->setNbComment($b->getNbComment()+1);
  9963.         $b->addComment($comment);
  9964.         $relatedUsers = $b->getRelatedUsers();
  9965.         if(!$relatedUsers->contains($this->currenUser)){
  9966.             $b->addRelatedUser($this->currenUser);
  9967.         }
  9968.         $this->em->persist($b);
  9969.         $this->em->flush();
  9970.         $relatedUsers = $b->getRelatedUsers();
  9971.         $notif = new Notification();
  9972.         $notif->setUser($this->currenUser);
  9973.         $notif->setArticle($b);
  9974.         $notif->setCode(Notification::NEW_COMMENT);
  9975.         foreach ($relatedUsers as $uw){
  9976.             if($uw->getId() != $this->currenUser->getId())
  9977.             {
  9978.                 $status = new Statut();
  9979.                 $status->setNotification($notif);
  9980.                 $status->setUser($uw);
  9981.                 $notif->addStatut($status);
  9982.             }
  9983.         }
  9984.         $this->em->persist($notif);
  9985.         $this->em->flush();
  9986.         return ["message"=>"","statut"=>true,"data"=>$comment->toArray()];
  9987.     }
  9988.     public function commentComment(array $data): array
  9989.     {
  9990.         $req=["id","content"];
  9991.         foreach ($req as $el)
  9992.         {
  9993.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>""];
  9994.         }
  9995.         if(strlen($data["content"])===0) return ["message"=>"content field is empty","statut"=>false,"code"=>""];
  9996.         $com= $this->em->getRepository(Comment::class)->findOneBy(array("id"=>$data["id"]));
  9997.         if($com === null) return ["message"=>"comment not found","statut"=>false,"code"=>""];
  9998.         $b = $com->getArticle();
  9999.         $comment = new Comment();
  10000.         $comment->setParent($com);
  10001.         $comment->setContent($data['content']);
  10002.         $comment->setUser($this->currenUser);
  10003.         $b->setNbComment($b->getNbComment()+1);
  10004.         $com->setNbComment($com->getNbComment()+1);
  10005.         $com->addComment($comment);
  10006.         $relatedUsers = $b->getRelatedUsers();
  10007.         if(!$relatedUsers->contains($this->currenUser)){
  10008.             $b->addRelatedUser($this->currenUser);
  10009.         }
  10010.         $this->em->persist($b);
  10011.         $this->em->persist($com);
  10012.         $this->em->flush();
  10013.         $notif = new Notification();
  10014.         $notif->setUser($this->currenUser);
  10015.         $notif->setArticle($b);
  10016.         $notif->setCode(Notification::NEW_COMMENT);
  10017.         $relatedUsers = $b->getRelatedUsers();
  10018.         foreach ($relatedUsers as $uw){
  10019.             if($uw->getId() != $this->currenUser->getId()){
  10020.                 $status = new Statut();
  10021.                 $status->setNotification($notif);
  10022.                 $status->setUser($uw);
  10023.                 $notif->addStatut($status);
  10024.             }
  10025.         }
  10026.         $this->em->persist($notif);
  10027.         $this->em->flush();
  10028.         return ["message"=>"","statut"=>true,"data"=>$comment->toArray()];
  10029.     }
  10030.     public function getComments(array $data): array
  10031.     {
  10032.         $req=["id","limit","offset"];
  10033.         foreach ($req as $el)
  10034.         {
  10035.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>""];
  10036.         }
  10037.         $article= $this->em->getRepository(Article::class)->findOneBy(array("id"=>$data["id"]));
  10038.         if($article === null) return ["message"=>"Subject not found","statut"=>false,"code"=>""];
  10039.         $comments = $this->em->getRepository( Comment::class )->findBy( [ 'article' => $article ], [
  10040.             'isActive' => 'DESC',
  10041.             'date'     => 'DESC'
  10042.         ], $data['limit'], $data['offset'] );
  10043.         $result = [];
  10044.         foreach ($comments as $com){
  10045.             $result[]=$com->toArray();
  10046.         }
  10047.         return ["message"=>"","statut"=>true,"data"=>$result];
  10048.     }
  10049.     public function simpleSearchArticle(array $data)
  10050.     {
  10051.         if(!array_key_exists("keywords",$data)) return ["message"=>"keywords field is required","statut"=>false,"code"=>401];
  10052.         $q = $data["keywords"];
  10053.         $res =  $this->container->get(FOSElasticSearchServiceArticle::class)->search($q);
  10054.         // $res = $this->em->getRepository(Dossier::class)->findSimple($level, $data['keywords']);
  10055.         return ["message"=>"","data"=>$res, "statut"=>true,"code"=>201];
  10056.     }
  10057.     
  10058.     public function getExternalMail(array $data){
  10059.         $cm = new ClientManager([]);
  10060.         
  10061. }
  10062.     public function moveFiles(array $data): array
  10063.     {
  10064.         $user = $this->currenUser;
  10065.         $req=['ids','folder',"type"];
  10066.         foreach ($req as $val)
  10067.         {
  10068.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  10069.         }
  10070.         if(!in_array($data["type"],["file","folder"])){
  10071.             return ["message"=>"bad move type","statut"=>false,"code"=>""];
  10072.         }
  10073.         if($data["type"] === "file"){
  10074.             $files = [];
  10075.             foreach ($data['ids'] as $item){
  10076.                 $file = $this->em->getRepository(Fichier::class)->findOneBy(['id'=>$item]);
  10077.                 if($file === null) return ['message' =>$this->container->get('translator')->trans('file_not_found')." ".$item,"statut"=>false,"code"=>401];
  10078.                 $files[] = $file;
  10079.             }
  10080.             $folder= $this->em->getRepository(Dossier::class)->findOneBy(['reference'=>$data['folder']]);
  10081.             if($folder === null) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>401];
  10082.             $folderToIndex = [];
  10083.             foreach ($files as $file){
  10084.                 $mainFolder = $file->getDossier();
  10085.                 if($mainFolder!==null){
  10086.                     $mainFolder->removeFichier($file);
  10087.                     $folderToIndex[] = $mainFolder;
  10088.                     $this->em->persist($mainFolder);
  10089.                 }
  10090.                 if(!$folder->getFichiers()->contains($file)){
  10091.                     $folder->addFichier($file);
  10092.                     $file->setDossier($folder);
  10093.                 }
  10094.             }
  10095.             $this->em->persist($folder);
  10096.             $this->em->flush();
  10097.             $this->indexer->replaceMany($folderToIndex);
  10098.             $this->indexer->replaceOne($folder);
  10099.         }else{
  10100.             $folders = [];
  10101.             foreach ($data['ids'] as $item){
  10102.                 $f = $this->em->getRepository(Dossier::class)->findOneBy(['id'=>$item]);
  10103.                 if($f === null) return ['message' =>$this->container->get('translator')->trans('folder_not_found')." ".$item,"statut"=>false,"code"=>401];
  10104.                 $folders[] = $f;
  10105.             }
  10106.             $folder= $this->em->getRepository(Dossier::class)->findOneBy(['reference'=>$data['folder']]);
  10107.             if($folder === null) return ['message' =>$this->container->get('translator')->trans('folder_not_found'),"statut"=>false,"code"=>401];
  10108.             $folderToIndex = [];
  10109.             foreach ($folders as $f){
  10110.                 $mainFolder = $f->getDossierParent();
  10111.                 if($mainFolder!==null){
  10112.                     $mainFolder->removeSousDossier($f);
  10113.                     $folderToIndex[] = $mainFolder;
  10114.                     $this->em->persist($mainFolder);
  10115.                 }
  10116.                 if(!$folder->getSousDossiers()->contains($f)){
  10117.                     $folder->addSousDossier($f);
  10118.                     $f->setDossierParent($folder);
  10119.                 }
  10120.             }
  10121.             $this->em->persist($folder);
  10122.             $this->em->flush();
  10123.             if(count($folderToIndex)>0){
  10124.                 $this->indexer->replaceMany($folderToIndex);
  10125.             }
  10126.             $this->indexer->replaceOne($folder);
  10127.         }
  10128.         return ["message"=>"","statut"=>true,"data"=>[]];
  10129.     }
  10130.     public function advancedSearchMailExt(array $data)
  10131.     {
  10132.         $req=["titre","type_courrier","reference","start_date","end_date"];
  10133.         foreach ($req as $el)
  10134.         {
  10135.             if(!array_key_exists($el,$data)) return ["message"=>$el." field is required","statut"=>false,"code"=>401];
  10136.         }
  10137.         if($data["start_date"]!="")
  10138.         {
  10139.             if(preg_match("/^[a-zA-Z]+$/", $data["start_date"])==false){
  10140.                 $d = \DateTime::createFromFormat('d/m/Y',$data["start_date"]);
  10141.                 $data["start_date"] =$d->format("Y-m-d")." 00:00:01";
  10142.                 $data["start_date_1"] =$d->format("Y-m-d");
  10143.                 $data["start_date_2"] =$d->format("Y-m-d")." 23:59:59";
  10144.             }
  10145.         }
  10146.         if($data["end_date"]!="")
  10147.         {
  10148.             if(preg_match("/^[a-zA-Z]+$/", $data["end_date"])==false){
  10149.                 $d = \DateTime::createFromFormat('d/m/Y',$data["end_date"]);
  10150.                 $data["end_date"] =$d->format("Y-m-d")." 00:00:01";
  10151.                 $data["end_date_1"] =$d->format("Y-m-d");
  10152.                 $data["end_date_2"] =$d->format("Y-m-d")." 23:59:59";
  10153.             }
  10154.         }
  10155.         //$da = $this->em->getRepository(Dossier::class)->findAdvanced($level,$data);
  10156.         $level = $this->currenUser->getLevel();
  10157.         try {
  10158.             $da =  $this->container->get(FOSElasticSearchServiceMail::class)->searchAdvancedMailExt($data,$level);
  10159.         }
  10160.         catch (\Exception $e){
  10161.             return ["message"=>$e->getMessage()." ".$e->getLine(),"data"=>[], "statut"=>false,"code"=>401];
  10162.         }
  10163.         $res=[];
  10164.         foreach ($da as $d)
  10165.         {
  10166.             $res[]=$d->toArray();
  10167.         }
  10168.         return ["message"=>"operation_done","data"=>$res, "statut"=>true,"code"=>201];
  10169.     }
  10170.     public function simpleSearchMailExt(array $data)
  10171.     {
  10172.         if(!array_key_exists("keywords",$data)) return ["message"=>"keywords field is required","statut"=>false,"code"=>401];
  10173.         $q = $data["keywords"];
  10174.         $level = $this->currenUser->getLevel();
  10175.         $res =  $this->container->get(FOSElasticSearchServiceMail::class)->searchExt($q,$level);
  10176.         // $res = $this->em->getRepository(Dossier::class)->findSimple($level, $data['keywords']);
  10177.         $all=[];
  10178.         foreach ($res as $d)
  10179.         {
  10180.             $all[]=$d->getMiniArray();
  10181.         }
  10182.         return ["message"=>"","data"=>$all, "statut"=>true,"code"=>201];
  10183.     }
  10184.     public function uploadMultiplePdfs($file,$bordereau)
  10185.     {
  10186.         if (!$file) {
  10187.             return ["message" => $this->container->get('translator')->trans("empty_file"), "statut" => false];
  10188.         }
  10189.         // Validate file type
  10190.         if ($file->getMimeType() !== 'application/pdf') {
  10191.             return ["message" => $this->container->get('translator')->trans("file_must_be_pdf"), "statut" => false];
  10192.         }
  10193.         // Validate file size (50 MB max)
  10194.         $SIZE =  $this->container->getParameter('app.upload.size')!==null?$this->container->getParameter('app.upload.size'):10; // 10 MB default
  10195.         $maxSize = $SIZE * 1024 * 1024;
  10196.         if ($file->getSize() > $maxSize) {
  10197.             return ["message" => $this->container->get('translator')->trans("file_exceeds_size_limit").$SIZE." MB", "statut" => false];
  10198.         }
  10199.         // Parse folder reference and file name from filename
  10200.         // Format: FOLDER_REFERENCE__FILE_NAME.pdf
  10201.         $originalFilename = $file->getClientOriginalName();
  10202.         $parts = explode('__', $originalFilename);
  10203.         if (count($parts) < 2) {
  10204.             return [
  10205.                 "message" => $this->container->get('translator')->trans("invalid_file_name_upload"),
  10206.                 "statut" => false
  10207.             ];
  10208.         }
  10209.         $folderReference = $parts[0];
  10210.         $dossier = $this->em->getRepository(Dossier::class)->findOneBy(['refInterne' => $folderReference]);
  10211.         if($dossier === null) return ["message" => $this->container->get('translator')->trans("folder_not_found"), "statut" => false];
  10212.         $fileName = implode('__', array_slice($parts, 1)); // In case there are multiple '__' in the filename
  10213.         $fileName = str_replace('_', ' ', $fileName);
  10214.         try {
  10215.             // Upload the file
  10216.             $fu = $this->container->get("upload_service");
  10217.             $uploadResult = $fu->upload($file);
  10218.             if (!$uploadResult["statut"]) {
  10219.                 return $uploadResult;
  10220.             }
  10221.             // Convert and save the file
  10222.             $fu->convertAndSave($uploadResult["file"]);
  10223.             $fi = $uploadResult["file"];
  10224.             $cu = $this->currenUser;
  10225.             $file = new Fichier();
  10226.             $file->setNom($fileName);
  10227.             $file->setFolderNameAndName($dossier->getTitre()." | ". $fileName);
  10228.             $file->setExtension($fi["extension"]);
  10229.             $file->setType($fi["type"]);
  10230.             $file->setTaille($fi["size"]);
  10231.             $file->setPath($fi["path"]);
  10232.             $file->setAuteur($cu->getNom()." ".$cu->getPrenom());
  10233.             $file->setDossier($dossier);
  10234.             $dossier->addFichier($file);
  10235.             $this->em->persist($dossier);
  10236.             $this->em->flush();
  10237.             return [
  10238.                 "message" => $this->container->get('translator')->trans('upload_success'),
  10239.                 "statut" => true,
  10240.                 "data" => [
  10241.                     "file" => $uploadResult["file"],
  10242.                     "folderReference" => $folderReference,
  10243.                     "fileName" => $fileName,
  10244.                     "bordereau" => $bordereau
  10245.                 ]
  10246.             ];
  10247.         } catch (\Exception $e) {
  10248.             return [
  10249.                 "message" => $this->container->get('translator')->trans('upload_failed'). $e->getMessage(),
  10250.                 "statut" => false
  10251.             ];
  10252.         }
  10253.     }
  10254.     public function createArchiveLocation(array $data)
  10255.     {
  10256.         $req=["code"];
  10257.         foreach ($req as $val)
  10258.         {
  10259.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  10260.             else
  10261.             {
  10262.                 if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  10263.             }
  10264.         }
  10265.         if(strlen($data['code'])<2) return ["message"=>$this->container->get('translator')->trans("archive_depot_min_length"),"statut"=>false,"code"=>""];
  10266.         if(strlen($data['code'])>30) return ["message"=>$this->container->get('translator')->trans("archive_depot_max_length"),"statut"=>false,"code"=>""];
  10267.         $old = $this->em->getRepository(ArchiveLocation::class)->findOneBy(['isActive'=>true,'code'=>$data['code']]);
  10268.         if($old !== null) return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  10269.         $r = new ArchiveLocation();
  10270.         $r->setCode($data["code"]);
  10271.         $this->em->persist($r);
  10272.         $this->em->flush();
  10273.         return ["message"=>"","statut"=>true,"data"=>$r->toArray()];
  10274.     }
  10275.     public function editArchiveLocation(array $data)
  10276.     {
  10277.         $req=["id","code"];
  10278.         foreach ($req as $val)
  10279.         {
  10280.             if(!array_key_exists($val,$data)) return ["message"=>$val." field is required","statut"=>false,"code"=>""];
  10281.             else
  10282.             {
  10283.                 if(strlen($data[$val])<1) return ["message"=>$val." field is empty","statut"=>false,"code"=>""];
  10284.             }
  10285.         }
  10286.         if(strlen($data['code'])<2) return ["message"=>$this->container->get('translator')->trans("archive_depot_min_length"),"statut"=>false,"code"=>""];
  10287.         if(strlen($data['code'])>30) return ["message"=>$this->container->get('translator')->trans("archive_depot_max_length"),"statut"=>false,"code"=>""];
  10288.         $salle = $this->em->getRepository(ArchiveLocation::class)->findOneBy(array("id"=>$data["id"]));
  10289.         if($salle === null) return ["message"=>"Archive location not found","statut"=>false,"code"=>""];
  10290.         $old = $this->em->getRepository(ArchiveLocation::class)->findBy(['isActive'=>true,'code'=>$data['code']]);
  10291.         foreach ($old as $el ){
  10292.             if($el->getId() !== $salle->getId()) return ["message"=>$data["code"]." ".$this->container->get('translator')->trans("already_exist"),"statut"=>false,"code"=>401];
  10293.         }
  10294.         $salle->setCode($data["code"]);
  10295.         $this->em->persist($salle);
  10296.         $this->em->flush();
  10297.         return ["message"=>"","statut"=>true,"data"=>$salle->toArray()];
  10298.     }
  10299.     public function getSalleArchiveLocation(array $data)
  10300.     {
  10301.         if(!array_key_exists("id",$data))
  10302.         {
  10303.             return ["message"=>"type or id is missing","statut"=>false,"data"=>[],"code"=>401];
  10304.         }
  10305.         $salles = $this->em->getRepository(Salle::class)->findBy(array("archiveLocation"=>$data["id"]));
  10306.         $res=[];
  10307.         foreach ($salles as $r)
  10308.         {
  10309.             if($r->getIsActive())$res[]=$r->toArray();
  10310.         }
  10311.         return ["message"=>"","statut"=>true,"data"=>$res,"code"=>201];
  10312.     }
  10313. }