src/Controller/VCardController.php line 942

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Psr\Log\LoggerInterface;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use App\Entity\VCard;
  6. use App\Form\VCardType;
  7. use App\Repository\VCardRepository;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Symfony\Component\Mailer\MailerInterface;
  13. use Symfony\Component\Mime\Email;
  14. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  15. use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
  16. use Symfony\Component\Filesystem\Filesystem;
  17. use Symfony\Component\Filesystem\Path;
  18. use JeroenDesloovere\VCard\VCard as VCardFile;
  19. use chillerlan\QRCode\QRCode;
  20. use chillerlan\QRCode\QROptions;
  21. use phpCAS;
  22. use DateTime;
  23. use DateTimeZone;
  24. class VCardController extends  CustomController // AbstractController
  25. {
  26.     private    $applicationSender 'no-reply';
  27.     // private $uploadsDIR = __DIR__.'/../../public/uploads/';
  28.     private $qrcodeOutDIR __DIR__.'/../../public/uploads/';
  29.     private $pendingMailDatas = array(
  30.                         'à valider' => array(
  31.                             'subject' => '[Rappel] Carte de visite',
  32.                             'content' => 'La carte de {PRENOM} {NOM} attend votre validation, cliquez sur le lien pour accéder à la demande de validation.<br/>'
  33.                                         '<a href="{URI}/v/card/manager">'
  34.                                         'Voir...'
  35.                                     '</a><br/>'
  36.                                     '<i>Ce message a été créé automatiquement par le gestionnaire de carte de visites des Arts et Métiers, merci de ne pas y répondre.</i>'
  37.                         ),
  38.                         'enregistrée' => array('subject' => '[Rappel] Carte de visite',
  39.                         'content' => "N'oubliez-pas de soumettre votre carte de visite pour sa publication...<br/>"
  40. .'Cliquez sur le lien pour la soumettre.<br/>'
  41.                                         '<a href="{URI}/v/card/">'
  42.                                         'Voir...'
  43.                                     '</a><br/>'
  44.                                     '<i>Ce message a été créé automatiquement par le gestionnaire de carte de visites des Arts et Métiers, merci de ne pas y répondre.</i>'
  45.                         ),
  46.                         'rejetée' => array('subject' => '[Rappel] Carte de visite',
  47.                                     'content' => 'Votre carte de visite a été rejetée.<br/>'
  48.                                             .'Vous pouvez la modifier à cette adresse:<br/>'
  49.                                             '<a href="{URI}/v/card/{ID_VCARD}">'
  50.                                             'Voir...'
  51.                                         '</a><br/>'
  52.                                         '<i>Ce message a été créé automatiquement par le gestionnaire de carte de visites des Arts et Métiers, merci de ne pas y répondre.</i>'
  53. // "VALIDATE_CONTENT"
  54.                                 ),
  55.                     );
  56. function DEP_twig_json_decode($json)
  57. {
  58.     return json_decode($jsontrue);
  59. }
  60.     /**
  61.      * @Route("/v/card/", name="app_v_card_index", methods={"GET"})
  62.      */
  63.     public function index(Request $requestVCardRepository $vCardRepository): Response
  64.     {
  65.        
  66.     $session $request->getSession();
  67.     $is_auth $session->get('is_auth');
  68.     $user_email $session->get('user_email');
  69. /* 
  70.     if (isset($_GET['DBG']) && $_GET['DBG'] == '1') {
  71.         $personnel_datas = $this->getPersonnelFromEnv($session);
  72.             print(__METHOD__.' session: '.var_export($session, true).'<br/>');
  73.             print(__METHOD__.' personnel_datas: '.var_export($personnel_datas, true)); exit();
  74.         }
  75.  */
  76.     if (!$is_auth) {
  77.         $session->set('previous''app_v_card_index');
  78.         return new Response(null302, array(
  79.                 'Location'        => '/v/card/auth',
  80.         ));
  81.     } else if (isset($_GET['admin']) && $_GET['admin'] == 1) {
  82.     // echo(__METHOD__.': user_mail:'.var_export($user_email, true)); exit();
  83.         return $this->render('v_card/index.html.twig', [
  84.             'v_cards' => $vCardRepository->findAll(),
  85.     ]);
  86.     } else {
  87.         $content __METHOD__.': user not found...';
  88.         $personnel_datas $this->getPersonnelFromEnv($session);
  89.         $is_manager $session->get('is_manager'); // $this->isManager($personnel_datas, $session);
  90.         // echo(__METHOD__.': personnel_datas: '.var_export($personnel_datas, true)); exit();
  91. //*
  92.     $session_email $session->get('user_email');
  93.     $student_datas $this->getStudentDatasFromMail($session_email);
  94.     if (isset($student_datas['id.Apprenant'])) { // NOTE: student detection
  95.         header("Location: https://{$_SERVER['HTTP_HOST']}/v/student/card/show"); exit();    
  96.     }
  97.     //*/
  98.         if (isset($personnel_datas['IDE_DOSSIER'])) {
  99.             $ide_dossier $personnel_datas['IDE_DOSSIER'];
  100.             $last_card $this->getRecentVCardByIdeDossier($ide_dossier);
  101.             // $content = var_export($last_card, true);
  102.             if (isset($last_card['IDE_DOSSIER'])) {
  103.                 /*
  104.                 if ($last_card['STATUT'] == 'validé') { 
  105.                     return $this->redirectToRoute('app_v_card_last', [], Response::HTTP_SEE_OTHER);
  106.                 } else { //*/
  107.                     return $this->redirectToRoute('app_v_card_show', ['id_vcard' => $last_card['ID_VCARD']], Response::HTTP_SEE_OTHER);
  108.                 // }
  109.             } else {
  110.                         return $this->redirectToRoute('app_v_card_new', [], Response::HTTP_SEE_OTHER);
  111.             }
  112.         }
  113.         return new Response($content200, array(
  114.                     )
  115.             );
  116.     }
  117.     }
  118.     /**
  119.      * @Route("/v/card/teststudentlogin", name="app_v_card_teststudentlogin", methods={"GET"})
  120.      */
  121.     public function teststudentlogin(Request $requestVCardRepository $vCardRepository): Response {
  122.         $found $this->selectStudentEmailFromLogin($_GET['login']);
  123.         $content __METHOD__.': 'var_export($foundtrue);
  124.                 return new Response($content200, array(
  125.                                 )
  126.             );
  127.     }
  128.     /**
  129.      * @Route("/v/card/dispuser", name="app_v_card_dispuser", methods={"GET","POST"})
  130.      */
  131.     public function dispuser(Request $request): Response {
  132.         $content 'Hello';
  133. //*
  134.     // echo(__METHOD__.': hello'); exit();
  135.     $session $request->getSession();
  136.     $is_auth $session->get('is_auth');
  137.     $personnel_datas $this->getPersonnelFromEnv($session);
  138.     echo(__METHOD__.': personnel_datas: '.var_export($personnel_datastrue).'<br/>');
  139.     echo(__METHOD__.': isSelfValidator: '. (true && $this->isSelfValidator($personnel_datas)).'<br/>');
  140.     if (isset($_GET['email'])
  141.         && !empty($_GET['email'])
  142.     ) {
  143.         $user_datas $this->getPersonnelFromEmail($_GET['email']);
  144.         $content __METHOD__.': user_datas: 'var_export($user_datastrue);
  145.     }
  146.     // $content = __METHOD__.': session: '. var_export($_SESSION, true);
  147.     //*/
  148.     return new Response($content200, array(
  149.         'Content-type'        => 'text/html',
  150.         )
  151.     );
  152.     }
  153.     protected function formatPhoneNumber($phoneNumber) {
  154.         $out '';
  155.         // Format the phone number
  156.         $formattedNumber '+' substr($phoneNumber13) . ' ' substr($phoneNumber42) . ' ' substr($phoneNumber62) . ' ' substr($phoneNumber82) . ' ' substr($phoneNumber102);
  157.         $out $formattedNumber;
  158.         return $out;
  159.     }
  160.     protected function getNewVCardId() {
  161.         $out = -1;
  162.     $query 'select max(id_vcard) + 1 as NEW_ID from vcard';
  163.     $result $this->selectRaw($query);
  164.     if (isset($result[0]['NEW_ID'])) {
  165.         $out $result[0]['NEW_ID'];
  166.     }
  167.     return $out;
  168.     }
  169. /*
  170.     public function retrieveFromSession($session, $key) {
  171.         $out = null;
  172.     if (!empty($session)
  173.         && !empty($key)
  174.     ) {
  175.         $out = $session->get($key);
  176.         $this->storeInSession($session, null, $key);
  177.     }
  178.     return $out;
  179.     }
  180.     public function storeInSession($session, $value, string $key = '') : string {
  181.         $out = '';
  182.     if ($session != null) {
  183.         if (empty($key)) {
  184.             $key = md5(microtime());
  185.         }
  186.         $session->set($key, $value);
  187.         $out = $key;
  188.     }
  189.     return $out;
  190.     }
  191.     protected function deleteUploadedFile($filename) {
  192.         if (!empty($filename)) {
  193.         // TODO: get file path from key
  194.         //      remove file
  195.     }
  196.     }
  197.     protected function uploadFile($filename = null, $target_dir = 'public/uploads/') {
  198.         $out = 0;
  199.         $out_file = '';
  200.         if (empty($filename)
  201.             && isset($_FILES["fileToUpload"]["name"])
  202.         ) {
  203.             $filename =  basename($_FILES["fileToUpload"]["name"]);
  204.         }
  205.         $out_file =  '/'.basename($target_dir).'/'.$filename;
  206.         $target_file = __DIR__.'/../../'.$target_dir.$filename;  // basename($_FILES["fileToUpload"]["name"]);
  207. // echo(__METHOD__.': '.$target_file);
  208.         $uploadOk = 1;
  209.         $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
  210.         // Check if image file is a actual image or fake image
  211.         if(isset($_POST["submit"])) {
  212.             $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
  213.             if($check !== false) {
  214.                 echo "File is an image - " . $check["mime"] . ".";
  215.                 $uploadOk = 1;
  216.             } else {
  217.                 echo "File is not an image.";
  218.                 $uploadOk = 0;
  219.             }
  220.         }
  221.         if ($_FILES["fileToUpload"]["size"] > 15500000) {
  222.             echo "Sorry, your file is too large.";
  223.             $uploadOk = 0;
  224.         }
  225.         // Allow certain file formats
  226.         if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
  227.             && $imageFileType != "gif" ) {
  228.             // echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
  229.             $uploadOk = 0;
  230.         }
  231.         // Check if $uploadOk is set to 0 by an error
  232.         if ($uploadOk == 0) {
  233.             // echo "Sorry, your file was not uploaded.";
  234.             // if everything is ok, try to upload file
  235.         } else {
  236.             if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
  237.                 // echo "The file ". htmlspecialchars( basename( $_FILES["fileToUpload"]["name"])). " has been uploaded.";
  238.                 $uploadOk = $out_file;
  239.             } else {
  240.                 // echo "Sorry, there was an error uploading your file.";
  241.                 $uploadOk = 0; 
  242.             }
  243.         }
  244.         $out = $uploadOk;
  245.         return $out;
  246.     }
  247.     // */
  248.     /**
  249.      * @Route("/v/card/unsetres", name="app_v_card_unsetres", methods={"GET", "POST"})
  250.      */
  251.     public function unsetres(Request $requestVCardRepository $vCardRepository): Response {
  252.     $datas = array(
  253.             'status' => 'FAIL'
  254.             );
  255.     $params array_merge($_GET$_POST);
  256.     $session $request->getSession();
  257.     // $is_auth = $session->get('is_auth');
  258.     // echo(__METHOD__.': hello'); exit();
  259.     $img_filename $this->retrieveFromSession($session$params['rel']); // $session->get($params['rel']);
  260.     $img_filename// (isset($params['rel']) && !empty($params['rel']) && isset($img_filename)) ? file_get_contents($img_filename) : '';
  261.     if (file_exists($img_filename) && @unlink($img_filename)) {
  262.         // echo(__METHOD__.': removed: '. $img_filename);
  263.         $datas['status'] = 'ok';
  264.         $datas['msg'] = 'DELETED';
  265.     }
  266.     $content json_encode($datas);
  267.     return new Response($content200, array(
  268.             'Content-type'        => 'application/json'
  269.         )
  270.     );
  271.     }
  272.     /**
  273.      * @Route("/v/card/uploadres", name="app_v_card_uploadres", methods={"GET", "POST"})
  274.      */
  275.     public function uploadres(Request $requestVCardRepository $vCardRepository): Response
  276.     {
  277.         $session $request->getSession();
  278.     $is_auth $session->get('is_auth');
  279.     if (!$is_auth) {
  280.         $session->set('previous''app_v_card_show');
  281.         $session->set('prev_id'$vCard->getId());
  282.         return new Response(null302, array(
  283.                 'Location'        => 'auth',
  284.         ));
  285.     } else {
  286.     $user_email $session->get('user_email');
  287.     $personnel_datas $this->getPersonnelFromEnv($session);
  288.     $ide_dossier $personnel_datas['IDE_DOSSIER'];
  289.     /*
  290.     $filename = '/mnt/recadre/E-94824323.jpg';
  291.     $target_dir = 'public/uploads/';
  292.     if (!isset($_GET['key'])) {
  293.         $key = $this->storeInSession($session, $filename);
  294.         // echo(__METHOD__.': key: '.$key);
  295.     } else {
  296.         $val = $session->get($_GET['key']);
  297.         echo(__METHOD__.': val: '.$val);
  298.     }
  299.     // exit();
  300.     //
  301.     //
  302.     */
  303.     if (isset($_FILES['fileToUpload']['name'])) { // (isset($_POST['submit']))
  304.         $file_out $this->uploadFile('photo_'.$ide_dossier.'.jpg');
  305.         $file_path __DIR__.'/../../public'.$file_out;
  306.         // echo(__METHOD__.': file_out: '.$file_path);
  307.         $key $this->storeInSession($session$file_path);
  308.         $del_key $this->storeInSession($session$file_path);
  309.         $data_out = array(
  310.                     'src' => '/v/card/photo?rel='.$key,
  311.                     'del_key' => $del_key,
  312.                 );
  313.         $content json_encode($data_out); 
  314.         // $content = 'Done.';
  315.     return new Response($content200, array(
  316.             'Content-type'        => 'text/html'
  317.         )
  318.     );
  319.     } else if (!empty($_GET['remove'])){
  320.         $datas = array();
  321.         $datas['status'] = $this->deleteUploadedFile($_GET['remove']);
  322.         $content json_encode($datas);
  323.         return new Response($content200, array(
  324.             'Content-type'        => 'text/html'
  325.         ));
  326.     
  327.     } else {
  328.         return $this->render('v_card/upload.html.twig', []); 
  329.     }
  330.     } // END else not auth
  331.     }
  332.     /**
  333.      * @Route("/v/card/photo", name="app_v_card_photo", methods={"GET", "POST"})
  334.      */
  335.     public function photo(Request $requestVCardRepository $vCardRepository): Response
  336.     {
  337.     $params array_merge($_GET$_POST);
  338.     $session $request->getSession();
  339.     // $is_auth = $session->get('is_auth');
  340.     $img_filename $this->retrieveFromSession($session$params['rel']); // $session->get($params['rel']);
  341.     $content = (isset($params['rel']) && !empty($params['rel']) && isset($img_filename)) ? file_get_contents($img_filename) : '';
  342.     return new Response($content200, array(
  343.             'Content-type'        => 'image/jpeg'
  344.         )
  345.     );
  346.     }
  347.     /**
  348.      * @Route("/v/card/new", name="app_v_card_new", methods={"GET", "POST"})
  349.      */
  350.     public function new(Request $requestVCardRepository $vCardRepository): Response
  351.     {
  352.     $session $request->getSession();
  353.     $is_auth $session->get('is_auth');
  354.     $user_email $session->get('user_email');
  355.     $personnel_datas $this->getPersonnelFromEnv($session);
  356.     // echo(__METHOD__.': personnel_datas:'.var_export($personnel_datas, true)); // exit();
  357.         
  358.     if (!$is_auth) {
  359.         $session->set('previous''app_v_card_new');
  360.         return new Response(null302, array(
  361.                 'Location'        => '/v/card/auth',
  362.         ));
  363.     } else {
  364. //     echo(__METHOD__.': request:'. var_export($session, true)); exit();
  365. /*
  366. //    $session = $request->getSession();
  367.     echo(__METHOD__.': request:'. var_export($session, true)); exit();
  368. // */
  369.     $vCard = new VCard();
  370.     if (!empty($personnel_datas['TEL_PRO'])) {
  371.         $vCard->settel('0'.substr($personnel_datas['TEL_PRO'], 3));
  372.     }
  373.         $form $this->createForm(VCardType::class, $vCard);
  374.         $form->handleRequest($request);
  375.     if ($form->isSubmitted() && $form->isValid()) {
  376.         $vcard_id $vCard->getId();
  377.         if (empty($vcard_id)) {
  378.             $next_version 1;
  379.             $vcard_id $this->getNewVCardId();
  380.             $to_valid_vcard $this->selectLastVCardByIdeDossier($personnel_datas['IDE_DOSSIER'], 'enregistrée');
  381.             if (isset($to_valid_vcard['IDE_DOSSIER'])) {
  382.                 $next_version $to_valid_vcard['VERSION'];
  383.             } else {
  384.                 $last_valid $this->getVcardDatasSummary($personnel_datas['IDE_DOSSIER']);
  385.                 if (isset($last_valid['IDE_DOSSIER'])) {
  386.                     // $next_version = ($last_valid['VERSION'] * 1) + 1; // NOTE: see duplicate vcard
  387.                 }
  388.             }
  389.             // echo(__METHOD__.' vcard_id: '.var_export($vcard_id, true)); exit();
  390.             $vCard->setid_vcard($vcard_id);
  391.             // echo(__METHOD__.' personnel_datas: '.var_export($personnel_datas, true)); exit();
  392.             $vCard->setide_dossier($personnel_datas['IDE_DOSSIER']);
  393.             $vCard->setide_manager($personnel_datas['IDE_MANAGER']);
  394.             $vCard->setVERSION($next_version);
  395.             // $vCard->setDCREATION((new DateTime('now', new DateTimeZone('Europe/Budapest'))));
  396.             // echo(__METHOD__.' personnel_datas: '.var_export($personnel_datas, true)); exit();
  397.         }
  398.         if ($this->isSelfValidator($personnel_datas)) {
  399.             $vCard->setstatut('validé');    
  400.         }
  401.             $vCardRepository->add($vCardtrue);
  402.             return $this->redirectToRoute('app_v_card_show', ['id_vcard' => $vCard->getId()], Response::HTTP_SEE_OTHER);
  403.         }
  404.     // echo(__METHOD__.': user_email:'.$user_email);
  405.         return $this->renderForm('v_card/new.html.twig', [
  406.         'v_card' => $vCard,
  407.         'user_email' => $user_email,
  408.         'personnel'    => $personnel_datas,
  409.         'is_new'    => true,
  410.         'disp_form'    => true,
  411.         'is_manager'    => $session->get('is_manager'),
  412.             'form' => $form,
  413.     ]);
  414.     } // END if is_auth
  415.     }
  416.     
  417.     public function isCardManager(VCard $vCard null$session null,  $DBG false): bool {
  418.         $out = isset($vCard);
  419.         $personnel_datas null;
  420.         if ($out
  421.         && isset($session)
  422.         ) {
  423.         $personnel_datas $session->get('personnel_datas');
  424.         $out $out 
  425.             && isset($personnel_datas['IDE_DOSSIER'])
  426.             ; // isset($_GET['manager']) && $_GET['manager'] && true;
  427.         $vcard_ide_manager $vCard->getide_manager();
  428.         $out $out 
  429.             && ($personnel_datas['IDE_DOSSIER'] == $vcard_ide_manager)
  430.             ;
  431.             
  432.         $is_test_mgr $session->get('TEST_MNGR_IDE');
  433.         if ($is_test_mgr != null) {
  434.             $out true;
  435.         }
  436.         }
  437.     // echo(__METHOD__.': out: '.$out); exit();
  438.     /* TODO: disable this testonly
  439.     $out = true;
  440.     // */
  441.     return $out;
  442.     }
  443.     public function isManager($personnel_datas$session null$DBG false): bool {
  444.         if (isset($session)
  445.         ) {    
  446.         $is_manager $session->get('is_manager');
  447.         $out $is_manager && true;
  448.     } else {
  449.         $out = !empty($personnel_datas)
  450.                && isset($personnel_datas['EST_MANAGER'])
  451.             && $personnel_datas['EST_MANAGER'] == 'OUI'
  452.             && true;
  453.     }
  454.         /*
  455.     echo(__METHOD__.' session: '.var_export($session, true));
  456.     echo(__METHOD__.' out: '.$out); exit();
  457.     //*/
  458.     return $out;
  459.     }
  460.     /**
  461.      * @Route("/v/card/testgenqrcodefile", name="app_v_card_testgenqrcodefile", methods={"GET"})
  462.      */
  463.     public function testgenqrcodefile(Request $requestLoggerInterface $logger): Response {
  464.         $url "https://{$_SERVER['HTTP_HOST']}/v/card/last?";
  465.         $content $url;
  466.         $this->generateQrCodeFile($url$_GET['email']);
  467.         $logger->debug('Coucou');
  468.     return new Response($content200, array(
  469.             'Content-type'        => 'text/html',
  470.                         )
  471.     );
  472.     }
  473.     /**
  474.      * @Route("/v/card/genqrcodefiles", name="app_v_card_genqrcodefiles", methods={"GET","POST"})
  475.      */
  476.     public function genqrcodefiles(Request $requestLoggerInterface $logger): Response {
  477.         $url "https://{$_SERVER['HTTP_HOST']}/v/card/last?";
  478.         $out_buff = array();
  479.         $content $url;
  480.     $ids explode(':'$_POST['ids']);
  481.         foreach($ids as $k => $id_val) {
  482.             $pers_datas $this->getPersonnelFromIdeDossier($id_val);
  483.             if (isset($pers_datas['EMAIL_PRO'])) {
  484.                 $email $pers_datas['EMAIL_PRO'];
  485.                 $this->generateQrCodeFile($url$email);
  486.                 $out_buff[] =$url'download=1&email='.$email;
  487.             }
  488.         }
  489.         $content implode('<br/>'$out_buff);
  490.         $logger->debug('QRCode regenerated:'
  491.             "\n"implode("\n"$out_buff)
  492.             . "\n--------------------------\n"
  493.         );
  494.     return new Response($content200, array(
  495.             'Content-type'        => 'text/html',
  496.                         )
  497.     );
  498.     }
  499.     public function DEP_isNewQRCode($filename '') {
  500.         $out = !is_null($filename)
  501.             && file_exists($filename)
  502.             && ((strpos(file($filename)[0], 'CREATOR')) != 0
  503.             ;
  504.     if (isset($_GET['DBG'])) {
  505.         echo(__METHOD__.': '.var_export($outtrue));
  506.     }
  507.     return $out;
  508.     }
  509.     public function generateQrCodeFile($uri$email ''$prefix 'QRC') {
  510.         // $uri = "https://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
  511.     // $uri .=(isset($_GET['email']) || isset($_GET['embedded']) ? '&' : '?');
  512.         
  513.         $dwnl $uri 'download=1&email='.$email;
  514.         $DBG = isset($_GET['DBG']);
  515.         if (!is_null($uri)
  516.             && !is_null($email)
  517.         ) {
  518.         // TODO: write to file
  519.         $vcard $this->getVCardFromEmail($email);
  520.         if ($DBG) {
  521.             echo(__METHOD__.': vcard: 'var_export($vcardtrue));
  522.         }
  523.         if (isset($vcard['IDE_DOSSIER'])) {
  524.             $filename $vcard['IDE_DOSSIER'].'.JPG';
  525.             $filesystem = new Filesystem();
  526.             try {
  527.                 $filename Path::normalize('/mnt/qrcode/'
  528.                     // .'TEST__' // TEST ONLY
  529.                     .$prefix.$filename
  530.                 ); // sys_get_temp_dir().'/'. $filename);
  531.                 if (!$this->isNewQRCode($filename)) {
  532.                     if (file_exists($filename)) {
  533.                         rename($filename$filename.'.OLD'); // NOTE: backup old version
  534.                     }
  535.                     $options = new QROptions([
  536.                         'version'         => 5,
  537.                         'eccLevel'        => QRCode::ECC_L,
  538.                         'scale'     => 6,                     // 275x275
  539.                         'outputType'      => QRCode::OUTPUT_IMAGE_JPG,
  540.                         'imageTransparent' => false,
  541.                     ]);
  542. // echo(strpos(file('/mnt/qrcode/TEST__QRC5474.jpg')[0], 'CREATOR'));
  543.                     $content = (new QRCode($options))->render($dwnl$filename);
  544. /*            $filesystem->appendToFile(
  545.             $filename, $content, true
  546.             );
  547.                  */
  548.         if ($DBG) {
  549.             echo(__METHOD__.': dwnl:'.$dwnl.'<br/>File: '.$filename);
  550.         }
  551.                 } else {
  552.         if ($DBG) {
  553.             echo(__METHOD__.': filename: '.$filename.' already updated....');
  554.         }
  555.                 }
  556.             } catch (IOExceptionInterface $exception) {
  557.                 echo "An error occurred while creating your directory at ".$exception->getPath();
  558.             }
  559.         } // END if IDE_DOSSIER
  560.     }
  561.     }    
  562.     public function DEP_generateQrCode($datas): string{
  563.     // set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__.'/../../vendor/phpqrcode');
  564.     // require_once('qrlib.php');
  565.     $out '';
  566. /*
  567.     $uri = "http://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
  568.     $uri .=(strpos('?', $uri) ? '?' : '&');
  569.         
  570.     $dwnl = $uri . 'download=1';
  571. // */
  572.     if (isset($datas['v_datas_card'])) {
  573.     $dwnl $datas['download_url'];
  574.     $filename 'phpqrcode/temp/image-qrcode-'.$datas['v_datas_card']['ID_VCARD'].'.png';
  575.     // QRcode::png($dwnl, $filename);
  576.     $out = (new QRCode)->render($dwnl);
  577.     }
  578.     return $out;
  579.     }
  580.     /*
  581.                  */
  582.     /**
  583.      * @Route("/v/card/{id}/download", name="app_my_test_crud_vcard", methods={"GET"})
  584.      */
  585.     public function download(VCard $myTestCrud): Response // BinaryFileResponse
  586.     {
  587.     // echo(__METHOD__.': vcard');
  588.     $ide_dossier $myTestCrud->getide_dossier();
  589.     $vcard_datas $this->getVcardDatasSummary($ide_dossier);
  590.     /*
  591.     $file = new File('/var/tmp/beurk.txt');
  592.     return $this->file($file, 'vcard_'.$myTestCrud->getId() .'.txt');
  593.     //*/
  594.     $filename 'vcard_'.$myTestCrud->getId().'.vcf';
  595.     $content $this->getVCardFileContent($vcard_datas);
  596.     return new Response($content200, array(
  597.             'X-Sendfile'          => $filename,
  598.             'Content-type'        => 'application/octet-stream',
  599.             'Content-Disposition' => sprintf('attachment; filename="%s"'$filename))
  600.     );
  601.     }
  602.     /**
  603.      * @Route("/v/card/logout", name="app_v_card_logout", methods={"GET"})
  604.      */
  605.     public function logout(Request $request): Response {
  606.     $session $request->getSession();
  607.     
  608.     $session->set('is_auth'false);
  609.     $session->set('user_email''');
  610.     $previous 'app_v_card_index';
  611.     $prev_args = [];
  612.      return $this->redirectToRoute($previous$prev_argsResponse::HTTP_SEE_OTHER);
  613.     }
  614.     /**
  615.      * @Route("/v/card/setuser", name="app_v_card_setuser", methods={"GET"})
  616.      */
  617.     public function setuser(Request $request): Response {
  618.     $session $request->getSession();
  619.     $is_auth $session->get('is_auth');
  620.     // $personnel_datas = $this->getPersonnelFromEnv($session);
  621.     if (isset(($session->get('personnel_datas'))['IDE_DOSSIER'])
  622.         && ($session->get('personnel_datas'))['IDE_DOSSIER'] == '5474'
  623.         && !empty($_GET['email'])
  624.     ) {
  625.         $session->set('user_email'$_GET['email']);
  626.     
  627.         $personnel_datas $this->getPersonnelFromEnv($session);
  628.         $session->set('personnel_datas'$personnel_datas);
  629.         if (isset($personnel_datas['EST_MANAGER'])
  630.             && $personnel_datas['EST_MANAGER'] == 'OUI'
  631.         ) {
  632.             $session->set('is_manager'true);
  633.         }
  634.         echo(__METHOD__.': personnel_datas: '.var_export($personnel_datastrue).'<br/>');
  635.         echo(__METHOD__.': isSelfValidator: '. (true && $this->isSelfValidator($personnel_datas)).'<br/>');
  636.     }
  637.         // echo(__METHOD__.': personnel_datas: '.var_export($personnel_datas, true).'<br/>');
  638.     $content __METHOD__.': session: 'var_export($_SESSIONtrue);
  639.     return new Response($content200, array(
  640.         'Content-type'        => 'text/html',
  641.         )
  642.     );
  643.     }
  644.     /**
  645.      * @Route("/v/card/testauth", name="app_v_card_testauth", methods={"GET"})
  646.      */
  647.     public function testauth(Request $request): Response {
  648.     $session $request->getSession();
  649.     $is_auth $session->get('is_auth');
  650.     $personnel_datas $this->getPersonnelFromEnv($session);
  651.     echo(__METHOD__.': personnel_datas: '.var_export($personnel_datastrue).'<br/>');
  652.     echo(__METHOD__.': isSelfValidator: '. (true && $this->isSelfValidator($personnel_datas)).'<br/>');
  653.     $content __METHOD__.': session: 'var_export($_SESSIONtrue);
  654.     return new Response($content200, array(
  655.         'Content-type'        => 'text/html',
  656.         )
  657.     );
  658.     }
  659.     /**
  660.      * @Route("/v/card/beurk", name="app_v_card_beurk")
  661.      */
  662.     public function beurk(): Response
  663.     {
  664.     echo(__METHOD__); exit(); 
  665.     }
  666.     /**
  667.      * @Route("/v/card/notfound", name="app_v_card_notfound", methods={"GET"})
  668.      */
  669.     public function notfound(Request $request): Response
  670.     {
  671.     // echo(__METHOD__); exit(); 
  672.     $v_datas = array();
  673.     $session $request->getSession();
  674.     $is_auth $session->get('is_auth');
  675.     $tpl_name 'v_card/message.html.twig';
  676.     $needs_create false;
  677.     $v_datas'disp_message'] = true;
  678.     $v_datas['message'] = ($needs_create 'Aucune carte' 'Carte non').'  trouvée....';
  679.     if (isset($_GET['embedded'])) {
  680.         $v_datas['embedded'] = true;
  681.         // $v_datas['message'] = 'Carte non trouvée.<br/>Créer votre carte de visite <a href="/v/card">ici</a>';
  682.         if (isset($_GET['needs_create']) && $_GET['needs_create'] == 1) {
  683.             $v_datas['needs_create'] = $needs_create true;
  684.         
  685.         }
  686.         $tpl_name 'v_card/notfound_embedded.html.twig';
  687.     }
  688.         return $this->render($tpl_name$v_datas); 
  689.     }
  690.     /**
  691.      * @Route("/v/card/auth", name="app_v_card_auth", methods={"GET"})
  692.      */
  693.     public function auth(Request $request): Response {
  694.     $out null;
  695.     $content '';    
  696.     $prev_args = array();
  697.     $previous 'app_v_card_index';
  698.     // echo(__METHOD__.' userEmail:'.$this->userEmail); exit();
  699. //*
  700.     // $session = $request->getSession();
  701.     // $is_auth = $session->get('is_auth');
  702.     if (!$this->isAuth 
  703.         // && !isset($_GET['ticket'])
  704.     ) {
  705.         $this->getAuthCAS($request);
  706.         // echo(__METHOD__.' session:'.var_export($session, true)); exit();
  707.         //
  708.         
  709.         $session $request->getSession();
  710.         $prev_pg $session->get('previous');
  711.     $personnel_datas $this->getPersonnelFromEnv($session);
  712.     $session->set('personnel_datas'$personnel_datas);
  713.     
  714.     if (isset($personnel_datas['EST_MANAGER'])
  715.             && $personnel_datas['EST_MANAGER'] == 'OUI'
  716.         ) {
  717.         $session->set('is_manager'true);
  718.     }
  719.         if (!empty($prev_pg)) {
  720.             $previous $prev_pg;
  721.             $prev_id $session->get('prev_id');
  722.             if (!empty($prev_id)) {
  723.                 $prev_args['id_vcard'] = $prev_id;
  724.             }
  725.         }
  726.     } else {
  727.     //*/
  728.     $session $request->getSession();
  729.     $is_auth $session->get('is_auth');
  730.     $prev_pg $session->get('previous');
  731. //*
  732.     $session_email $session->get('user_email');
  733.     $student_datas $this->getStudentDatasFromMail($session_email);
  734.     if (isset($student_datas['id.Apprenant'])) { // NOTE: student detection
  735.         header("Location: https://{$_SERVER['HTTP_HOST']}/v/student/card/show"); exit();    
  736.     }
  737.     //*/
  738.     if (!empty($prev_pg)) {
  739.         $previous $prev_pg;
  740.             $prev_id $session->get('prev_id');
  741.             if (!empty($prev_id)) {
  742.                 $prev_args['id_vcard'] = $prev_id;
  743.             }
  744.     }
  745.     // echo(__METHOD__.': session: '.var_export($_SESSION, true));
  746.     // echo(__METHOD__.': is_auth: '. $is_auth);
  747.     // echo(__METHOD__.': prev_pg: '. $prev_pg);
  748.     // echo(__METHOD__.': authenticated: '.var_export($this->userEmail, true)); exit();
  749. /*
  750. // Load the settings from the central config file
  751. require_once 'config_CAS.php';
  752. // Load the CAS lib
  753.     // echo(__METHOD__.': phpcas_path: '.$phpcas_path); exit();
  754. require_once $phpcas_path . '/CAS.php';
  755. // Enable debugging
  756. phpCAS::setLogger();
  757. // Enable verbose error messages. Disable in production!
  758. phpCAS::setVerbose(true);
  759. // Initialize phpCAS
  760. phpCAS::client(CAS_VERSION_2_0, $cas_host, $cas_port, $cas_context, $client_service_name);
  761. // For production use set the CA certificate that is the issuer of the cert
  762. // on the CAS server and uncomment the line below
  763. // phpCAS::setCasServerCACert($cas_server_ca_cert_path);
  764. // For quick testing you can disable SSL validation of the CAS server.
  765. // THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION.
  766. // VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL!
  767. phpCAS::setNoCasServerValidation();
  768. // force CAS authentication
  769. phpCAS::forceAuthentication();
  770. // at this step, the user has been authenticated by the CAS server
  771. // and the user's login name can be read with phpCAS::getUser().
  772. //    echo(__METHOD__.': authenticated!'); exit();
  773. // logout if desired
  774. if (isset($_REQUEST['logout'])) {
  775.     phpCAS::logout();
  776. }
  777. //*/
  778.     // $this->getAuthCAS();
  779.     /*
  780.     echo(__METHOD__.': Hello '.phpCAS::getUser());
  781.         return new Response($content, 200, array(
  782.                 // 'X-Sendfile'          => $filename,
  783.                 'Content-type'        => 'text/text',
  784.             // 'Content-Disposition' => sprintf('attachment; filename="%s"', $filename)
  785.         
  786.             )
  787.         );
  788.     // */
  789.     //
  790.     
  791.     }
  792. /*
  793.         return new Response(null, 302, array(
  794.                 'Location'        => 'auth',
  795.         ));
  796.     //*/
  797.     // echo(__METHOD__.': prev_args: '.var_export($prev_args, true)); exit();
  798.      return $this->redirectToRoute($previous$prev_argsResponse::HTTP_SEE_OTHER);
  799.     }
  800.     public function sendemail(MailerInterface $mailer$to$subject$contentLoggerInterface $logger null) {
  801.         
  802.         // DBG
  803.         // $content = __METHOD__.': FAIL';
  804.         if (isset($mailer)) {
  805.         // DBG
  806.         // $content = __METHOD__.': SENT';
  807.         $email = (new Email())
  808.                 ->from($this->applicationSender.'@'.$_SERVER['HTTP_HOST'])
  809.                 ->to($to)
  810.                 ->subject($subject)
  811.                 // ->text($content)
  812.                 ->html($content); // '<p>See Twig integration for better HTML integration!</p>')
  813.             ;
  814.         // ...
  815.         try {
  816.             $mailer->send($email);
  817.             if (!is_null($logger)) {
  818.                 $logger->info('Sent to:'.$to.' Subject:'.$subject);
  819.             }
  820.         } catch (TransportExceptionInterface $e) {
  821.             // some error prevented the email sending; display an
  822.             // error message or try to resend the message
  823.             //
  824.             $content __METHOD__.': ERR: '.$e->getDebug();
  825.         }
  826.         }
  827.         /*
  828.         return new Response($content, 200, array(
  829.             'Content-type'        => 'text/html',
  830.         )
  831.         );
  832.         //*/
  833.         // echo($content);
  834.     }
  835.     
  836.     /**
  837.      * @Route("/v/card/testemail", name="app_v_card_testemail", methods={"GET", "POST"})
  838.      */
  839.     public function testemail(MailerInterface $mailerRequest $request): Response {
  840.         //*
  841.     $session $request->getSession();
  842.     $is_auth $session->get('is_auth');
  843.     $personnel_datas $session->get('personnel_datas');
  844.     $datas = array();
  845.         echo(__METHOD__.': personnel_datas: '.var_export($personnel_datastrue));
  846.     //*/
  847. /*
  848.     $email = (new Email())
  849.             ->from('hello@example.com')
  850.             //->cc('cc@example.com')
  851.             //->bcc('bcc@example.com')
  852.             //->replyTo('fabien@example.com')
  853.             //->priority(Email::PRIORITY_HIGH)
  854.             ->subject('Time for Symfony Mailer!')
  855.             ->text('Sending emails is fun again!')
  856.         ->html('<p>See Twig integration for better HTML integration!</p>')
  857.         ;
  858.     
  859.     $content = __METHOD__.': SENT';
  860. // ...
  861. try {
  862.     $mailer->send($email);
  863. } catch (TransportExceptionInterface $e) {
  864.     // some error prevented the email sending; display an
  865.     // error message or try to resend the message
  866.     //
  867.     $content = __METHOD__.': ERR: '.$e->getDebug();
  868. }
  869.     //*/
  870.     //
  871. //
  872.     $this->sendemail($mailer'herimamy.ratefiarivony@ensam.eu''Route testemail....'__METHOD__.': Hello');
  873.     $content __METHOD__.': done....';
  874.     /*
  875.     if (!$is_auth) {
  876.         $datas['needs_auth'] = true;
  877.     } else if (isset($_GET['disable']) && $_GET['disable'] == 1) {
  878.         $datas['is_manager'] = $session->set('is_manager', false);
  879.     } else {
  880.         $datas['is_manager'] = $session->set('is_manager', true);
  881.         $content = 'MANAGER';
  882.     }
  883.     // */
  884.     
  885.         return new Response($content200, array(
  886.                 'Content-type'        => 'text/html',
  887.             )
  888.         );
  889.     }
  890.     // TODO: disable this TESTONLY
  891.     /**
  892.      * @Route("/v/card/setmanager", name="app_v_card_setmanager", methods={"GET", "POST"})
  893.      */
  894.     public function setmanager(Request $request): Response {
  895.     $session $request->getSession();
  896.     $is_auth $session->get('is_auth');
  897.     $datas = array();
  898.     $content 'NOT_MANAGER';
  899.     $personnel_datas $session->get('personnel_datas');
  900.     $ide_manager $this->getManagerIdeDossier($personnel_datas);
  901.     if (!$is_auth) {
  902.         $datas['needs_auth'] = true;
  903.     } else if (isset($_GET['disable']) && $_GET['disable'] == 1) {
  904.         $datas['is_manager'] = $session->set('is_manager'false);
  905.     } else {
  906.         $datas['is_manager'] = $session->set('is_manager'true);
  907.         $ide_manager null;
  908.         if (isset($_GET['ide_manager'])) {
  909.             $ide_manager =     $_GET['ide_manager'];
  910.         } else if (isset($personnel_datas['IDE_MANAGER'])) {
  911.             $ide_manager $personnel_datas['IDE_MANAGER'];
  912.         }
  913. /* // REMOVE this TESTONLY
  914.         $datas['is_manager'] = $session->set('TEST_MNGR_IDE', $ide_manager);    
  915.         $content = 'MANAGER: '. $ide_manager;
  916.         //*/
  917.     }
  918.         return new Response($content200, array(
  919.                 'Content-type'        => 'text/html',
  920.             )
  921.         );
  922.     }
  923.     /**
  924.      * @Route("/v/card/search", name="app_v_card_search", methods={"GET", "POST"})
  925.      */
  926.     public function search(Request $request): Response {
  927.         // echo(__METHOD__.' _POST: '.var_export($_POST, true)); exit();
  928.     $session $request->getSession();
  929.     $is_auth $session->get('is_auth');
  930.     $datas = array();
  931.     $datas['is_manager'] = $session->get('is_manager');
  932.     if (!$is_auth) {
  933.         $datas['needs_auth'] = true;
  934.     }
  935.     $datas['disp_search'] = true;
  936.     if (isset($_POST['email'])
  937.         && $_POST['email'] != ''
  938.     ) {
  939.         $ans = array('msg' => 'NOT_FOUND');
  940.         $found $this->selectMailLike($_POST['email']); // getVCardFromEmail($_POST['email'], $get_like = true);
  941.         // echo(__METHOD__.' found: '.var_export($found, true));
  942.         /*
  943.         if (isset($found['EMAIL_PRO'])) {
  944.             $ans['msg'] = 'ok';
  945.             $ans['EMAIL_PRO'] = $found['EMAIL_PRO'];
  946.         }
  947.         //*/
  948.         //
  949.         if (count($found) > 0) {
  950.             $ans $found;
  951.         }
  952.         $content json_encode($ans);
  953.         return new Response($content200, array(
  954.                 'Content-type'        => 'text/json',
  955.             )
  956.         );
  957.     } else {
  958.          return $this->render('v_card/search.html.twig'$datas); 
  959.     }
  960.     }
  961.     /**
  962.      * @Route("/v/card/getuserinfos", name="app_v_card_getuserinfos", methods={"GET"})
  963.      */
  964.     public function getuserinfos(Request $requestVCardRepository $vCardRepositoryMailerInterface $mailer): Response {
  965.     $session $request->getSession();
  966.     $is_auth $session->get('is_auth');
  967.         $content __METHOD__;
  968.     $user_id '';
  969.     if ($is_auth === true) {
  970.         if (isset($_GET['email'])) {
  971.             $datas_from_mail $this->getPersonnelFromEmail($_GET['email']);
  972.             echo(__METHOD__.' datas_from_mail: '.var_export($datas_from_mailtrue)); exit();
  973.         }
  974.         $user_id $_GET['user_id'];
  975.         
  976.         $owner_datas $this->getPersonnelFromIdeDossier($user_id);
  977.         $mgr_ide $owner_datas['IDE_MANAGER'];
  978.         $manager_datas $this->getPersonnelFromIdeDossier($mgr_ide);
  979.         $content 'DBG: owner_datas: '.var_export($owner_datastrue)
  980.                        .'<br/>'
  981.                 'manager_datas: 'var_export($manager_datastrue);    
  982.         }
  983.             return new Response($content200, array(
  984.                 'Content-type'        => 'text/html',
  985.                 )
  986.             );
  987.     }
  988.     /**
  989.      * @Route("/v/card/refreshstudentcache", name="app_v_card_refreshstudentcache", methods={"GET"})
  990.      */
  991.     public function refreshstudentcache(Request $requestVCardRepository $vCardRepositoryMailerInterface $mailer): Response {
  992.         echo(__METHOD__.':'); exit();
  993.     }
  994.     /**
  995.      * @Route("/v/card/refreshpending", name="app_v_card_refreshpending", methods={"GET"})
  996.      */
  997.     public function refreshpending(Request $requestVCardRepository $vCardRepositoryMailerInterface $mailer): Response {
  998.         $RAW_QUERY 'select *
  999.             from vcard
  1000.             order by rank() over (partition by ide_dossier order by d_modification desc)
  1001.             fetch first row with ties';
  1002.         $DBG = isset($_GET['dbg']) && $_GET['dbg'] == '1';
  1003.         $found $this->selectRaw($RAW_QUERYfalse);
  1004.         $rjc_items = array();
  1005.         $svd_items = array();
  1006.         $pnd_items = array();
  1007.         foreach($found as $k => $datas) {
  1008.             if (isset($datas['ID_VCARD'])
  1009.                 && isset($datas['STATUT'])
  1010.             ) {
  1011.                 /*
  1012.                 if ($datas['STATUT'] == 'à valider') {
  1013.                     $pnd_items[] = $datas;
  1014.                 } else if ($datas['STATUT'] == 'rejetée') {
  1015.                     $rjc_items[] = $datas;    
  1016.                 } else if ($datas['STATUT'] == 'enregistrée') {
  1017.                     $svd_items[] = $datas;
  1018.                 }
  1019.                 //*/
  1020.                 $this->sendPendingRequest($mailer$datas);
  1021.             }
  1022.         }
  1023. /*
  1024.         $this->sendPendingRequest($mailer, $pnd_items[0]); // , true);
  1025.         $this->sendPendingRequest($mailer, $rjc_items[0]); // , true);
  1026.         $this->sendPendingRequest($mailer, $svd_items[0]); // , true);
  1027.         //*/
  1028.         $content 'Done';
  1029.         /*
  1030.         $content = __METHOD__.': getting pending requests....<br/>'
  1031.                 // . ($DBG ? var_export($pnd_items, true): '')
  1032.             ;
  1033.         //*/
  1034.         return new Response($content200, array(
  1035.                 'Content-type'        => 'text/html',
  1036.             )
  1037.         );
  1038.     }
  1039.     /**
  1040.      * @Route("/v/card/last", name="app_v_card_last", methods={"GET"})
  1041.      */
  1042.     public function last(Request $request): Response {
  1043.     $vcard_datas = array();
  1044.     $found null;
  1045.     $last_vcard null;
  1046.     $ide_dossier null;
  1047.     $session $request->getSession();
  1048.     $is_auth $session->get('is_auth');
  1049.     $needs_create false;
  1050.     if (isset($_GET['embedded'])
  1051.         && isset($_GET['login'])
  1052.     ) {
  1053.         $student_email $this->selectStudentEmailFromLogin($_GET['login']);
  1054.         if (isset($student_email)) {
  1055.             return new Response(null302, array(
  1056.                     'Location'        => '/v/student/card/last?embedded=1&v2&email='.$student_email,
  1057.             ));
  1058.         }
  1059.     }
  1060.     $personnel_datas $this->getPersonnelFromEnv($session);
  1061.     $is_manager $session->get('is_manager'); // $this->isManager($personnel_datas);
  1062.     if (isset($personnel_datas['IDE_DOSSIER'])) {
  1063.         $ide_dossier $personnel_datas['IDE_DOSSIER']; 
  1064.         if (!empty($ide_dossier)) {
  1065.             $vcard_datas $this->getVcardDatasSummary($ide_dossier); // $this->selectLastVCardByIdeDossier($ide_dossier);
  1066.             $vcard_datas['can_validate'] = false;
  1067.             $vcard_datas['needs_submit'] = false;
  1068.             $vcard_datas['can_duplicate'] = false;
  1069.             $found $this->selectLastVCardByIdeDossier($ide_dossier"enregistrée' OR STATUT='à valider");
  1070.             $last_vcard $this->selectLastVCardByIdeDossier($ide_dossier"validé");
  1071.             if (count($last_vcard) > 0) {
  1072.                 $tmp_vcard  = new VCard();
  1073.                 $tmp_vcard->setid_vcard($last_vcard['ID_VCARD']);
  1074.                 $tmp_vcard->settitre($last_vcard['TITRE']);
  1075.                 $tmp_vcard->settel($last_vcard['TEL']);
  1076.                 $tmp_vcard->setemail($last_vcard['EMAIL']);
  1077.                 $tmp_vcard->setavec_photo($last_vcard['AVEC_PHOTO']);
  1078.                 $vcard_datas['v_card'] = $tmp_vcard;
  1079.                 // echo(__METHOD__.' adding v_card....');
  1080.             } else { // No card found needs to create one
  1081.                 $needs_create true;
  1082.             }
  1083.             $vcard_datas['new_version'] = count($found) == 0;
  1084.     $photo_file '/mnt/recadre/'.$ide_dossier.'.jpg';
  1085.             // echo(__METHOD__.': '. var_export($last_vcard, true)); exit();
  1086.             if (isset($last_vcard['AVEC_PHOTO']) && $last_vcard['AVEC_PHOTO'] == 'oui'
  1087.                 || (file_exists($this->uploadsDIR.('photo_'.$ide_dossier.'.jpg')))
  1088.             ) {
  1089.                 if (!isset($last_vcard['AVEC_PHOTO']) || $last_vcard['AVEC_PHOTO'] != 'oui') {
  1090.                     $photo_file $this->uploadsDIR.('photo_'.$ide_dossier.'.jpg');
  1091.                 }
  1092.                 $key $this->storeInSession($session$photo_file);
  1093.                 if (!empty($key)) {
  1094.                     $vcard_datas['PHOTO_K'] = $key;
  1095.                 }
  1096.             } 
  1097.             if (!$is_auth) {
  1098.                 $vcard_datas['needs_auth'] = true;
  1099.             }
  1100.         }
  1101.     // echo(__METHOD__.': vcard_datas: '. var_export($vcard_datas['v_datas_card']['IDE_DOSSIER'], true)); exit();
  1102.     }
  1103.     if (isset($vcard_datas['v_datas_card']['IDE_DOSSIER'])
  1104.         && isset($vcard_datas['v_card'])
  1105.     ) {
  1106.     $uri "https://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
  1107.     $uri .=(isset($_GET['email']) || isset($_GET['embedded']) ? '&' '?');
  1108.         
  1109.     $dwnl $uri 'download=1'.(isset($_GET['email']) ? '' '&email='.$personnel_datas['EMAIL_PRO']);
  1110.     $vcard_datas['download_url'] = $dwnl;
  1111.     $vcard_datas['qr_code_url'] = $this->generateQrCode($vcard_datas);
  1112.     $vcard_datas['disp_vcard'] = true;
  1113.     $vcard_datas['is_last'] = true;
  1114.     $is_download = (    
  1115.             (isset($_GET['download']) && $_GET['download'] == 1)
  1116.             || (isset($_POST['download']) && $_POST['download'] == 1)
  1117.             );
  1118.     if (!$is_download) {
  1119.             $vcard_datas['is_search'] = true;
  1120.         if (isset($_GET['back'])
  1121.             && !empty($_GET['back'])
  1122.         ) {
  1123.             $vcard_datas['back_url'] = '/v/card/search';
  1124.         }
  1125.         if (isset($_GET['embedded'])) {
  1126.             $vcard_datas['embedded'] = true;
  1127.         }
  1128.         $vcard_datas['is_manager'] = $is_manager;
  1129.         $vcard_datas['published'] = true;
  1130.         $vcard_datas['published_card'] = true
  1131.         if (isset($_GET['back'])
  1132.             && $_GET['back'] == 'search'
  1133.         ) {
  1134.             $vcard_datas['from_search'] = true;
  1135.         }
  1136.         $tpl_name = isset($_GET['embedded']) // ($_GET['v2']) 
  1137.                 ?  'v_card/embedded.html.twig' 
  1138.                 'v_card/last.html.twig';
  1139.         if (isset($_GET['embedded'])
  1140.             && isset($_GET['v4'])
  1141.         ) {
  1142.             $tpl_name =  'v_card/embedded_v4.html.twig'
  1143.         }
  1144.             return $this->render($tpl_name$vcard_datas); 
  1145.     } else {
  1146.         if (isset($_GET['DBG'])
  1147.             && $_GET['DBG'] == '1'
  1148.         ) {
  1149.             echo(__METHOD__.' vcard_datas: 'var_export($vcard_datastrue)); exit();
  1150.         }
  1151.          $content $this->getVCardFileContent($vcard_datas);
  1152.         $filename 'vcard_'.$ide_dossier.'.vcf';
  1153.         // echo(__METHOD__.' content:'.$content); exit();
  1154.         return new Response($content200, array(
  1155.                 'X-Sendfile'          => $filename,
  1156.                 'Content-type'        => 'application/octet-stream',
  1157.                 'Content-Disposition' => sprintf('attachment; filename="%s"'$filename))
  1158.         );
  1159.     }
  1160.     } else { // else vcard not found
  1161.         $v_datas = array(
  1162.             'Location'        => 'notfound',
  1163.         );
  1164.         if (isset($_GET['embedded']) && $_GET['embedded']) {
  1165.             $v_datas['embedded'] = 1;
  1166.         }
  1167.         if ($needs_create || isset($_GET['login'])) {
  1168.             $v_datas['needs_create'] = 1;
  1169.         }
  1170.         return $this->redirectToRoute('app_v_card_notfound'$v_datasResponse::HTTP_SEE_OTHER);
  1171. // new Response(null, 302, $v_datas);
  1172. /*
  1173.             return new Response('', 404, array(
  1174.                 'Content-type'        => 'text/html',
  1175.             )
  1176.             );
  1177.                  */
  1178.     
  1179.         }
  1180.     }
  1181.     protected function getVcardDatasSummary($ide_dossier): array {
  1182.         $out = array();
  1183.         $personnel_datas $this->getV_PERSONNEL($ide_dossier);
  1184.         $infos_carte $this->getV_INFOS_CARTE($ide_dossier);
  1185. /*
  1186.         if (     false && 
  1187.             isset($personnel_datas['SERVICE'])) {
  1188.             $service_items = explode(' -> ', $personnel_datas['SERVICE']); // NOTE: dept stored with ' -> ' separator....
  1189.             $nb_items = count($service_items);
  1190.                 if ($nb_items > 1) {
  1191.                     $personnel_datas['SERVICE'] = $service_items[count($service_items)-1];
  1192.                 }
  1193.                     
  1194.                     // echo(var_export($personnel_datas, true)); exit();
  1195.         }
  1196.         //*/
  1197.         $v_datas_card $this->getV_DATA_VCARD($ide_dossier);
  1198.         if (count($v_datas_card) == 0) { // NO entry in V (new card) get from table VCard
  1199.             $v_datas_card $this->selectLastVCardByIdeDossier($ide_dossier"enregistrée' OR STATUT='à valider'  OR STATUT='rejetée");
  1200.             if (isset($v_datas_card['IDE_DOSSIER'])
  1201.                 // && isset($infos_carte['NOM_PHOTO'])
  1202.             ) {
  1203.                 if (isset($infos_carte['NOM_PHOTO'])) {
  1204.                     $v_datas_card['PHOTO'] = $infos_carte['NOM_PHOTO'];
  1205.                 }
  1206.                 $v_datas_card['SITE_RATTACHEMENT'] = (isset($personnel_datas['SITE_RATTACHEMENT']) ? $personnel_datas['SITE_RATTACHEMENT']: $infos_carte['SITE']);
  1207.                 $v_datas_card['ADRESSE_PRO'] = '';
  1208.                 if (!empty($v_datas_card['SITE_RATTACHEMENT'])) {
  1209.                     $v_datas_card['ADRESSE_PRO'] = $this->getV_SITE($v_datas_card['SITE_RATTACHEMENT']);
  1210.                 }
  1211.                 // echo(__METHOD__.': v_datas_card: '.var_export($v_datas_card, true));
  1212.             }
  1213.         }
  1214.         if (isset($personnel_datas['EMAIL_PRO'])
  1215.             && count($v_datas_card) > 0
  1216.         ) {
  1217.         // echo(__METHOD__.' v_datas_card: '.var_export($v_datas_card, true));
  1218.         $vcard_datas = array(
  1219.              'tel' => json_decode($v_datas_card['TEL']),
  1220.              'titre' => json_decode($v_datas_card['TITRE']),
  1221.              'email' => json_decode($v_datas_card['EMAIL']),
  1222.             );
  1223.         $out = [
  1224.             // 'v_card' => $vCard,
  1225.         'vcard_datas' => $vcard_datas,
  1226.         'v_datas_card' => $v_datas_card// NOTE: contains main user infos....
  1227.         'personnel_datas' => $personnel_datas,
  1228.         'infos_carte' => $infos_carte,
  1229.         // 'can_validate' => $this->isCardManager($vCard),
  1230.         ];
  1231.         } // END if EMAIL_PRO
  1232.         // echo(__METHOD__.' out: '.var_export($out, true)); exit();
  1233.         return $out;
  1234.     }
  1235.     protected function getManagerIdeDossier($datas) {
  1236.         $out null;
  1237.     // echo(__METHOD__.': '.var_export($datas, true));
  1238.     if (isset($personnel_datas['IDE_MANAGER'])) {
  1239.         $out $personnel_datas['IDE_MANAGER'];
  1240.     }
  1241.     return $out;
  1242.     }
  1243.     /**
  1244.      * @Route("/v/card/manager", name="app_v_card_manager", methods={"GET", "POST"})
  1245.      */
  1246.     public function manager(Request $requestVCardRepository $vCardRepository): Response
  1247.     {
  1248.     // $this->getAuthCAS();
  1249.     $session $request->getSession();
  1250.     $is_auth $session->get('is_auth');
  1251.     $user_email $session->get('user_email');
  1252.     $personnel_datas $session->get('personnel_datas'); //  $this->getPersonnelFromEnv($session);
  1253.     // echo(__METHOD__.': personnel_datas: '.var_export($personnel_datas, true)); exit();
  1254.     $ide_dossier = (isset($personnel_datas['IDE_DOSSIER']) ? $personnel_datas['IDE_DOSSIER'] : '');
  1255.     if (!$is_auth) {
  1256.         $session->set('previous''app_v_card_manager');
  1257.         return new Response(null302, array(
  1258.                 'Location'        => 'auth',
  1259.         ));
  1260.     } else if ($session->get('is_manager')) { //  else if ($this->isManager($personnel_datas)) {
  1261.            /* TODO: REMOVE TESTONLY get the real value    
  1262.         $ide_dossier = $session->get('TEST_MNGR_IDE');
  1263.         echo(__METHOD__.': ide_dossier: '.$ide_dossier);
  1264.         //*/
  1265.         $vcards $this->getManagedCards($ide_dossier, (isset($_GET['DBG']) && $_GET['DBG'] == 1));
  1266.         // echo(__METHOD__.' found: ' .var_export($vcards, true)); exit();
  1267.         return $this->renderForm('v_card/manager.html.twig', [
  1268.             'v_cards' => $vcards,
  1269.             // 'manager_v' => true,
  1270.             'disp_manager' => true,
  1271.             'is_manager'    => true,
  1272.         ]);
  1273.     } else {
  1274.         return new Response(null302, array(
  1275.                 'Location'        => 'notfound',
  1276.         ));
  1277. /*
  1278.         return new Response(null, 404, array(
  1279.                 // 'Location'        => 'auth',
  1280.         ));
  1281. */
  1282.     // END if is_auth
  1283.     }
  1284.     /**
  1285.      * @Route("/v/card/embedded", name="app_v_card_embedded", methods={"GET", "POST"})
  1286.      */
  1287.     public function embedded(Request $request): Response
  1288.     {
  1289.     // $this->getAuthCAS();
  1290.     $session $request->getSession();
  1291.     $is_auth $session->get('is_auth');
  1292.     $user_email $session->get('user_email');
  1293.     $personnel_datas $this->getPersonnelFromEnv($session);
  1294.     // $user_email = $session->get('is_auth');
  1295.     // echo(__METHOD__.': session:'.var_export($_SESSION, true)); exit();
  1296.     $is_manager $session->get('is_manager'); // $this->isManager($personnel_datas);
  1297.     // echo(__METHOD__.': is_manager: '.var_export($is_manager, true)); exit();
  1298.         
  1299.     if (!$is_auth) {
  1300.         $session->set('previous''app_v_card_embedded');
  1301.         $session->set('prev_id'$vCard->getId());
  1302.         return new Response(null302, array(
  1303.                 'Location'        => 'auth',
  1304.         ));
  1305.     } else { 
  1306. // echo(__METHOD__.': vcard_datas: '.var_export($vcard_datas['vcard_datas'], true));
  1307.         return $this->redirectToRoute('app_v_card_last', ['embedded' => 1], Response::HTTP_SEE_OTHER);
  1308.     } // END if is_auth
  1309.     }
  1310.     /**
  1311.      * @Route("/v/card/{id_vcard}", name="app_v_card_show", methods={"GET", "POST"})
  1312.      */
  1313.     public function show(Request $requestVCard $vCardVCardRepository $vCardRepository): Response
  1314.     {
  1315.     // $this->getAuthCAS();
  1316.     $session $request->getSession();
  1317.     $is_auth $session->get('is_auth');
  1318.     $user_email $session->get('user_email');
  1319.     $personnel_datas $this->getPersonnelFromEnv($session);
  1320.     // $user_email = $session->get('is_auth');
  1321.     // echo(__METHOD__.': session:'.var_export($_SESSION, true)); exit();
  1322.     $is_manager $session->get('is_manager'); // $this->isManager($personnel_datas);
  1323.     // echo(__METHOD__.': is_manager: '.var_export($is_manager, true)); exit();
  1324.         
  1325.     if (!$is_auth) {
  1326.         $session->set('previous''app_v_card_show');
  1327.         $session->set('prev_id'$vCard->getId());
  1328.         return new Response(null302, array(
  1329.                 'Location'        => 'auth',
  1330.         ));
  1331.     } else { 
  1332.         $ide_dossier $vCard->getide_dossier();
  1333.     $is_owner $ide_dossier == $personnel_datas['IDE_DOSSIER'];
  1334.     $is_card_manager $this->isCardManager($vCard$session);
  1335.     if (!isset($_GET['admin_popup']) && !isset($_GET['DBG_DUMP']) && !$is_owner && !isset($_GET['embedded'])) { //  redirect card_manager
  1336.          return $this->redirectToRoute('app_v_card_index', [], Response::HTTP_SEE_OTHER);
  1337.     }
  1338.     $vcard_datas $this->getVcardDatasSummary($ide_dossier);
  1339.     $vcard_datas['v_card'] = $vCard;
  1340.     $vcard_datas['can_validate'] =     true 
  1341.                     && $session->get('is_manager')
  1342.                     && $is_card_manager // $this->isCardManager($vCard, $session) 
  1343.                     && ($vCard->getstatut() == 'à valider')
  1344.                         ;
  1345.     // echo(__METHOD__.'vCard->getstatut: '.$vCard->getstatut());
  1346.     $vcard_datas['needs_submit'] = ($vCard->getstatut() == 'enregistrée');
  1347.     $vcard_datas['can_duplicate'] = ($vCard->getstatut() == 'rejetée');
  1348.     if ($vCard->getstatut() == 'validé') {
  1349.         $vcard_datas['validated'] = true
  1350.         $vcard_datas['new_version'] = false;
  1351.     }
  1352.     $vcard_datas['user_email'] = $user_email;
  1353.     $vcard_datas['disp_vcard'] = true;
  1354.     $vcard_datas['is_manager'] = $is_manager;
  1355.     $vcard_datas['current_card'] = true;
  1356.     if (!$is_owner) {
  1357.         $vcard_datas['not_owner'] = true;
  1358.     }
  1359.     $photo_file '/mnt/recadre/'.$ide_dossier.'.jpg';
  1360.     if ($vCard->getavec_photo() == 'oui'
  1361.         || (file_exists($this->uploadsDIR.('photo_'.$ide_dossier.'.jpg')))
  1362.     ) {
  1363.                 if ($vCard->getavec_photo() != 'oui') {
  1364.                     $photo_file $this->uploadsDIR.('photo_'.$ide_dossier.'.jpg');
  1365.                 }
  1366.         $key $this->storeInSession($session$photo_file);
  1367.         if (!empty($key)) {
  1368.             $vcard_datas['PHOTO_K'] = $key;
  1369.         }
  1370.     }
  1371.         $form $this->createForm(VCardType::class, $vCard);
  1372.         $form->handleRequest($request);
  1373.     // echo(__METHOD__.': form: '.var_export($form->vars, true)); exit();
  1374.     // echo(__METHOD__.': vcard_datas: '.var_export($vcard_datas, true)); exit();
  1375.     $vcard_datas['form'] = $form;
  1376.     if ( $form->isSubmitted() && $form->isValid()
  1377.         && ($is_owner || $is_manager)
  1378.     ) {
  1379.         //         echo(__METHOD__.' submit... vars:'.var_export($form->getData())); exit();
  1380.         // TODO: check if reject/accepted and if manager then save
  1381.             $vCardRepository->add($vCardtrue);
  1382.         //*
  1383.         //*
  1384.         if ($vCard->getstatut() == 'à valider') { // NOTE: submited to validate
  1385.             return $this->redirectToRoute('app_v_card_submited', ['id_vcard' => $vCard->getId()], Response::HTTP_SEE_OTHER);
  1386.         } else if ($vCard->getstatut() == 'rejetée'){
  1387.             return $this->redirectToRoute('app_v_card_rejected', ['id_vcard' => $vCard->getId()], Response::HTTP_SEE_OTHER);
  1388.         } else if ($vCard->getstatut() == 'validé'){
  1389.             return $this->redirectToRoute('app_v_card_accepted', ['id_vcard' => $vCard->getId()], Response::HTTP_SEE_OTHER);
  1390.         } else {
  1391.          // */
  1392.             return $this->redirectToRoute('app_v_card_index', [], Response::HTTP_SEE_OTHER);
  1393.         }
  1394. // */
  1395.         }
  1396.     $vcard_datas['is_manager'] = $is_manager// $session->get('is_manager');
  1397.     if ($this->isSelfValidator($personnel_datas)) {
  1398.         // TODO: enable this
  1399.         $vcard_datas['is_self_validator'] = true
  1400.     }
  1401.     if (isset($_GET['embedded'])) {
  1402.         $vcard_datas['manager_embedded'] = true;
  1403.             return $this->renderForm('v_card/_vcard.html.twig'$vcard_datas); 
  1404.     }
  1405.     if (isset($_GET['DBG_DUMP'])) {
  1406.         $ide_dossier  $vCard->getide_dossier();
  1407.         $owner_datas $this->getPersonnelFromIdeDossier($ide_dossier);
  1408.         echo(__METHOD__.' is_manager: '.var_export($is_managertrue).'<BR/>');
  1409.         echo(__METHOD__.' is_card_manager: '.var_export($is_card_managertrue).'<BR/>');
  1410.         echo(__METHOD__.' can_validate: '.var_export($vcard_datas['can_validate'], true).'<BR/>');
  1411.         echo(__METHOD__.' personnel_datas: '.var_export($personnel_datastrue).'<BR/>');
  1412.         echo(__METHOD__.' owner_datas: '.var_export($owner_datastrue).'<BR/>');
  1413.         echo(__METHOD__.' vCard: '.var_export($vCardtrue)); exit();
  1414.     }
  1415.     // echo(__METHOD__.': vcard_datas: '.var_export($vcard_datas['vcard_datas'], true));
  1416.         return $this->renderForm('v_card/show.html.twig'$vcard_datas); 
  1417.     /* 
  1418.         [
  1419.             'v_card' => $vCard,
  1420.         'vcard_datas' => $vcard_datas,
  1421.         'v_datas_card' => $v_datas_card,
  1422.         'personnel_datas' => $personnel_datas,
  1423.         'infos_carte' => $infos_carte,
  1424.         'can_validate' => $this->isCardManager($vCard),
  1425.         ]
  1426. );
  1427.     */
  1428.     // END if is_auth
  1429.     }
  1430.     public function getV_INFOS_CARTE($ide_dossier$DBG false) : array {
  1431.     return $this->selectViewBy_ide_dossier('V_INFOS_CARTE'$ide_dossier$DBG);
  1432.     }
  1433.     public function getV_PER_DEMANDE_CARTE_PROF($ide_dossier$DBG false) : array {
  1434.     return $this->selectViewBy_ide_dossier('V_PER_DEMANDE_CARTE_PROF'$ide_dossier$DBG);    
  1435.     }
  1436.     public function getV_DATA_VCARD($ide_dossier$DBG false) : array {
  1437.     return $this->selectViewBy_ide_dossier('V_DATA_VCARD'$ide_dossier$DBG);    
  1438.     }
  1439.     public function getV_PERSONNEL($ide_dossier$DBG false) : array {
  1440.     return $this->selectViewBy_ide_dossier('V_PERSONNEL'$ide_dossier$DBG);    
  1441.     // return $this->selectViewBy_ide_dossier('V_PERSONNEL_NEW', $ide_dossier, $DBG); // TODO: V_PERSONNEL needs to be merged    
  1442.     }
  1443.     public function getV_SITE($site$DBG false) {
  1444.     return $this->getFromSite($site);
  1445.     }
  1446.     protected function disableOldPendingCards(VCard $vCard) {
  1447.         if ($vCard !== null) {
  1448.             $ide_dossier $vCard->getide_dossier();
  1449.             $card_id $vCard->getId();
  1450.             $RAW_QUERY "update vcard set STATUT='old à valider' where ID_VCARD != ".$card_id." and STATUT='à valider' and IDE_DOSSIER = "$ide_dossier;
  1451.             // echo(__METHOD__.': query: '.$RAW_QUERY); exit();
  1452.             if ( 
  1453.                 !empty($RAW_QUERY)) {
  1454.             $em $this->getDoctrine()->getManager();
  1455.             $statement $em->getConnection()->prepare($RAW_QUERY);
  1456.             $res $statement->execute();
  1457.         }
  1458.         }
  1459.     }
  1460.     protected function getVCardFromEmail($email$get_like false) : array {
  1461.         $out = array();
  1462.     $criteria = ($get_like === false '=' ' like ') ."'".strtolower($email)
  1463.             .($get_like === false '' '%')
  1464.             ."'";
  1465.         $found $this->selectViewWhere('V_DATA_VCARD''LOWER(EMAIL_PRO)'$criteria$get_like); // "LOWER(EMAIL_PRO)='".strtolower($email)."'");
  1466.         // echo(__METHOD__.' found: '.var_export($found, true)); exit();
  1467.         if (count($found) > 0) {
  1468.             $out $found;
  1469.         }
  1470.     return $out;
  1471.     }
  1472.     protected function getPersonnelFromLogin($search) : array {
  1473.         $out = array();
  1474.         $found $this->selectViewWhere('V_PERSONNEL'"LOWER(LOGIN)='".strtolower($search)."'");
  1475.         // echo(__METHOD__.' found: '.var_export($found, true)); exit();
  1476.         if (count($found) > 0) {
  1477.             $out $found;
  1478.         }
  1479.     return $out;
  1480.     }
  1481.     protected function getPersonnelFromEmail($email) : array {
  1482.         $out = array();
  1483.         $found $this->selectViewWhere('V_PERSONNEL'"LOWER(EMAIL_PRO)='".strtolower($email)."'");
  1484.         // echo(__METHOD__.' found: '.var_export($found, true)); exit();
  1485.         if (count($found) > 0) {
  1486.             $out $found;
  1487.         }
  1488.     return $out;
  1489.     }
  1490.     protected function getPersonnelFromIdeDossier($ide_dossier) : array {
  1491.         $out = array();
  1492.     if (!empty($ide_dossier)) {
  1493.         $found $this->selectViewWhere('V_PERSONNEL'"IDE_DOSSIER='".$ide_dossier."'");
  1494.         // echo(__METHOD__.' found: '.var_export($found, true)); exit();
  1495.         if (count($found) > 0) {
  1496.             $out $found;
  1497.         }
  1498.     }
  1499.     return $out;
  1500.     }
  1501.     protected function selectStudentEmailFromLogin($login) {
  1502.         $out null;
  1503.         $found $this->getStudentVCardFromLogin($login);
  1504.         if (isset($found['EMAIL'])) {
  1505.         $tmp_datas json_decode($found['EMAIL'], true);
  1506.         $out $tmp_datas[0];
  1507.         }
  1508.         return $out;
  1509.     }
  1510.     protected function getPersonnelFromEnv($session) : array {
  1511.     $out = array('');
  1512.     $auth_login '';
  1513.     if (!empty($session)) {
  1514.         $auth_login $session->get('user_email');
  1515.     }
  1516.         // NOTE: login args used by search
  1517.         $arg_mail = !empty($_GET['email']) ? $_GET['email']: $auth_login// $this->getAuthCAS(); // $_GET['login'];
  1518.         $login = !empty($_GET['login']) ? $_GET['login']: '';
  1519.     if (!empty($login)) {
  1520.             $out $this->getPersonnelFromLogin($login);
  1521.     } else if (!empty($arg_mail)) {
  1522.         /*
  1523.         $found = $this->selectViewWhere('V_PERSONNEL', "LOWER(EMAIL_PRO)='".strtolower($arg_mail)."'");
  1524.         // echo(__METHOD__.' found: '.var_export($found, true)); exit();
  1525.         if (count($found) > 0) {
  1526.             $out = $found;
  1527.         }
  1528.         //*/
  1529.         //
  1530.             $out $this->getPersonnelFromEmail($arg_mail);
  1531.         }
  1532.     return $out;
  1533.     }
  1534.     // TODO: remove deprecated
  1535.     protected function DEP_getPersonnelFromEnv($session) : array {
  1536.     $out = array('');
  1537.     $personnel_datas = array();
  1538.     $auth_login '';
  1539.     if (!empty($session)) {
  1540.         $auth_login $session->get('user_email');
  1541. // echo(__METHOD__.' auth_login: '.var_export($auth_login, true)); exit();
  1542.         $personnel_datas $session->get('personnel_datas');
  1543.         if (isset($personnel_datas['IDE_DOSSIER'])) {
  1544.             $out $personnel_datas;
  1545.         }
  1546.     }
  1547.         // TODO: REMOVE this TESTONLY
  1548.         // $login = !empty($_GET['email']) ? $_GET['email']: $auth_login; // $this->getAuthCAS(); // $_GET['login'];
  1549.     if (!empty($login)
  1550.         && !isset($personnel_datas['IDE_DOSSIER'])
  1551.     ) {
  1552.         /*
  1553.         $found = $this->selectViewWhere('V_PERSONNEL', "LOWER(EMAIL_PRO)='".strtolower($login)."'");
  1554.         // echo(__METHOD__.' found: '.var_export($found, true)); exit();
  1555.         if (count($found) > 0) {
  1556.             $out = $found;
  1557.         }
  1558.         //*/
  1559.         //
  1560.             $out $this->getPersonnelFromEmail($login);
  1561.     $session->set('personnel_datas'$out);
  1562. // echo(__METHOD__.' out: '.var_export($out, true)); exit();
  1563.     } else if (empty($login)){
  1564.         echo(__METHOD__.' personnel_datas: '.var_export(isset($personnel_datas['IDE_DOSSIER']), true));
  1565.         echo(__METHOD__.' login: '.var_export($logintrue)); exit();
  1566.     }
  1567.     return $out;
  1568.     }
  1569.     protected function selectLastVCardByIdeDossier($ide_dossier$statut 'validé'$DBG false) : array {
  1570.     $out = array();
  1571. /*
  1572.     if (!empty($ide_dossier)) {
  1573.         $RAW_QUERY = "select * from VCARD where IDE_DOSSIER='".$ide_dossier."' and STATUT = '".$statut."' order by D_MODIFICATION desc";
  1574.         $found = $this->selectRaw($RAW_QUERY, $DBG);
  1575.         if (count($found) > 0) {
  1576.             $out = $found[0];
  1577.         }
  1578.     }
  1579.     // */
  1580.     $out $this->selectVCardByIdeDossier($ide_dossier" and ( STATUT = '".$statut."' ) ");
  1581.     if ($DBG != false) {
  1582.         echo(__METHOD__.': out: '.var_export($outtrue));
  1583.     }
  1584.     return $out;
  1585.     }
  1586.     protected function selectVCardByIdeDossier($ide_dossier$opt_where ''$order_by " D_MODIFICATION desc " $DBG false):array {
  1587.         $out = array();
  1588.     if (!empty($ide_dossier)) {
  1589.         $RAW_QUERY "select * from VCARD where IDE_DOSSIER='".$ide_dossier."'"
  1590.             $opt_where
  1591.             . (!empty($order_by) ? ' order by '.$order_by '')
  1592.             ;
  1593.         // echo(__METHOD__.' RAW_QUERY: '.$RAW_QUERY);
  1594.         $found $this->selectRaw($RAW_QUERY$DBG);
  1595.         if (count($found) > 0) {
  1596.             $out $found[0];
  1597.         }
  1598.     }
  1599.     if ($DBG != false) {
  1600.         echo(__METHOD__.': out: '.var_export($outtrue));
  1601.     }
  1602.     return $out;
  1603.     }
  1604.     protected function getRecentVCardByIdeDossier($ide_dossier) {
  1605.         $out $this->selectVCardByIdeDossier($ide_dossier);
  1606.     return $out;
  1607.     }
  1608.     public function selectViewBy_ide_dossier($v_name$ide_dossier$DBG false) : array {
  1609.     return $this->selectViewWhere($v_name'IDE_DOSSIER='.$ide_dossier$DBG);
  1610.     }
  1611.     public function selectMailLike($search$DBG false) {
  1612.     $out = array();
  1613.         if (!empty($search)) {
  1614.         $RAW_QUERY "SELECT EMAIL_PRO FROM V_DATA_VCARD where LOWER(EMAIL_PRO) like '%".$search."%' order by VERSION desc FETCH FIRST 1 ROWS ONLY"// "SELECT EMAIL FROM VCARD where STATUT='validé' and LOWER(EMAIL) like '%".$search."%' order by VERSION desc FETCH FIRST 1 ROWS ONLY"; // "SELECT EMAIL FROM VCARD where LOWER(EMAIL) like '%". $search."%'"; // ' where IDE_DOSSIER='.$ide_dossier;
  1615.         
  1616.         $found $this->selectRaw($RAW_QUERY$DBG);
  1617.         if (count($found) > 0) {
  1618.             $out $found;
  1619.         }    
  1620.     }
  1621.     return $out;
  1622.     }
  1623.     protected function isSelfValidator($datas) {
  1624.         $out 
  1625.            // $datas['IDE_DOSSIER'] = 5474 || 
  1626.             true && !empty($datas)
  1627.         && isset($datas['AUTO_VALIDATION'])
  1628.         && $datas['AUTO_VALIDATION'] == 1
  1629.             ;
  1630.     return $out;
  1631.     }
  1632.     protected function getPendingMailContent($datas) {
  1633.         $out null;
  1634.         if (isset($datas['ID_VCARD'])
  1635.             && isset($datas['STATUT'])
  1636.         ) {
  1637.             // $out = $this::PENDING_MAIL[]
  1638.         }
  1639.         return $out;
  1640.     }
  1641.     protected function assignTplValues($content$values) {
  1642.         $out $content;
  1643.         if (isset($out)
  1644.             && isset($values)
  1645.         ) {
  1646.             $k_val array_keys($values);
  1647.             foreach ($k_val as $k => $item) {
  1648.                 $out str_replace('{'.$item.'}'$values[$item], $out);
  1649.             }
  1650.         }
  1651.         return $out;
  1652.     }
  1653.     protected function sendPendingRequest($mailer$datas$DBG false) {
  1654.         if (isset($mailer
  1655.             && isset($datas['EMAIL'])
  1656.             && isset($datas['IDE_DOSSIER'])
  1657.             && isset($datas['IDE_MANAGER'])
  1658.             && isset($datas['STATUT'])
  1659.         ) {
  1660.             // $ide_manager = $datas['IDE_MANAGER'];
  1661.             $ide_dossier $datas['IDE_DOSSIER'];
  1662.             $manager_datas $this->getPersonnelFromIdeDossier($ide_manager);
  1663.                $owner_datas $this->getPersonnelFromIdeDossier($ide_dossier);
  1664.             $ide_manager $owner_datas['IDE_MANAGER'];
  1665.             //*
  1666.             //
  1667.             //
  1668.             $owner_datas['URI'] =  "https://{$_SERVER['HTTP_HOST']}";
  1669.             $owner_datas['ID_VCARD'] = $datas['ID_VCARD'];
  1670.             if (isset($this->pendingMailDatas[$datas['STATUT']])) {
  1671.                 $content $this->assignTplValues($this->pendingMailDatas[$datas['STATUT']]['content'], $owner_datas);
  1672.                 $subject $this->pendingMailDatas[$datas['STATUT']]['subject'];
  1673.                 if (!array_key_exists('EMAIL_PRO'$manager_datas)) {
  1674.                     echo('-- FAIL:' .var_export($manager_datastrue));
  1675.                     echo(' datas: 'var_export($datastrue));
  1676.                     echo('<br/>'."\n");
  1677.                     return;
  1678.                 }
  1679.                 // echo($manager_datas['EMAIL_PRO']).' ';
  1680.                 // echo($owner_datas['EMAIL_PRO']).'<br/> ';
  1681.                 $dst_mail = ($datas['STATUT'] == 'à valider' $manager_datas['EMAIL_PRO'] : (array_key_exists('EMAIL_PRO'$owner_datas) && isset($owner_datas['EMAIL_PRO']) ? $owner_datas['EMAIL_PRO'] : 'NO_EMAIL_PRO' ));
  1682.                 $dbg_dst_mail  $dst_mail;
  1683.                 // $dst_mail = 'herimamy.ratefiarivony@ensam.eu';
  1684.                 if ($DBG !== false) {
  1685.                     echo(__METHOD__.':'var_export($manager_datastrue));
  1686.                     echo(__METHOD__.':'var_export($owner_datastrue));
  1687.                     echo(__METHOD__.'<br/>'.var_export($datastrue));
  1688.                     echo('<br/>'
  1689.                         "To: $dbg_dst_mail<br/>"
  1690.                         "Subject: $subject<br/>"
  1691.                         "Content:<br/>"
  1692.                         $content
  1693.                     );
  1694.                 }
  1695.                 // date_default_timezone_set('Europe/Berlin');
  1696.                 echo((gmdate('Y-m-d H:i:s \G\M\T'strtotime('+2 hours'))).': '$datas['STATUT'].' '$dbg_dst_mail.((($datas['STATUT'] == 'à valider' && isset($owner_datas['EMAIL_PRO'])) ? ' '.$owner_datas['EMAIL_PRO']:'')).'<br/>'."\n");
  1697.                 if ($dst_mail != 'NO_EMAIL_PRO') {
  1698.                     $this->sendemail($mailer$dst_mail$subject$content);
  1699.                 // */
  1700.                     //
  1701.                 } else {
  1702.                     echo('FAILED: ');
  1703.                     echo($dst_mail) . '<br/>'
  1704.                         .var_export($datastrue)
  1705.                         ;
  1706.                 }
  1707.             }
  1708.         }
  1709.     }
  1710.     protected function notifyForVCard($mailer$vCard$subject, array $content_datasLoggerInterface $logger null) {
  1711.         if (isset($vCard)
  1712.         && !empty($subject)
  1713.             && isset($content_datas['user'])
  1714.         && isset($content_datas['manager'])
  1715.         ) {
  1716.                $id_vcard $vCard->getId();
  1717.         $ide_dossier  $vCard->getide_dossier();
  1718.         $ide_manager  $vCard->getide_manager();
  1719.         
  1720.         $manager_datas $this->getPersonnelFromIdeDossier($ide_manager);
  1721.            $owner_datas $this->getPersonnelFromIdeDossier($ide_dossier);
  1722.         /*
  1723.          $uri = "http://{$_SERVER['HTTP_HOST']}"; // {$_SERVER['REQUEST_URI']}";
  1724.         $user_content = '<b>Utilisateur</b><br/>' 
  1725.             . 'Votre carte vient d\'être validée...<br/>'
  1726.             . 'Vous pouvez la consulter à cette adresse:<br/>'
  1727.             . '<a href="'.$uri.'/v/card/">'
  1728.             . 'Voir...'
  1729.             . '</a>'
  1730.             ;
  1731.                  */
  1732.                 if (isset($owner_datas['EMAIL_PRO'])
  1733.                     && !empty($content_datas['user'])
  1734.                 ) {
  1735.             $this->sendemail($mailer$owner_datas['EMAIL_PRO'], $subject$content_datas['user'], $logger);
  1736.         }
  1737.         /*
  1738.         $manager_content = '<hr/><b>Manager</b><br/>'
  1739.             .'Merci un mail a été envoyé au propriétaire de la carte à cette adresse: ' . $owner_datas['EMAIL_PRO']
  1740.             // . '<a href="'.$uri.'/v/card/'.$id_vcard.'?manager=1">'
  1741.             // . 'Voir...'
  1742.             // . '</a>'
  1743.             ;
  1744.         */
  1745.                 if (isset($manager_datas['EMAIL_PRO'])
  1746.                     && !empty($content_datas['manager'])
  1747.                 ) {
  1748.             /* TODO: REMOVE this TESTONLY
  1749.             $manager_datas['EMAIL_PRO'] = 'herimamy.ratefiarivony@ensam.eu';
  1750.             // */
  1751.             $this->sendemail($mailer$manager_datas['EMAIL_PRO'], $subject$content_datas['manager'], $logger);
  1752.         }
  1753.         }
  1754.     }
  1755.     /**
  1756.      * @Route("/v/card/{id_vcard}/accepted", name="app_v_card_accepted", methods={"GET", "POST"})
  1757.      */
  1758.     public function accepted(Request $requestVCard $vCardVCardRepository $vCardRepositoryMailerInterface $mailerLoggerInterface $logger): Response
  1759.     {
  1760.         // echo(__METHOD__.': mailer: '.var_export($mailer, true)); exit();
  1761.         $id_vcard $vCard->getId();
  1762.         $content 'ACCESS_DENIED';
  1763.     $session $request->getSession();
  1764.     $is_auth $session->get('is_auth');
  1765.     $user_email $session->get('user_email');
  1766.     $personnel_datas $this->getPersonnelFromEnv($session);
  1767.     if (!$is_auth) {
  1768.         $session->set('previous''app_v_card_accepted');
  1769.         $session->set('prev_id'$vCard->getId());
  1770.         return new Response(null302, array(
  1771.                 'Location'        => '/v/card/auth',
  1772.         ));
  1773.     } else {
  1774.         $ide_dossier  $vCard->getide_dossier();
  1775.         $owner_datas $this->getPersonnelFromIdeDossier($ide_dossier);
  1776.         $owner_mail = isset($owner_datas['EMAIL_PRO']) ? $owner_datas['EMAIL_PRO'] : '';
  1777.         // echo(__METHOD__.''.var_export($owner_mail, true)); exit();
  1778. if ($vCard->getstatut() == 'validé') {
  1779.          $uri "https://{$_SERVER['HTTP_HOST']}"// {$_SERVER['REQUEST_URI']}";
  1780.     $content_datas = array(
  1781.         'user' =>         'Bonjour '.$owner_datas['PRENOM'].',<br/>'
  1782.                         .'Votre carte de visite vient d\'être acceptée.<br/>'
  1783.                             .'Vous pouvez la consulter à cette adresse:<br/>'
  1784.                             '<a href="'.$uri.'/v/card/last?email='.$owner_mail.'">'
  1785.                             'Voir...'
  1786.                         '</a><br/>'
  1787.                         '<i>Ce message a été créé automatiquement par le gestionnaire de carte de visites des Arts et Métiers, merci de ne pas y répondre.</i>'
  1788.                         ,
  1789.                 'manager' => '' // 'Merci un mail a été envoyé au propriétaire de la carte...'
  1790.                             // . '<a href="'.$uri.'/v/card/'.$id_vcard.'?manager=1">'
  1791.                             // . 'Voir...'
  1792.                         //. '</a>'
  1793.                     ,
  1794.                 );
  1795.         $subject 'Carte de visite acceptée';
  1796.        // $content = $content_datas['user'].'<hr/>'.$content_datas['manager'];
  1797.        // if (!isset($_GET['stay'])) {
  1798.            // $content = '<script type="text/JavaScript">window.close();</script>';
  1799.         $content '<script type="text/JavaScript">window.location.href = "/v/card/manager";</script>';
  1800.        // }
  1801.          /*
  1802.         if (file_exists($this->uploadsDIR.('tmp_photo_'.$ide_dossier.'.jpg'))) {
  1803.             rename($this->uploadsDIR.('tmp_photo_'.$ide_dossier.'.jpg'), $this->uploadsDIR.('photo_'.$ide_dossier.'.jpg'));
  1804.         }
  1805.         //*/
  1806.         $this->notifyForVCard($mailer$vCard$subject$content_datas$logger);
  1807.         // TODO generateQrCodeFile in folder
  1808.         //*
  1809.             $url "https://{$_SERVER['HTTP_HOST']}/v/card/last?";
  1810.              $this->generateQrCodeFile($url$owner_mail);
  1811.         //*/
  1812. }
  1813.     } // END is_auth
  1814.     return new Response($content200, array(
  1815.             'Content-type'        => 'text/html',
  1816.         )
  1817.     );
  1818.     }
  1819.     /**
  1820.      * @Route("/v/card/{id_vcard}/rejected", name="app_v_card_rejected", methods={"GET", "POST"})
  1821.      */
  1822.     public function rejected(Request $requestVCard $vCardVCardRepository $vCardRepositoryMailerInterface $mailer): Response
  1823.     {
  1824.         $id_vcard $vCard->getId();
  1825.     $content 'ACCESS_DENIED';
  1826.     $session $request->getSession();
  1827.     $is_auth $session->get('is_auth');
  1828.     $user_email $session->get('user_email');
  1829.     $personnel_datas $this->getPersonnelFromEnv($session);
  1830.     if (!$is_auth) {
  1831.         $session->set('previous''app_v_card_rejected');
  1832.         $session->set('prev_id'$vCard->getId());
  1833.         return new Response(null302, array(
  1834.                 'Location'        => '/v/card/auth',
  1835.         ));
  1836.     } else {
  1837. if ($vCard->getstatut() == 'rejetée') {
  1838.         $ide_dossier  $vCard->getide_dossier();
  1839.         $owner_datas $this->getPersonnelFromIdeDossier($ide_dossier);
  1840.          $uri "https://{$_SERVER['HTTP_HOST']}"// {$_SERVER['REQUEST_URI']}";
  1841.     $content_datas = array(
  1842.         'user' => 'Bonjour '.$owner_datas['PRENOM'].',<br/>'
  1843.                         .'Votre carte de visite vient d\'être rejetée.<br/>'
  1844.                             .'Vous pouvez la modifier à cette adresse:<br/>'
  1845.                             '<a href="'.$uri.'/v/card/'.$id_vcard.'">'
  1846.                             'Voir...'
  1847.                         '</a><br/>'
  1848.                         '<i>Ce message a été créé automatiquement par le gestionnaire de carte de visites des Arts et Métiers, merci de ne pas y répondre.</i>'
  1849.                     ,
  1850.                 'manager' => '' // 'Merci un mail a été envoyé au propriétaire de la carte...'
  1851.                             // . '<a href="'.$uri.'/v/card/'.$id_vcard.'?manager=1">'
  1852.                             // . 'Voir...'
  1853.                         //. '</a>'
  1854.                     ,
  1855.                 );
  1856.         $subject 'Carte de visite rejetée';
  1857.        $content $content_datas['user'].'<hr/>'.$content_datas['manager'];
  1858.        if (!isset($_GET['stay'])) {
  1859.            // $content = '<script type="text/JavaScript">window.close();</script>';
  1860.         $content '<script type="text/JavaScript">window.location.href = "/v/card/manager";</script>';
  1861.        }
  1862.         $this->notifyForVCard($mailer$vCard$subject$content_datas);
  1863. }    
  1864.     }
  1865.     return new Response($content200, array(
  1866.             'Content-type'        => 'text/html',
  1867.         )
  1868.     );
  1869.     }
  1870.    protected function getManagedCards($ide_manager$DBG false) : array {
  1871.        $out = array();
  1872.     if (!empty($ide_manager)) {
  1873.         $out $this->selectFromWhere('VCARD''IDE_MANAGER = '$ide_manager." AND STATUT='à valider'"null$DBG);
  1874.     }
  1875.     return $out;
  1876.    }
  1877.     /**
  1878.      * @Route("/v/card/{id_vcard}/submited", name="app_v_card_submited", methods={"GET", "POST"})
  1879.      */
  1880.     public function submited(Request $requestVCard $vCardVCardRepository $vCardRepositoryMailerInterface $mailerLoggerInterface $logger): Response
  1881.     {
  1882.     $session $request->getSession();
  1883.     $is_auth $session->get('is_auth');
  1884.     $user_email $session->get('user_email');
  1885.     $personnel_datas $this->getPersonnelFromEnv($session);
  1886.     if (!$is_auth) {
  1887.         $session->set('previous''app_v_card_submited');
  1888.         $session->set('prev_id'$vCard->getId());
  1889.         return new Response(null302, array(
  1890.                 'Location'        => '/v/card/auth',
  1891.         ));
  1892.     } else {
  1893.         $id_vcard $vCard->getId();
  1894.          $uri "https://{$_SERVER['HTTP_HOST']}"// {$_SERVER['REQUEST_URI']}";
  1895.     $content 'ACCESS_DENIED';
  1896. if ($vCard->getstatut() == 'à valider') { // NOTE: statut set in card_edit
  1897.     $ide_dossier  $vCard->getide_dossier();
  1898.     $this->disableOldPendingCards($vCard);
  1899.         $owner_datas $this->getPersonnelFromIdeDossier($ide_dossier);
  1900.     $content_datas = array(
  1901.         'user' =>     'Bonjour '.$owner_datas['PRENOM'].',<br/>'
  1902.                         .'Votre nouvelle carte vient d\'être soumise à validation...<br/>'
  1903.                             .'Vous pouvez suivre son statut à cette adresse:<br/>'
  1904.                             '<a href="'.$uri.'/v/card/'.$id_vcard.'">'
  1905.                             'Voir...'
  1906.                         '</a><br/>'
  1907.                         '<i>Ce message a été créé automatiquement par le gestionnaire de carte de visites des Arts et Métiers, merci de ne pas y répondre.</i>'
  1908.                         ,
  1909.                 'manager' => 'La carte de '.$owner_datas['PRENOM'].' '$owner_datas['NOM'].' attend votre validation, cliquer sur le lien pour accéder à la demande de validation.<br/>'
  1910.                             '<a href="'.$uri.'/v/card/manager">'
  1911.                             'Voir...'
  1912.                         '</a>',
  1913.                         //. 'Une nouvelle carte ('.$owner_datas['EMAIL_PRO'].') attend votre validation à cette adresse:<br/>'
  1914.                 );
  1915.         /*
  1916.         $content = '<b>Utilisateur</b><br/>' 
  1917.             . 'Votre nouvelle carte vient d\'être soumise à validation...<br/>'
  1918.             .'Vous pouvez suivre sont statut à cette adresse:<br/>'
  1919.             . '<a href="'.$uri.'/v/card/'.$id_vcard.'">'
  1920.             . 'Voir...'
  1921.             . '</a>'
  1922.             .'<hr/><b>Manager</b><br/>'
  1923.             .'Une nouvelle carte attend votre validation à cette adresse:<br/>'
  1924.             . '<a href="'.$uri.'/v/card/'.$id_vcard.'?manager=1">'
  1925.             . 'Voir...'
  1926.             . '</a>'
  1927.             ;
  1928.         //*/
  1929.         $subject '[Arts et Métiers] - carte de visite à valider - '.$owner_datas['PRENOM'].' '.$owner_datas['NOM']; // 'Carte de visite soumise';
  1930.        // $content = $content_datas['user'].'<hr/>'.$content_datas['manager'];
  1931.         //* / TODO: enable this
  1932.         $this->notifyForVCard($mailer$vCard$subject$content_datas$logger);
  1933.         //*/
  1934. }
  1935. /*
  1936.     return new Response($content, 200, array(
  1937.             'Content-type'        => 'text/html',
  1938.         )
  1939.     );
  1940.         */
  1941.         return new Response(null302, array(
  1942.                 'Location'        => '/v/card',
  1943.         ));
  1944.     } // END is_auth
  1945.     }
  1946.     protected function duplicateCard(VCard $vCard, array $personnel_datasEntityManagerInterface $em) { // VCardRepository $vCardRepository) {
  1947.         $out false;
  1948.         if (isset($vCard) && isset($personnel_datas['IDE_MANAGER']) && isset($em)) {
  1949.         // echo(__METHOD__.': '.var_export($vCard, true)); echo('<br/>');
  1950.             $new_card = new VCard();
  1951.         $new_id $this->getNewVCardId();
  1952.         $new_card->setid_vcard($new_id);
  1953.         $new_card->settitre($vCard->gettitre());
  1954.         $new_card->settel($vCard->gettel());
  1955.         $new_card->setide_dossier($vCard->getide_dossier());
  1956.         $new_card->setemail($vCard->getemail());
  1957.         $new_card->setavec_photo($vCard->getavec_photo());
  1958.         $new_card->setstatut('enregistrée');
  1959.         $new_card->setVERSION(($vCard->getversion() * 1) + 1);
  1960.         $new_card->setide_manager($personnel_datas['IDE_MANAGER']);
  1961.         if ($this->isSelfValidator($personnel_datas)) {
  1962.             $new_card->setstatut('validé');        
  1963.         }
  1964.         $new_card->setDMODIFICATION((new DateTime('now', new DateTimeZone('Europe/Budapest'))));
  1965.         // echo(__METHOD__.': '.var_export($new_card, true)); exit();
  1966.                 // $vCardRepository->add($new_card, true);
  1967.         $em->detach($vCard);
  1968.         $em->persist($new_card);
  1969.         $em->flush();
  1970.            $out true
  1971.         }
  1972.         return($out);
  1973.     }
  1974.     /**
  1975.      * @Route("/v/card/{id_vcard}/duplicate", name="app_v_card_duplicate", methods={"GET", "POST"})
  1976.      */
  1977.     public function duplicate(Request $requestVCard $vCardVCardRepository $vCardRepository): Response
  1978.     {
  1979.     $session $request->getSession();
  1980.     $is_auth $session->get('is_auth');
  1981.     $user_email $session->get('user_email');
  1982.     $personnel_datas $this->getPersonnelFromEnv($session);
  1983.         
  1984.     if (!$is_auth) {
  1985.         $session->set('previous''app_v_card_duplicate');
  1986.         $session->set('prev_id'$vCard->getId());
  1987.         return new Response(null302, array(
  1988.                 'Location'        => '/v/card/auth',
  1989.         ));
  1990.     } else { 
  1991.         // echo(__METHOD__.': '.var_export($vCard, true)); exit();
  1992.         $new_card = new VCard();
  1993.         $new_id $this->getNewVCardId();
  1994.         $new_card->setid_vcard($new_id);
  1995.         $new_card->settitre($vCard->gettitre());
  1996.         $new_card->settel($vCard->gettel());
  1997.         $new_card->setide_dossier($vCard->getide_dossier());
  1998.         $new_card->setemail($vCard->getemail());
  1999.         $new_card->setavec_photo($vCard->getavec_photo());
  2000.         $new_card->setstatut('enregistrée');
  2001.         $new_card->setVERSION(($vCard->getversion() * 1) + 1);
  2002.         $new_card->setide_manager($personnel_datas['IDE_MANAGER']);
  2003.         // echo(__METHOD__.': '.var_export($new_card, true)); exit();
  2004.             $vCardRepository->add($new_cardtrue);
  2005.             return $this->redirectToRoute('app_v_card_edit', ['id_vcard' => $new_id], Response::HTTP_SEE_OTHER);
  2006.     }    
  2007.     }
  2008.     /**
  2009.      * @Route("/v/card/{id_vcard}/infos", name="app_v_card_info", methods={"GET", "POST"})
  2010.      */
  2011.     public function infos(Request $requestVCard $vCardVCardRepository $vCardRepository): Response {
  2012.     $session $request->getSession();
  2013.     $is_auth $session->get('is_auth');
  2014.     $user_email $session->get('user_email');
  2015.     $personnel_datas $this->getPersonnelFromEnv($session);
  2016.     // $user_email = $session->get('is_auth');
  2017.     // echo(__METHOD__.': session:'.var_export($_SESSION, true)); exit();
  2018.     
  2019.     $ide_dossier $vCard->getide_dossier();
  2020.     $is_owner $ide_dossier == $personnel_datas['IDE_DOSSIER'];
  2021.     $last_card $this->getLastCardId($vCard);
  2022.             $owner_id $vCard->getide_dossier();
  2023.             $query 'select max(id_vcard) as F_ID from vcard where ide_dossier='.$owner_id." AND statut='enregistrée' or statut='validé'";
  2024.     echo(__METHOD__.' query: ' $query);
  2025.         
  2026.     if (!$is_auth) {
  2027.         $session->set('previous''app_v_card_info');
  2028.         return new Response(null302, array(
  2029.                 'Location'        => '/v/card/auth',
  2030.         ));
  2031.     } else {
  2032.             $ide_manager $personnel_datas['IDE_MANAGER'];
  2033.             // $ide_dossier = $datas['IDE_DOSSIER'];
  2034.             $manager_datas $this->getPersonnelFromIdeDossier($ide_manager);
  2035.                $owner_datas $this->getPersonnelFromIdeDossier($ide_dossier);
  2036.         echo(__METHOD__.': last card datas: '.var_export($last_cardtrue));
  2037.             echo('<br/>');
  2038.         echo(__METHOD__.': owner_datas: '.var_export($owner_datastrue));
  2039.             echo('<br/>');
  2040.     
  2041.             echo(__METHOD__.': manager_datas: '.var_export($manager_datastrue));
  2042.             echo('<br/>');
  2043.         echo(__METHOD__.': personnel_datas: '.var_export($personnel_datastrue));
  2044.             echo('<br/>');
  2045.         echo(__METHOD__.': personnel_datas: '.var_export($personnel_datastrue));
  2046.         echo(__METHOD__.': '.var_export($vCardtrue));
  2047.         echo(__METHOD__.': photo:' $vCard->getavec_photo()); exit();
  2048.     
  2049.     } 
  2050.     }
  2051.     public function getLastCardId(VCard $vcard) {
  2052.         $out null;
  2053.         if (!empty($vcard)) {
  2054.             $owner_id $vcard->getide_dossier();
  2055.             $query 'select max(id_vcard) as F_ID from vcard where ide_dossier='.$owner_id." AND (statut='enregistrée' or statut='validé')";
  2056.             $result $this->selectRaw($query);
  2057.             if (isset($result[0]['F_ID'])) {
  2058.                 $out $result[0]['F_ID'];
  2059.             }
  2060.         }
  2061.         return $out;
  2062.     }
  2063.     /**
  2064.      * @Route("/v/card/{id_vcard}/liveedit", name="app_v_card_liveedit", methods={"GET", "POST"})
  2065.      */
  2066.     public function liveedit(Request $requestVCard $vCardEntityManagerInterface $em): Response
  2067.     {
  2068.     $session $request->getSession();
  2069.     $is_auth $session->get('is_auth');
  2070.     $user_email $session->get('user_email');
  2071.     $personnel_datas $this->getPersonnelFromEnv($session);
  2072.     // $user_email = $session->get('is_auth');
  2073.     // echo(__METHOD__.': session:'.var_export($_SESSION, true)); exit();
  2074.     // echo(__METHOD__.': personnel_datas: '.var_export($personnel_datas, true)); exit();
  2075.     $ide_dossier $vCard->getide_dossier();
  2076.     $cur_card_id $vCard->getId();
  2077.     if (isset($personnel_datas['IDE_DOSSIER'])) {
  2078.         $is_owner $ide_dossier == $personnel_datas['IDE_DOSSIER'];
  2079.     }
  2080.         
  2081.     if (!$is_auth) {
  2082.         $session->set('previous''app_v_card_edit');
  2083.         $session->set('prev_id'$vCard->getId());
  2084.         return new Response(null302, array(
  2085.                 'Location'        => '/v/card/auth',
  2086.         ));
  2087.     } else if (!$is_owner) {
  2088.         return new Response(null302, array(
  2089.                 'Location'        => 'notfound',
  2090.         ));
  2091.         exit();
  2092. /*
  2093.         return new Response(null, 404, array(
  2094.                 // 'Location'        => 'auth',
  2095.         ));
  2096.                  */
  2097.     // else 
  2098.         
  2099.     $last_card_id $this->getLastCardId($vCard);
  2100.     if (FALSE && 
  2101.         !empty($last_card_id) && $cur_card_id != $last_card_id
  2102.     ) {
  2103.             return $this->redirectToRoute('app_v_card_edit', ['id_vcard' => $last_card_id], Response::HTTP_SEE_OTHER);
  2104.     } else { 
  2105.     $infos_carte $this->getV_INFOS_CARTE($vCard->getide_dossier());
  2106.         $form $this->createForm(VCardType::class, $vCard);
  2107.         $form->handleRequest($request);
  2108.     $custom_photo_key '';
  2109.     $delete_custom_key '';
  2110.     $file_path $this->uploadsDIR.('photo_'.$ide_dossier.'.jpg');
  2111.     $is_custom_photo = (file_exists($file_path)); // NOTE: user needs to delete to disable custom
  2112.     if ($is_custom_photo) {
  2113.         $custom_photo_key $this->storeInSession($session$file_path);
  2114.         $delete_custom_key $this->storeInSession($session$file_path);
  2115.     }
  2116.     if ($form->isSubmitted() && $form->isValid()) {
  2117.         // echo(__METHOD__.': vCard:'.var_export($vCard, true)); exit();
  2118.         if (!$this->duplicateCard($vCard$personnel_datas$em)) { // $vCardRepository)) {
  2119.             // Redirect to error
  2120.             echo(__METHOD__.': vCard: duplicate FAILED: '); // .var_export($vCard, true)); exit();
  2121.             exit();
  2122.         }
  2123.             return $this->redirectToRoute('app_v_card_index', [], Response::HTTP_SEE_OTHER); exit();
  2124.         }
  2125.     // echo('<!-- '.__METHOD__.' '.$this->getLastCardId($vCard).' // -->');
  2126.         return $this->renderForm('v_card/edit.html.twig', [
  2127.         'v_card' => $vCard,
  2128.         'user_email' => $user_email,
  2129.         'personnel'    => $personnel_datas,
  2130.         'is_new'    => false,
  2131.         'is_live'    => true,
  2132.         'disp_form'    => true,
  2133.         'is_manager'    => $session->get('is_manager'),
  2134.         'custom_photo_key'     => $custom_photo_key,
  2135.         'delete_custom_key'    => $delete_custom_key,
  2136.             'form' => $form,
  2137.     ]);
  2138.     } // END if edit
  2139.     }
  2140.     /**
  2141.      * @Route("/v/card/{id_vcard}/edit", name="app_v_card_edit", methods={"GET", "POST"})
  2142.      */
  2143.     public function edit(Request $requestVCard $vCardVCardRepository $vCardRepository): Response
  2144.     {
  2145.     // $this->testConnection($vCardRepository->getDBConnection());
  2146.     // echo(__METHOD__.': vCard: '.var_export($vCard->getide_dossier(), true)); // exit();
  2147.     $session $request->getSession();
  2148.     $is_auth $session->get('is_auth');
  2149.     $user_email $session->get('user_email');
  2150.     $personnel_datas $this->getPersonnelFromEnv($session);
  2151.     // $user_email = $session->get('is_auth');
  2152.     // echo(__METHOD__.': session:'.var_export($_SESSION, true)); exit();
  2153.     // echo(__METHOD__.': personnel_datas: '.var_export($personnel_datas, true)); exit();
  2154.     $ide_dossier $vCard->getide_dossier();
  2155.     $cur_card_id $vCard->getId();
  2156.     if (isset($personnel_datas['IDE_DOSSIER'])) {
  2157.         $is_owner $ide_dossier == $personnel_datas['IDE_DOSSIER'];
  2158.     }
  2159.         
  2160.     if (!$is_auth) {
  2161.         $session->set('previous''app_v_card_edit');
  2162.         $session->set('prev_id'$vCard->getId());
  2163.         return new Response(null302, array(
  2164.                 'Location'        => '/v/card/auth',
  2165.         ));
  2166.     } else if (!$is_owner) {
  2167.         /*
  2168.         $owner_datas = $this->getPersonnelFromIdeDossier($ide_dossier);
  2169.         echo(__METHOD__.' owner: '.var_export($owner_datas, true).' personnel_datas: ' . var_export($personnel_datas, true));
  2170.         echo(__METHOD__. ': not owner'); exit();
  2171.         // */
  2172.         return new Response(null302, array(
  2173.                 'Location'        => 'notfound',
  2174.         ));
  2175. /*
  2176.         return new Response(null, 404, array(
  2177.                 // 'Location'        => 'auth',
  2178.         ));
  2179.                  */
  2180.     // else 
  2181.         
  2182.     $last_card_id $this->getLastCardId($vCard);
  2183.         if (!empty($last_card_id) && $cur_card_id != $last_card_id
  2184.     ) {
  2185.             return $this->redirectToRoute('app_v_card_edit', ['id_vcard' => $last_card_id], Response::HTTP_SEE_OTHER);
  2186.     } else { 
  2187.     $infos_carte $this->getV_INFOS_CARTE($vCard->getide_dossier());
  2188.         $form $this->createForm(VCardType::class, $vCard);
  2189.         $form->handleRequest($request);
  2190.     $custom_photo_key '';
  2191.     $delete_custom_key '';
  2192.     $file_path $this->uploadsDIR.('photo_'.$ide_dossier.'.jpg');
  2193.     $is_custom_photo = (file_exists($file_path)); // NOTE: user needs to delete to disable custom
  2194.     if ($is_custom_photo) {
  2195.         $custom_photo_key $this->storeInSession($session$file_path);
  2196.         $delete_custom_key $this->storeInSession($session$file_path);
  2197.     }
  2198.     if ($form->isSubmitted() && $form->isValid()) {
  2199.         // echo(__METHOD__.': vCard:'.var_export($vCard, true)); exit();
  2200.         if ($this->isSelfValidator($personnel_datas)) {
  2201.             $vCard->setstatut('validé');        
  2202.         }
  2203.         $vCard->setDMODIFICATION((new DateTime('now', new DateTimeZone('Europe/Budapest'))));
  2204.         $vCardRepository->add($vCardtrue);
  2205.             return $this->redirectToRoute('app_v_card_index', [], Response::HTTP_SEE_OTHER);
  2206.         }
  2207.     // echo('<!-- '.__METHOD__.' '.$this->getLastCardId($vCard).' // -->');
  2208.         return $this->renderForm('v_card/edit.html.twig', [
  2209.         'v_card' => $vCard,
  2210.         'user_email' => $user_email,
  2211.         'personnel'    => $personnel_datas,
  2212.         'is_new'    => false,
  2213.         'disp_form'    => true,
  2214.         'is_manager'    => $session->get('is_manager'),
  2215.         'custom_photo_key'     => $custom_photo_key,
  2216.         'delete_custom_key'    => $delete_custom_key,
  2217.             'form' => $form,
  2218.     ]);
  2219.     } // END if edit
  2220.     }
  2221.     /**
  2222.      * @Route("/v/card/{id_vcard}", name="app_v_card_delete", methods={"POST"})
  2223.      */
  2224.     public function delete(Request $requestVCard $vCardVCardRepository $vCardRepository): Response
  2225.     {
  2226.     $session $request->getSession();
  2227.     $is_auth $session->get('is_auth');
  2228.     $user_email $session->get('user_email');
  2229.     // $user_email = $session->get('is_auth');
  2230.     // echo(__METHOD__.': session:'.var_export($_SESSION, true)); exit();
  2231.         
  2232.     if (!$is_auth) {
  2233.         $session->set('previous''app_v_card_delete');
  2234.         return new Response(null302, array(
  2235.                 'Location'        => '/v/card/auth',
  2236.         ));
  2237.     } else { 
  2238.         if ($this->isCsrfTokenValid('delete'.$vCard->getID_VCARD(), $request->request->get('_token'))) {
  2239.             echo(__METHOD__.': id: '.$vCard->getID_VCARD()); exit();
  2240.             // $vCardRepository->remove($vCard, true);
  2241.         }
  2242.     return $this->redirectToRoute('app_v_card_index', [], Response::HTTP_SEE_OTHER);
  2243.     }
  2244.     }
  2245. }