src/Controller/VCardController.php line 1314

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.         if (isset($_GET['DBG'])) {
  816.             echo(__METHOD__.': '' from: '$this->applicationSender.'@'.$_SERVER['HTTP_HOST']. ' to:'.$to.' Subject: '.$subject.'<br/>');
  817.         }
  818.         try {
  819.             $mailer->send($email);
  820.             if (!is_null($logger)) {
  821.                 $logger->info('Sent to:'.$to.' Subject:'.$subject);
  822.             }
  823.         } catch (TransportExceptionInterface $e) {
  824.             // some error prevented the email sending; display an
  825.             // error message or try to resend the message
  826.             //
  827.             $content __METHOD__.': ERR: '.$e->getDebug();
  828.         }
  829.         }
  830.         /*
  831.         return new Response($content, 200, array(
  832.             'Content-type'        => 'text/html',
  833.         )
  834.         );
  835.         //*/
  836.         // echo($content);
  837.     }
  838.    /**
  839.      * @Route("/v/card/messengerconsume", name="app_v_card_messengerconsume", methods={"GET", "POST"})
  840.      */
  841.     public function messengerconsume(MailerInterface $mailerRequest $request): Response {
  842.         $command '/usr/bin/php '.__DIR__.'/../../bin/console -t120  -q messenger:consume async';
  843.         $content __METHOD__.': Done'
  844.         $output null;
  845.         $status null;
  846.         exec($command$output$status);
  847.         $content .= var_export($outputtrue);
  848.         return new Response($content200, array(
  849.                 'Content-type'        => 'text/html',
  850.             )
  851.         );
  852.     }
  853.     /**
  854.      * @Route("/v/card/testemail", name="app_v_card_testemail", methods={"GET", "POST"})
  855.      */
  856.     public function testemail(MailerInterface $mailerRequest $request): Response {
  857.         //*
  858.     $session $request->getSession();
  859.     $is_auth $session->get('is_auth');
  860.     $personnel_datas $session->get('personnel_datas');
  861.     $datas = array();
  862.         echo(__METHOD__.': personnel_datas: '.var_export($personnel_datastrue));
  863.     //*/
  864. /*
  865.     $email = (new Email())
  866.             ->from('hello@example.com')
  867.             //->cc('cc@example.com')
  868.             //->bcc('bcc@example.com')
  869.             //->replyTo('fabien@example.com')
  870.             //->priority(Email::PRIORITY_HIGH)
  871.             ->subject('Time for Symfony Mailer!')
  872.             ->text('Sending emails is fun again!')
  873.         ->html('<p>See Twig integration for better HTML integration!</p>')
  874.         ;
  875.     
  876.     $content = __METHOD__.': SENT';
  877. // ...
  878. try {
  879.     $mailer->send($email);
  880. } catch (TransportExceptionInterface $e) {
  881.     // some error prevented the email sending; display an
  882.     // error message or try to resend the message
  883.     //
  884.     $content = __METHOD__.': ERR: '.$e->getDebug();
  885. }
  886.     //*/
  887.     //
  888. //
  889.     $this->sendemail($mailer'herimamy.ratefiarivony@ensam.eu''Route testemail....'__METHOD__.': Hello');
  890. //
  891. /*
  892.     $headers = 'From: webmaster@example.com' . "\r\n" .
  893.                 'Reply-To: webmaster@example.com' . "\r\n" .
  894.                 'X-Mailer: PHP/' . phpversion();
  895.     mail('herimamy.ratefiarivony@ensam.eu', 'Route testemail....', __METHOD__.': Hello', $headers);
  896.  */
  897.     $content __METHOD__.': done....';
  898.     /*
  899.     if (!$is_auth) {
  900.         $datas['needs_auth'] = true;
  901.     } else if (isset($_GET['disable']) && $_GET['disable'] == 1) {
  902.         $datas['is_manager'] = $session->set('is_manager', false);
  903.     } else {
  904.         $datas['is_manager'] = $session->set('is_manager', true);
  905.         $content = 'MANAGER';
  906.     }
  907.     // */
  908.     
  909.         return new Response($content200, array(
  910.                 'Content-type'        => 'text/html',
  911.             )
  912.         );
  913.     }
  914.     // TODO: disable this TESTONLY
  915.     /**
  916.      * @Route("/v/card/setmanager", name="app_v_card_setmanager", methods={"GET", "POST"})
  917.      */
  918.     public function setmanager(Request $request): Response {
  919.     $session $request->getSession();
  920.     $is_auth $session->get('is_auth');
  921.     $datas = array();
  922.     $content 'NOT_MANAGER';
  923.     $personnel_datas $session->get('personnel_datas');
  924.     $ide_manager $this->getManagerIdeDossier($personnel_datas);
  925.     if (!$is_auth) {
  926.         $datas['needs_auth'] = true;
  927.     } else if (isset($_GET['disable']) && $_GET['disable'] == 1) {
  928.         $datas['is_manager'] = $session->set('is_manager'false);
  929.     } else {
  930.         $datas['is_manager'] = $session->set('is_manager'true);
  931.         $ide_manager null;
  932.         if (isset($_GET['ide_manager'])) {
  933.             $ide_manager =     $_GET['ide_manager'];
  934.         } else if (isset($personnel_datas['IDE_MANAGER'])) {
  935.             $ide_manager $personnel_datas['IDE_MANAGER'];
  936.         }
  937. /* // REMOVE this TESTONLY
  938.         $datas['is_manager'] = $session->set('TEST_MNGR_IDE', $ide_manager);    
  939.         $content = 'MANAGER: '. $ide_manager;
  940.         //*/
  941.     }
  942.         return new Response($content200, array(
  943.                 'Content-type'        => 'text/html',
  944.             )
  945.         );
  946.     }
  947.     /**
  948.      * @Route("/v/card/search", name="app_v_card_search", methods={"GET", "POST"})
  949.      */
  950.     public function search(Request $request): Response {
  951.         // echo(__METHOD__.' _POST: '.var_export($_POST, true)); exit();
  952.     $session $request->getSession();
  953.     $is_auth $session->get('is_auth');
  954.     $datas = array();
  955.     $datas['is_manager'] = $session->get('is_manager');
  956.     if (!$is_auth) {
  957.         $datas['needs_auth'] = true;
  958.     }
  959.     $datas['disp_search'] = true;
  960.     if (isset($_POST['email'])
  961.         && $_POST['email'] != ''
  962.     ) {
  963.         $ans = array('msg' => 'NOT_FOUND');
  964.         $found $this->selectMailLike($_POST['email']); // getVCardFromEmail($_POST['email'], $get_like = true);
  965.         // echo(__METHOD__.' found: '.var_export($found, true));
  966.         /*
  967.         if (isset($found['EMAIL_PRO'])) {
  968.             $ans['msg'] = 'ok';
  969.             $ans['EMAIL_PRO'] = $found['EMAIL_PRO'];
  970.         }
  971.         //*/
  972.         //
  973.         if (count($found) > 0) {
  974.             $ans $found;
  975.         }
  976.         $content json_encode($ans);
  977.         return new Response($content200, array(
  978.                 'Content-type'        => 'text/json',
  979.             )
  980.         );
  981.     } else {
  982.          return $this->render('v_card/search.html.twig'$datas); 
  983.     }
  984.     }
  985.     /**
  986.      * @Route("/v/card/getuserinfos", name="app_v_card_getuserinfos", methods={"GET"})
  987.      */
  988.     public function getuserinfos(Request $requestVCardRepository $vCardRepositoryMailerInterface $mailer): Response {
  989.     $session $request->getSession();
  990.     $is_auth $session->get('is_auth');
  991.         $content __METHOD__;
  992.     $user_id '';
  993.     if ($is_auth === true) {
  994.         if (isset($_GET['email'])) {
  995.             $datas_from_mail $this->getPersonnelFromEmail($_GET['email']);
  996.             echo(__METHOD__.' datas_from_mail: '.var_export($datas_from_mailtrue)); exit();
  997.         }
  998.         $user_id $_GET['user_id'];
  999.         
  1000.         $owner_datas $this->getPersonnelFromIdeDossier($user_id);
  1001.         $mgr_ide $owner_datas['IDE_MANAGER'];
  1002.         $manager_datas $this->getPersonnelFromIdeDossier($mgr_ide);
  1003.         $content 'DBG: owner_datas: '.var_export($owner_datastrue)
  1004.                        .'<br/>'
  1005.                 'manager_datas: 'var_export($manager_datastrue);    
  1006.         }
  1007.             return new Response($content200, array(
  1008.                 'Content-type'        => 'text/html',
  1009.                 )
  1010.             );
  1011.     }
  1012.     /**
  1013.      * @Route("/v/card/refreshstudentcache", name="app_v_card_refreshstudentcache", methods={"GET"})
  1014.      */
  1015.     public function refreshstudentcache(Request $requestVCardRepository $vCardRepositoryMailerInterface $mailer): Response {
  1016.         echo(__METHOD__.':'); exit();
  1017.     }
  1018.     /**
  1019.      * @Route("/v/card/refreshpending", name="app_v_card_refreshpending", methods={"GET"})
  1020.      */
  1021.     public function refreshpending(Request $requestVCardRepository $vCardRepositoryMailerInterface $mailer): Response {
  1022.         $RAW_QUERY 'select *
  1023.             from vcard
  1024.             order by rank() over (partition by ide_dossier order by d_modification desc)
  1025.             fetch first row with ties';
  1026.         $DBG = isset($_GET['dbg']) && $_GET['dbg'] == '1';
  1027.         $found $this->selectRaw($RAW_QUERYfalse);
  1028.         $rjc_items = array();
  1029.         $svd_items = array();
  1030.         $pnd_items = array();
  1031.         foreach($found as $k => $datas) {
  1032.             if (isset($datas['ID_VCARD'])
  1033.                 && isset($datas['STATUT'])
  1034.             ) {
  1035.                 /*
  1036.                 if ($datas['STATUT'] == 'à valider') {
  1037.                     $pnd_items[] = $datas;
  1038.                 } else if ($datas['STATUT'] == 'rejetée') {
  1039.                     $rjc_items[] = $datas;    
  1040.                 } else if ($datas['STATUT'] == 'enregistrée') {
  1041.                     $svd_items[] = $datas;
  1042.                 }
  1043.                 //*/
  1044.                 $this->sendPendingRequest($mailer$datas);
  1045.             }
  1046.         }
  1047. /*
  1048.         $this->sendPendingRequest($mailer, $pnd_items[0]); // , true);
  1049.         $this->sendPendingRequest($mailer, $rjc_items[0]); // , true);
  1050.         $this->sendPendingRequest($mailer, $svd_items[0]); // , true);
  1051.         //*/
  1052.         $content 'Done';
  1053.         /*
  1054.         $content = __METHOD__.': getting pending requests....<br/>'
  1055.                 // . ($DBG ? var_export($pnd_items, true): '')
  1056.             ;
  1057.         //*/
  1058.         return new Response($content200, array(
  1059.                 'Content-type'        => 'text/html',
  1060.             )
  1061.         );
  1062.     }
  1063.     /**
  1064.      * @Route("/v/card/last", name="app_v_card_last", methods={"GET"})
  1065.      */
  1066.     public function last(Request $request): Response {
  1067.     $vcard_datas = array();
  1068.     $found null;
  1069.     $last_vcard null;
  1070.     $ide_dossier null;
  1071.     $session $request->getSession();
  1072.     $is_auth $session->get('is_auth');
  1073.     $needs_create false;
  1074.     if (isset($_GET['embedded'])
  1075.         && isset($_GET['login'])
  1076.     ) {
  1077.         $student_email $this->selectStudentEmailFromLogin($_GET['login']);
  1078.         if (isset($student_email)) {
  1079.             return new Response(null302, array(
  1080.                     'Location'        => '/v/student/card/last?embedded=1&v2&email='.$student_email,
  1081.             ));
  1082.         }
  1083.     }
  1084.     $personnel_datas $this->getPersonnelFromEnv($session);
  1085.     $is_manager $session->get('is_manager'); // $this->isManager($personnel_datas);
  1086.     if (isset($personnel_datas['IDE_DOSSIER'])) {
  1087.         $ide_dossier $personnel_datas['IDE_DOSSIER']; 
  1088.         if (!empty($ide_dossier)) {
  1089.             $vcard_datas $this->getVcardDatasSummary($ide_dossier); // $this->selectLastVCardByIdeDossier($ide_dossier);
  1090.             $vcard_datas['can_validate'] = false;
  1091.             $vcard_datas['needs_submit'] = false;
  1092.             $vcard_datas['can_duplicate'] = false;
  1093.             $found $this->selectLastVCardByIdeDossier($ide_dossier"enregistrée' OR STATUT='à valider");
  1094.             $last_vcard $this->selectLastVCardByIdeDossier($ide_dossier"validé");
  1095.             if (count($last_vcard) > 0) {
  1096.                 $tmp_vcard  = new VCard();
  1097.                 $tmp_vcard->setid_vcard($last_vcard['ID_VCARD']);
  1098.                 $tmp_vcard->settitre($last_vcard['TITRE']);
  1099.                 $tmp_vcard->settel($last_vcard['TEL']);
  1100.                 $tmp_vcard->setemail($last_vcard['EMAIL']);
  1101.                 $tmp_vcard->setavec_photo($last_vcard['AVEC_PHOTO']);
  1102.                 $vcard_datas['v_card'] = $tmp_vcard;
  1103.                 // echo(__METHOD__.' adding v_card....');
  1104.             } else { // No card found needs to create one
  1105.                 $needs_create true;
  1106.             }
  1107.             $vcard_datas['new_version'] = count($found) == 0;
  1108.     $photo_file '/mnt/recadre/'.$ide_dossier.'.jpg';
  1109.             // echo(__METHOD__.': '. var_export($last_vcard, true)); exit();
  1110.             if (isset($last_vcard['AVEC_PHOTO']) && $last_vcard['AVEC_PHOTO'] == 'oui'
  1111.                 || (file_exists($this->uploadsDIR.('photo_'.$ide_dossier.'.jpg')))
  1112.             ) {
  1113.                 if (!isset($last_vcard['AVEC_PHOTO']) || $last_vcard['AVEC_PHOTO'] != 'oui') {
  1114.                     $photo_file $this->uploadsDIR.('photo_'.$ide_dossier.'.jpg');
  1115.                 }
  1116.                 $key $this->storeInSession($session$photo_file);
  1117.                 if (!empty($key)) {
  1118.                     $vcard_datas['PHOTO_K'] = $key;
  1119.                 }
  1120.             } 
  1121.             if (!$is_auth) {
  1122.                 $vcard_datas['needs_auth'] = true;
  1123.             }
  1124.         }
  1125.     // echo(__METHOD__.': vcard_datas: '. var_export($vcard_datas['v_datas_card']['IDE_DOSSIER'], true)); exit();
  1126.     }
  1127.     if (isset($vcard_datas['v_datas_card']['IDE_DOSSIER'])
  1128.         && isset($vcard_datas['v_card'])
  1129.     ) {
  1130.     $uri "https://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
  1131.     $uri .=(isset($_GET['email']) || isset($_GET['embedded']) ? '&' '?');
  1132.         
  1133.     $dwnl $uri 'download=1'.(isset($_GET['email']) ? '' '&email='.$personnel_datas['EMAIL_PRO']);
  1134.     $vcard_datas['download_url'] = $dwnl;
  1135.     $vcard_datas['qr_code_url'] = $this->generateQrCode($vcard_datas);
  1136.     $vcard_datas['disp_vcard'] = true;
  1137.     $vcard_datas['is_last'] = true;
  1138.     $is_download = (    
  1139.             (isset($_GET['download']) && $_GET['download'] == 1)
  1140.             || (isset($_POST['download']) && $_POST['download'] == 1)
  1141.             );
  1142.     if (!$is_download) {
  1143.             $vcard_datas['is_search'] = true;
  1144.         if (isset($_GET['back'])
  1145.             && !empty($_GET['back'])
  1146.         ) {
  1147.             $vcard_datas['back_url'] = '/v/card/search';
  1148.         }
  1149.         if (isset($_GET['embedded'])) {
  1150.             $vcard_datas['embedded'] = true;
  1151.         }
  1152.         $vcard_datas['is_manager'] = $is_manager;
  1153.         $vcard_datas['published'] = true;
  1154.         $vcard_datas['published_card'] = true
  1155.         if (isset($_GET['back'])
  1156.             && $_GET['back'] == 'search'
  1157.         ) {
  1158.             $vcard_datas['from_search'] = true;
  1159.         }
  1160.         $tpl_name = isset($_GET['embedded']) // ($_GET['v2']) 
  1161.                 ?  'v_card/embedded.html.twig' 
  1162.                 'v_card/last.html.twig';
  1163.         if (isset($_GET['embedded'])
  1164.             && isset($_GET['v4'])
  1165.         ) {
  1166.             $tpl_name =  'v_card/embedded_v4.html.twig'
  1167.         }
  1168.             return $this->render($tpl_name$vcard_datas); 
  1169.     } else {
  1170.         if (isset($_GET['DBG'])
  1171.             && $_GET['DBG'] == '1'
  1172.         ) {
  1173.             echo(__METHOD__.' vcard_datas: 'var_export($vcard_datastrue)); exit();
  1174.         }
  1175.          $content $this->getVCardFileContent($vcard_datas);
  1176.         $filename 'vcard_'.$ide_dossier.'.vcf';
  1177.         // echo(__METHOD__.' content:'.$content); exit();
  1178.         return new Response($content200, array(
  1179.                 'X-Sendfile'          => $filename,
  1180.                 'Content-type'        => 'application/octet-stream',
  1181.                 'Content-Disposition' => sprintf('attachment; filename="%s"'$filename))
  1182.         );
  1183.     }
  1184.     } else { // else vcard not found
  1185.         $v_datas = array(
  1186.             'Location'        => 'notfound',
  1187.         );
  1188.         if (isset($_GET['embedded']) && $_GET['embedded']) {
  1189.             $v_datas['embedded'] = 1;
  1190.         }
  1191.         if ($needs_create || isset($_GET['login'])) {
  1192.             $v_datas['needs_create'] = 1;
  1193.         }
  1194.         return $this->redirectToRoute('app_v_card_notfound'$v_datasResponse::HTTP_SEE_OTHER);
  1195. // new Response(null, 302, $v_datas);
  1196. /*
  1197.             return new Response('', 404, array(
  1198.                 'Content-type'        => 'text/html',
  1199.             )
  1200.             );
  1201.                  */
  1202.     
  1203.         }
  1204.     }
  1205.     protected function getVcardDatasSummary($ide_dossier): array {
  1206.         $out = array();
  1207.         $personnel_datas $this->getV_PERSONNEL($ide_dossier);
  1208.         $infos_carte $this->getV_INFOS_CARTE($ide_dossier);
  1209. /*
  1210.         if (     false && 
  1211.             isset($personnel_datas['SERVICE'])) {
  1212.             $service_items = explode(' -> ', $personnel_datas['SERVICE']); // NOTE: dept stored with ' -> ' separator....
  1213.             $nb_items = count($service_items);
  1214.                 if ($nb_items > 1) {
  1215.                     $personnel_datas['SERVICE'] = $service_items[count($service_items)-1];
  1216.                 }
  1217.                     
  1218.                     // echo(var_export($personnel_datas, true)); exit();
  1219.         }
  1220.         //*/
  1221.         $v_datas_card $this->getV_DATA_VCARD($ide_dossier);
  1222.         if (count($v_datas_card) == 0) { // NO entry in V (new card) get from table VCard
  1223.             $v_datas_card $this->selectLastVCardByIdeDossier($ide_dossier"enregistrée' OR STATUT='à valider'  OR STATUT='rejetée");
  1224.             if (isset($v_datas_card['IDE_DOSSIER'])
  1225.                 // && isset($infos_carte['NOM_PHOTO'])
  1226.             ) {
  1227.                 if (isset($infos_carte['NOM_PHOTO'])) {
  1228.                     $v_datas_card['PHOTO'] = $infos_carte['NOM_PHOTO'];
  1229.                 }
  1230.                 $v_datas_card['SITE_RATTACHEMENT'] = (isset($personnel_datas['SITE_RATTACHEMENT']) ? $personnel_datas['SITE_RATTACHEMENT']: $infos_carte['SITE']);
  1231.                 $v_datas_card['ADRESSE_PRO'] = '';
  1232.                 if (!empty($v_datas_card['SITE_RATTACHEMENT'])) {
  1233.                     $v_datas_card['ADRESSE_PRO'] = $this->getV_SITE($v_datas_card['SITE_RATTACHEMENT']);
  1234.                 }
  1235.                 // echo(__METHOD__.': v_datas_card: '.var_export($v_datas_card, true));
  1236.             }
  1237.         }
  1238.         if (isset($personnel_datas['EMAIL_PRO'])
  1239.             && count($v_datas_card) > 0
  1240.         ) {
  1241.         // echo(__METHOD__.' v_datas_card: '.var_export($v_datas_card, true));
  1242.         $vcard_datas = array(
  1243.              'tel' => json_decode($v_datas_card['TEL']),
  1244.              'titre' => json_decode($v_datas_card['TITRE']),
  1245.              'email' => json_decode($v_datas_card['EMAIL']),
  1246.             );
  1247.         $out = [
  1248.             // 'v_card' => $vCard,
  1249.         'vcard_datas' => $vcard_datas,
  1250.         'v_datas_card' => $v_datas_card// NOTE: contains main user infos....
  1251.         'personnel_datas' => $personnel_datas,
  1252.         'infos_carte' => $infos_carte,
  1253.         // 'can_validate' => $this->isCardManager($vCard),
  1254.         ];
  1255.         } // END if EMAIL_PRO
  1256.         // echo(__METHOD__.' out: '.var_export($out, true)); exit();
  1257.         return $out;
  1258.     }
  1259.     protected function getManagerIdeDossier($datas) {
  1260.         $out null;
  1261.     // echo(__METHOD__.': '.var_export($datas, true));
  1262.     if (isset($personnel_datas['IDE_MANAGER'])) {
  1263.         $out $personnel_datas['IDE_MANAGER'];
  1264.     }
  1265.     return $out;
  1266.     }
  1267.     /**
  1268.      * @Route("/v/card/manager", name="app_v_card_manager", methods={"GET", "POST"})
  1269.      */
  1270.     public function manager(Request $requestVCardRepository $vCardRepository): Response
  1271.     {
  1272.     // $this->getAuthCAS();
  1273.     $session $request->getSession();
  1274.     $is_auth $session->get('is_auth');
  1275.     $user_email $session->get('user_email');
  1276.     $personnel_datas $session->get('personnel_datas'); //  $this->getPersonnelFromEnv($session);
  1277.     // echo(__METHOD__.': personnel_datas: '.var_export($personnel_datas, true)); exit();
  1278.     $ide_dossier = (isset($personnel_datas['IDE_DOSSIER']) ? $personnel_datas['IDE_DOSSIER'] : '');
  1279.     if (!$is_auth) {
  1280.         $session->set('previous''app_v_card_manager');
  1281.         return new Response(null302, array(
  1282.                 'Location'        => 'auth',
  1283.         ));
  1284.     } else if ($session->get('is_manager')) { //  else if ($this->isManager($personnel_datas)) {
  1285.            /* TODO: REMOVE TESTONLY get the real value    
  1286.         $ide_dossier = $session->get('TEST_MNGR_IDE');
  1287.         echo(__METHOD__.': ide_dossier: '.$ide_dossier);
  1288.         //*/
  1289.         $vcards $this->getManagedCards($ide_dossier, (isset($_GET['DBG']) && $_GET['DBG'] == 1));
  1290.         // echo(__METHOD__.' found: ' .var_export($vcards, true)); exit();
  1291.         return $this->renderForm('v_card/manager.html.twig', [
  1292.             'v_cards' => $vcards,
  1293.             // 'manager_v' => true,
  1294.             'disp_manager' => true,
  1295.             'is_manager'    => true,
  1296.         ]);
  1297.     } else {
  1298.         return new Response(null302, array(
  1299.                 'Location'        => 'notfound',
  1300.         ));
  1301. /*
  1302.         return new Response(null, 404, array(
  1303.                 // 'Location'        => 'auth',
  1304.         ));
  1305. */
  1306.     // END if is_auth
  1307.     }
  1308.     /**
  1309.      * @Route("/v/card/embedded", name="app_v_card_embedded", methods={"GET", "POST"})
  1310.      */
  1311.     public function embedded(Request $request): Response
  1312.     {
  1313.     // $this->getAuthCAS();
  1314.     $session $request->getSession();
  1315.     $is_auth $session->get('is_auth');
  1316.     $user_email $session->get('user_email');
  1317.     $personnel_datas $this->getPersonnelFromEnv($session);
  1318.     // $user_email = $session->get('is_auth');
  1319.     // echo(__METHOD__.': session:'.var_export($_SESSION, true)); exit();
  1320.     $is_manager $session->get('is_manager'); // $this->isManager($personnel_datas);
  1321.     // echo(__METHOD__.': is_manager: '.var_export($is_manager, true)); exit();
  1322.         
  1323.     if (!$is_auth) {
  1324.         $session->set('previous''app_v_card_embedded');
  1325.         $session->set('prev_id'$vCard->getId());
  1326.         return new Response(null302, array(
  1327.                 'Location'        => 'auth',
  1328.         ));
  1329.     } else { 
  1330. // echo(__METHOD__.': vcard_datas: '.var_export($vcard_datas['vcard_datas'], true));
  1331.         return $this->redirectToRoute('app_v_card_last', ['embedded' => 1], Response::HTTP_SEE_OTHER);
  1332.     } // END if is_auth
  1333.     }
  1334.     /**
  1335.      * @Route("/v/card/{id_vcard}", name="app_v_card_show", methods={"GET", "POST"})
  1336.      */
  1337.     public function show(Request $requestVCard $vCardVCardRepository $vCardRepository): Response
  1338.     {
  1339.     // $this->getAuthCAS();
  1340.     $session $request->getSession();
  1341.     $is_auth $session->get('is_auth');
  1342.     $user_email $session->get('user_email');
  1343.     $personnel_datas $this->getPersonnelFromEnv($session);
  1344.     // $user_email = $session->get('is_auth');
  1345.     // echo(__METHOD__.': session:'.var_export($_SESSION, true)); exit();
  1346.     $is_manager $session->get('is_manager'); // $this->isManager($personnel_datas);
  1347.     // echo(__METHOD__.': is_manager: '.var_export($is_manager, true)); exit();
  1348.         
  1349.     if (!$is_auth) {
  1350.         $session->set('previous''app_v_card_show');
  1351.         $session->set('prev_id'$vCard->getId());
  1352.         return new Response(null302, array(
  1353.                 'Location'        => 'auth',
  1354.         ));
  1355.     } else { 
  1356.         $ide_dossier $vCard->getide_dossier();
  1357.     $is_owner $ide_dossier == $personnel_datas['IDE_DOSSIER'];
  1358.     $is_card_manager $this->isCardManager($vCard$session);
  1359.     if (!isset($_GET['admin_popup']) && !isset($_GET['DBG_DUMP']) && !$is_owner && !isset($_GET['embedded'])) { //  redirect card_manager
  1360.          return $this->redirectToRoute('app_v_card_index', [], Response::HTTP_SEE_OTHER);
  1361.     }
  1362.     $vcard_datas $this->getVcardDatasSummary($ide_dossier);
  1363.     $vcard_datas['v_card'] = $vCard;
  1364.     $vcard_datas['can_validate'] =     true 
  1365.                     && $session->get('is_manager')
  1366.                     && $is_card_manager // $this->isCardManager($vCard, $session) 
  1367.                     && ($vCard->getstatut() == 'à valider')
  1368.                         ;
  1369.     // echo(__METHOD__.'vCard->getstatut: '.$vCard->getstatut());
  1370.     $vcard_datas['needs_submit'] = ($vCard->getstatut() == 'enregistrée');
  1371.     $vcard_datas['can_duplicate'] = ($vCard->getstatut() == 'rejetée');
  1372.     if ($vCard->getstatut() == 'validé') {
  1373.         $vcard_datas['validated'] = true
  1374.         $vcard_datas['new_version'] = false;
  1375.     }
  1376.     $vcard_datas['user_email'] = $user_email;
  1377.     $vcard_datas['disp_vcard'] = true;
  1378.     $vcard_datas['is_manager'] = $is_manager;
  1379.     $vcard_datas['current_card'] = true;
  1380.     if (!$is_owner) {
  1381.         $vcard_datas['not_owner'] = true;
  1382.     }
  1383.     $photo_file '/mnt/recadre/'.$ide_dossier.'.jpg';
  1384.     if ($vCard->getavec_photo() == 'oui'
  1385.         || (file_exists($this->uploadsDIR.('photo_'.$ide_dossier.'.jpg')))
  1386.     ) {
  1387.                 if ($vCard->getavec_photo() != 'oui') {
  1388.                     $photo_file $this->uploadsDIR.('photo_'.$ide_dossier.'.jpg');
  1389.                 }
  1390.         $key $this->storeInSession($session$photo_file);
  1391.         if (!empty($key)) {
  1392.             $vcard_datas['PHOTO_K'] = $key;
  1393.         }
  1394.     }
  1395.         $form $this->createForm(VCardType::class, $vCard);
  1396.         $form->handleRequest($request);
  1397.     // echo(__METHOD__.': form: '.var_export($form->vars, true)); exit();
  1398.     // echo(__METHOD__.': vcard_datas: '.var_export($vcard_datas, true)); exit();
  1399.     $vcard_datas['form'] = $form;
  1400.     if ( $form->isSubmitted() && $form->isValid()
  1401.         && ($is_owner || $is_manager)
  1402.     ) {
  1403.         //         echo(__METHOD__.' submit... vars:'.var_export($form->getData())); exit();
  1404.         // TODO: check if reject/accepted and if manager then save
  1405.             $vCardRepository->add($vCardtrue);
  1406.         //*
  1407.         //*
  1408.         if ($vCard->getstatut() == 'à valider') { // NOTE: submited to validate
  1409.             return $this->redirectToRoute('app_v_card_submited', ['id_vcard' => $vCard->getId()], Response::HTTP_SEE_OTHER);
  1410.         } else if ($vCard->getstatut() == 'rejetée'){
  1411.             return $this->redirectToRoute('app_v_card_rejected', ['id_vcard' => $vCard->getId()], Response::HTTP_SEE_OTHER);
  1412.         } else if ($vCard->getstatut() == 'validé'){
  1413.             return $this->redirectToRoute('app_v_card_accepted', ['id_vcard' => $vCard->getId()], Response::HTTP_SEE_OTHER);
  1414.         } else {
  1415.          // */
  1416.             return $this->redirectToRoute('app_v_card_index', [], Response::HTTP_SEE_OTHER);
  1417.         }
  1418. // */
  1419.         }
  1420.     $vcard_datas['is_manager'] = $is_manager// $session->get('is_manager');
  1421.     if ($this->isSelfValidator($personnel_datas)) {
  1422.         // TODO: enable this
  1423.         $vcard_datas['is_self_validator'] = true
  1424.     }
  1425.     if (isset($_GET['embedded'])) {
  1426.         $vcard_datas['manager_embedded'] = true;
  1427.             return $this->renderForm('v_card/_vcard.html.twig'$vcard_datas); 
  1428.     }
  1429.     if (isset($_GET['DBG_DUMP'])) {
  1430.         $ide_dossier  $vCard->getide_dossier();
  1431.         $owner_datas $this->getPersonnelFromIdeDossier($ide_dossier);
  1432.         echo(__METHOD__.' is_manager: '.var_export($is_managertrue).'<BR/>');
  1433.         echo(__METHOD__.' is_card_manager: '.var_export($is_card_managertrue).'<BR/>');
  1434.         echo(__METHOD__.' can_validate: '.var_export($vcard_datas['can_validate'], true).'<BR/>');
  1435.         echo(__METHOD__.' personnel_datas: '.var_export($personnel_datastrue).'<BR/>');
  1436.         echo(__METHOD__.' owner_datas: '.var_export($owner_datastrue).'<BR/>');
  1437.         echo(__METHOD__.' vCard: '.var_export($vCardtrue)); exit();
  1438.     }
  1439.     // echo(__METHOD__.': vcard_datas: '.var_export($vcard_datas['vcard_datas'], true));
  1440.         return $this->renderForm('v_card/show.html.twig'$vcard_datas); 
  1441.     /* 
  1442.         [
  1443.             'v_card' => $vCard,
  1444.         'vcard_datas' => $vcard_datas,
  1445.         'v_datas_card' => $v_datas_card,
  1446.         'personnel_datas' => $personnel_datas,
  1447.         'infos_carte' => $infos_carte,
  1448.         'can_validate' => $this->isCardManager($vCard),
  1449.         ]
  1450. );
  1451.     */
  1452.     // END if is_auth
  1453.     }
  1454.     public function getV_INFOS_CARTE($ide_dossier$DBG false) : array {
  1455.     return $this->selectViewBy_ide_dossier('V_INFOS_CARTE'$ide_dossier$DBG);
  1456.     }
  1457.     public function getV_PER_DEMANDE_CARTE_PROF($ide_dossier$DBG false) : array {
  1458.     return $this->selectViewBy_ide_dossier('V_PER_DEMANDE_CARTE_PROF'$ide_dossier$DBG);    
  1459.     }
  1460.     public function getV_DATA_VCARD($ide_dossier$DBG false) : array {
  1461.     return $this->selectViewBy_ide_dossier('V_DATA_VCARD'$ide_dossier$DBG);    
  1462.     }
  1463.     public function getV_PERSONNEL($ide_dossier$DBG false) : array {
  1464.     return $this->selectViewBy_ide_dossier('V_PERSONNEL'$ide_dossier$DBG);    
  1465.     // return $this->selectViewBy_ide_dossier('V_PERSONNEL_NEW', $ide_dossier, $DBG); // TODO: V_PERSONNEL needs to be merged    
  1466.     }
  1467.     public function getV_SITE($site$DBG false) {
  1468.     return $this->getFromSite($site);
  1469.     }
  1470.     protected function disableOldPendingCards(VCard $vCard) {
  1471.         if ($vCard !== null) {
  1472.             $ide_dossier $vCard->getide_dossier();
  1473.             $card_id $vCard->getId();
  1474.             $RAW_QUERY "update vcard set STATUT='old à valider' where ID_VCARD != ".$card_id." and STATUT='à valider' and IDE_DOSSIER = "$ide_dossier;
  1475.             // echo(__METHOD__.': query: '.$RAW_QUERY); exit();
  1476.             if ( 
  1477.                 !empty($RAW_QUERY)) {
  1478.             $em $this->getDoctrine()->getManager();
  1479.             $statement $em->getConnection()->prepare($RAW_QUERY);
  1480.             $res $statement->execute();
  1481.         }
  1482.         }
  1483.     }
  1484.     protected function getVCardFromEmail($email$get_like false) : array {
  1485.         $out = array();
  1486.     $criteria = ($get_like === false '=' ' like ') ."'".strtolower($email)
  1487.             .($get_like === false '' '%')
  1488.             ."'";
  1489.         $found $this->selectViewWhere('V_DATA_VCARD''LOWER(EMAIL_PRO)'$criteria$get_like); // "LOWER(EMAIL_PRO)='".strtolower($email)."'");
  1490.         // echo(__METHOD__.' found: '.var_export($found, true)); exit();
  1491.         if (count($found) > 0) {
  1492.             $out $found;
  1493.         }
  1494.     return $out;
  1495.     }
  1496.     protected function getPersonnelFromLogin($search) : array {
  1497.         $out = array();
  1498.         $found $this->selectViewWhere('V_PERSONNEL'"LOWER(LOGIN)='".strtolower($search)."'");
  1499.         // echo(__METHOD__.' found: '.var_export($found, true)); exit();
  1500.         if (count($found) > 0) {
  1501.             $out $found;
  1502.         }
  1503.     return $out;
  1504.     }
  1505.     protected function getPersonnelFromEmail($email) : array {
  1506.         $out = array();
  1507.         $found $this->selectViewWhere('V_PERSONNEL'"LOWER(EMAIL_PRO)='".strtolower($email)."'");
  1508.         // echo(__METHOD__.' found: '.var_export($found, true)); exit();
  1509.         if (count($found) > 0) {
  1510.             $out $found;
  1511.         }
  1512.     return $out;
  1513.     }
  1514.     protected function getPersonnelFromIdeDossier($ide_dossier) : array {
  1515.         $out = array();
  1516.     if (!empty($ide_dossier)) {
  1517.         $found $this->selectViewWhere('V_PERSONNEL'"IDE_DOSSIER='".$ide_dossier."'");
  1518.         // echo(__METHOD__.' found: '.var_export($found, true)); exit();
  1519.         if (count($found) > 0) {
  1520.             $out $found;
  1521.         }
  1522.     }
  1523.     return $out;
  1524.     }
  1525.     protected function selectStudentEmailFromLogin($login) {
  1526.         $out null;
  1527.         $found $this->getStudentVCardFromLogin($login);
  1528.         if (isset($found['EMAIL'])) {
  1529.         $tmp_datas json_decode($found['EMAIL'], true);
  1530.         $out $tmp_datas[0];
  1531.         }
  1532.         return $out;
  1533.     }
  1534.     protected function getPersonnelFromEnv($session) : array {
  1535.     $out = array('');
  1536.     $auth_login '';
  1537.     if (!empty($session)) {
  1538.         $auth_login $session->get('user_email');
  1539.     }
  1540.         // NOTE: login args used by search
  1541.         $arg_mail = !empty($_GET['email']) ? $_GET['email']: $auth_login// $this->getAuthCAS(); // $_GET['login'];
  1542.         $login = !empty($_GET['login']) ? $_GET['login']: '';
  1543.     if (!empty($login)) {
  1544.             $out $this->getPersonnelFromLogin($login);
  1545.     } else if (!empty($arg_mail)) {
  1546.         /*
  1547.         $found = $this->selectViewWhere('V_PERSONNEL', "LOWER(EMAIL_PRO)='".strtolower($arg_mail)."'");
  1548.         // echo(__METHOD__.' found: '.var_export($found, true)); exit();
  1549.         if (count($found) > 0) {
  1550.             $out = $found;
  1551.         }
  1552.         //*/
  1553.         //
  1554.             $out $this->getPersonnelFromEmail($arg_mail);
  1555.         }
  1556.     return $out;
  1557.     }
  1558.     // TODO: remove deprecated
  1559.     protected function DEP_getPersonnelFromEnv($session) : array {
  1560.     $out = array('');
  1561.     $personnel_datas = array();
  1562.     $auth_login '';
  1563.     if (!empty($session)) {
  1564.         $auth_login $session->get('user_email');
  1565. // echo(__METHOD__.' auth_login: '.var_export($auth_login, true)); exit();
  1566.         $personnel_datas $session->get('personnel_datas');
  1567.         if (isset($personnel_datas['IDE_DOSSIER'])) {
  1568.             $out $personnel_datas;
  1569.         }
  1570.     }
  1571.         // TODO: REMOVE this TESTONLY
  1572.         // $login = !empty($_GET['email']) ? $_GET['email']: $auth_login; // $this->getAuthCAS(); // $_GET['login'];
  1573.     if (!empty($login)
  1574.         && !isset($personnel_datas['IDE_DOSSIER'])
  1575.     ) {
  1576.         /*
  1577.         $found = $this->selectViewWhere('V_PERSONNEL', "LOWER(EMAIL_PRO)='".strtolower($login)."'");
  1578.         // echo(__METHOD__.' found: '.var_export($found, true)); exit();
  1579.         if (count($found) > 0) {
  1580.             $out = $found;
  1581.         }
  1582.         //*/
  1583.         //
  1584.             $out $this->getPersonnelFromEmail($login);
  1585.     $session->set('personnel_datas'$out);
  1586. // echo(__METHOD__.' out: '.var_export($out, true)); exit();
  1587.     } else if (empty($login)){
  1588.         echo(__METHOD__.' personnel_datas: '.var_export(isset($personnel_datas['IDE_DOSSIER']), true));
  1589.         echo(__METHOD__.' login: '.var_export($logintrue)); exit();
  1590.     }
  1591.     return $out;
  1592.     }
  1593.     protected function selectLastVCardByIdeDossier($ide_dossier$statut 'validé'$DBG false) : array {
  1594.     $out = array();
  1595. /*
  1596.     if (!empty($ide_dossier)) {
  1597.         $RAW_QUERY = "select * from VCARD where IDE_DOSSIER='".$ide_dossier."' and STATUT = '".$statut."' order by D_MODIFICATION desc";
  1598.         $found = $this->selectRaw($RAW_QUERY, $DBG);
  1599.         if (count($found) > 0) {
  1600.             $out = $found[0];
  1601.         }
  1602.     }
  1603.     // */
  1604.     $out $this->selectVCardByIdeDossier($ide_dossier" and ( STATUT = '".$statut."' ) ");
  1605.     if ($DBG != false) {
  1606.         echo(__METHOD__.': out: '.var_export($outtrue));
  1607.     }
  1608.     return $out;
  1609.     }
  1610.     protected function selectVCardByIdeDossier($ide_dossier$opt_where ''$order_by " D_MODIFICATION desc " $DBG false):array {
  1611.         $out = array();
  1612.     if (!empty($ide_dossier)) {
  1613.         $RAW_QUERY "select * from VCARD where IDE_DOSSIER='".$ide_dossier."'"
  1614.             $opt_where
  1615.             . (!empty($order_by) ? ' order by '.$order_by '')
  1616.             ;
  1617.         // echo(__METHOD__.' RAW_QUERY: '.$RAW_QUERY);
  1618.         $found $this->selectRaw($RAW_QUERY$DBG);
  1619.         if (count($found) > 0) {
  1620.             $out $found[0];
  1621.         }
  1622.     }
  1623.     if ($DBG != false) {
  1624.         echo(__METHOD__.': out: '.var_export($outtrue));
  1625.     }
  1626.     return $out;
  1627.     }
  1628.     protected function getRecentVCardByIdeDossier($ide_dossier) {
  1629.         $out $this->selectVCardByIdeDossier($ide_dossier);
  1630.     return $out;
  1631.     }
  1632.     public function selectViewBy_ide_dossier($v_name$ide_dossier$DBG false) : array {
  1633.     return $this->selectViewWhere($v_name'IDE_DOSSIER='.$ide_dossier$DBG);
  1634.     }
  1635.     public function selectMailLike($search$DBG false) {
  1636.     $out = array();
  1637.         if (!empty($search)) {
  1638.         $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;
  1639.         
  1640.         $found $this->selectRaw($RAW_QUERY$DBG);
  1641.         if (count($found) > 0) {
  1642.             $out $found;
  1643.         }    
  1644.     }
  1645.     return $out;
  1646.     }
  1647.     protected function isSelfValidator($datas) {
  1648.         $out 
  1649.            // $datas['IDE_DOSSIER'] = 5474 || 
  1650.             true && !empty($datas)
  1651.         && isset($datas['AUTO_VALIDATION'])
  1652.         && $datas['AUTO_VALIDATION'] == 1
  1653.             ;
  1654.     return $out;
  1655.     }
  1656.     protected function getPendingMailContent($datas) {
  1657.         $out null;
  1658.         if (isset($datas['ID_VCARD'])
  1659.             && isset($datas['STATUT'])
  1660.         ) {
  1661.             // $out = $this::PENDING_MAIL[]
  1662.         }
  1663.         return $out;
  1664.     }
  1665.     protected function assignTplValues($content$values) {
  1666.         $out $content;
  1667.         if (isset($out)
  1668.             && isset($values)
  1669.         ) {
  1670.             $k_val array_keys($values);
  1671.             foreach ($k_val as $k => $item) {
  1672.                 $out str_replace('{'.$item.'}'$values[$item], $out);
  1673.             }
  1674.         }
  1675.         return $out;
  1676.     }
  1677.     protected function sendPendingRequest($mailer$datas$DBG false) {
  1678.         if (isset($mailer
  1679.             && isset($datas['EMAIL'])
  1680.             && isset($datas['IDE_DOSSIER'])
  1681.             && isset($datas['IDE_MANAGER'])
  1682.             && isset($datas['STATUT'])
  1683.         ) {
  1684.             $ide_manager $datas['IDE_MANAGER'];
  1685.             $ide_dossier $datas['IDE_DOSSIER'];
  1686.             $manager_datas $this->getPersonnelFromIdeDossier($ide_manager);
  1687.                $owner_datas $this->getPersonnelFromIdeDossier($ide_dossier);
  1688.             if (isset($owner_datas['IDE_MANAGER'])) {
  1689.                 $ide_manager $owner_datas['IDE_MANAGER'];
  1690.             }
  1691.             //*
  1692.             //
  1693.             //
  1694.             $owner_datas['URI'] =  "https://{$_SERVER['HTTP_HOST']}";
  1695.             $owner_datas['ID_VCARD'] = $datas['ID_VCARD'];
  1696.             if (isset($this->pendingMailDatas[$datas['STATUT']])) {
  1697.                 $content $this->assignTplValues($this->pendingMailDatas[$datas['STATUT']]['content'], $owner_datas);
  1698.                 $subject $this->pendingMailDatas[$datas['STATUT']]['subject'];
  1699.                 if (!array_key_exists('EMAIL_PRO'$manager_datas)) {
  1700.                     echo('-- FAIL:' .var_export($manager_datastrue));
  1701.                     echo(' datas: 'var_export($datastrue));
  1702.                     echo('<br/>'."\n");
  1703.                     return;
  1704.                 }
  1705.                 // echo($manager_datas['EMAIL_PRO']).' ';
  1706.                 // echo($owner_datas['EMAIL_PRO']).'<br/> ';
  1707.                 $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' ));
  1708.                 $dbg_dst_mail  $dst_mail;
  1709.                 // $dst_mail = 'herimamy.ratefiarivony@ensam.eu';
  1710.                 if ($DBG !== false) {
  1711.                     echo(__METHOD__.':'var_export($manager_datastrue));
  1712.                     echo(__METHOD__.':'var_export($owner_datastrue));
  1713.                     echo(__METHOD__.'<br/>'.var_export($datastrue));
  1714.                     echo('<br/>'
  1715.                         "To: $dbg_dst_mail<br/>"
  1716.                         "Subject: $subject<br/>"
  1717.                         "Content:<br/>"
  1718.                         $content
  1719.                     );
  1720.                 }
  1721.                 // date_default_timezone_set('Europe/Berlin');
  1722.                 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");
  1723.                 if ($dst_mail != 'NO_EMAIL_PRO') {
  1724.                     $this->sendemail($mailer$dst_mail$subject$content);
  1725.                 // */
  1726.                     //
  1727.                 } else {
  1728.                     echo('FAILED: ');
  1729.                     echo($dst_mail) . '<br/>'
  1730.                         .var_export($datastrue)
  1731.                         ;
  1732.                 }
  1733.             }
  1734.         }
  1735.     }
  1736.     protected function notifyForVCard($mailer$vCard$subject, array $content_datasLoggerInterface $logger null) {
  1737.         if (isset($vCard)
  1738.         && !empty($subject)
  1739.             && isset($content_datas['user'])
  1740.         && isset($content_datas['manager'])
  1741.         ) {
  1742.                $id_vcard $vCard->getId();
  1743.         $ide_dossier  $vCard->getide_dossier();
  1744.         $ide_manager  $vCard->getide_manager();
  1745.         
  1746.         $manager_datas $this->getPersonnelFromIdeDossier($ide_manager);
  1747.            $owner_datas $this->getPersonnelFromIdeDossier($ide_dossier);
  1748.         /*
  1749.          $uri = "http://{$_SERVER['HTTP_HOST']}"; // {$_SERVER['REQUEST_URI']}";
  1750.         $user_content = '<b>Utilisateur</b><br/>' 
  1751.             . 'Votre carte vient d\'être validée...<br/>'
  1752.             . 'Vous pouvez la consulter à cette adresse:<br/>'
  1753.             . '<a href="'.$uri.'/v/card/">'
  1754.             . 'Voir...'
  1755.             . '</a>'
  1756.             ;
  1757.                  */
  1758.                 if (isset($owner_datas['EMAIL_PRO'])
  1759.                     && !empty($content_datas['user'])
  1760.                 ) {
  1761.             $this->sendemail($mailer$owner_datas['EMAIL_PRO'], $subject$content_datas['user'], $logger);
  1762.         }
  1763.         /*
  1764.         $manager_content = '<hr/><b>Manager</b><br/>'
  1765.             .'Merci un mail a été envoyé au propriétaire de la carte à cette adresse: ' . $owner_datas['EMAIL_PRO']
  1766.             // . '<a href="'.$uri.'/v/card/'.$id_vcard.'?manager=1">'
  1767.             // . 'Voir...'
  1768.             // . '</a>'
  1769.             ;
  1770.         */
  1771.                 if (isset($manager_datas['EMAIL_PRO'])
  1772.                     && !empty($content_datas['manager'])
  1773.                 ) {
  1774.             /* TODO: REMOVE this TESTONLY
  1775.             $manager_datas['EMAIL_PRO'] = 'herimamy.ratefiarivony@ensam.eu';
  1776.             // */
  1777.             $this->sendemail($mailer$manager_datas['EMAIL_PRO'], $subject$content_datas['manager'], $logger);
  1778.         }
  1779.         }
  1780.     }
  1781.     /**
  1782.      * @Route("/v/card/{id_vcard}/accepted", name="app_v_card_accepted", methods={"GET", "POST"})
  1783.      */
  1784.     public function accepted(Request $requestVCard $vCardVCardRepository $vCardRepositoryMailerInterface $mailerLoggerInterface $logger): Response
  1785.     {
  1786.         // echo(__METHOD__.': mailer: '.var_export($mailer, true)); exit();
  1787.         $id_vcard $vCard->getId();
  1788.         $content 'ACCESS_DENIED';
  1789.     $session $request->getSession();
  1790.     $is_auth $session->get('is_auth');
  1791.     $user_email $session->get('user_email');
  1792.     $personnel_datas $this->getPersonnelFromEnv($session);
  1793.     if (!$is_auth) {
  1794.         $session->set('previous''app_v_card_accepted');
  1795.         $session->set('prev_id'$vCard->getId());
  1796.         return new Response(null302, array(
  1797.                 'Location'        => '/v/card/auth',
  1798.         ));
  1799.     } else {
  1800.         $ide_dossier  $vCard->getide_dossier();
  1801.         $owner_datas $this->getPersonnelFromIdeDossier($ide_dossier);
  1802.         $owner_mail = isset($owner_datas['EMAIL_PRO']) ? $owner_datas['EMAIL_PRO'] : '';
  1803.         // echo(__METHOD__.''.var_export($owner_mail, true)); exit();
  1804. if ($vCard->getstatut() == 'validé') {
  1805.          $uri "https://{$_SERVER['HTTP_HOST']}"// {$_SERVER['REQUEST_URI']}";
  1806.     $content_datas = array(
  1807.         'user' =>         'Bonjour '.$owner_datas['PRENOM'].',<br/>'
  1808.                         .'Votre carte de visite vient d\'être acceptée.<br/>'
  1809.                             .'Vous pouvez la consulter à cette adresse:<br/>'
  1810.                             '<a href="'.$uri.'/v/card/last?email='.$owner_mail.'">'
  1811.                             'Voir...'
  1812.                         '</a><br/>'
  1813.                         '<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>'
  1814.                         ,
  1815.                 'manager' => '' // 'Merci un mail a été envoyé au propriétaire de la carte...'
  1816.                             // . '<a href="'.$uri.'/v/card/'.$id_vcard.'?manager=1">'
  1817.                             // . 'Voir...'
  1818.                         //. '</a>'
  1819.                     ,
  1820.                 );
  1821.         $subject 'Carte de visite acceptée';
  1822.        // $content = $content_datas['user'].'<hr/>'.$content_datas['manager'];
  1823.        // if (!isset($_GET['stay'])) {
  1824.            // $content = '<script type="text/JavaScript">window.close();</script>';
  1825.         $content '<script type="text/JavaScript">window.location.href = "/v/card/manager";</script>';
  1826.        // }
  1827.          /*
  1828.         if (file_exists($this->uploadsDIR.('tmp_photo_'.$ide_dossier.'.jpg'))) {
  1829.             rename($this->uploadsDIR.('tmp_photo_'.$ide_dossier.'.jpg'), $this->uploadsDIR.('photo_'.$ide_dossier.'.jpg'));
  1830.         }
  1831.         //*/
  1832.         $this->notifyForVCard($mailer$vCard$subject$content_datas$logger);
  1833.         // TODO generateQrCodeFile in folder
  1834.         //*
  1835.             $url "https://{$_SERVER['HTTP_HOST']}/v/card/last?";
  1836.              $this->generateQrCodeFile($url$owner_mail);
  1837.         //*/
  1838. }
  1839.     } // END is_auth
  1840.     return new Response($content200, array(
  1841.             'Content-type'        => 'text/html',
  1842.         )
  1843.     );
  1844.     }
  1845.     /**
  1846.      * @Route("/v/card/{id_vcard}/rejected", name="app_v_card_rejected", methods={"GET", "POST"})
  1847.      */
  1848.     public function rejected(Request $requestVCard $vCardVCardRepository $vCardRepositoryMailerInterface $mailer): Response
  1849.     {
  1850.         $id_vcard $vCard->getId();
  1851.     $content 'ACCESS_DENIED';
  1852.     $session $request->getSession();
  1853.     $is_auth $session->get('is_auth');
  1854.     $user_email $session->get('user_email');
  1855.     $personnel_datas $this->getPersonnelFromEnv($session);
  1856.     if (!$is_auth) {
  1857.         $session->set('previous''app_v_card_rejected');
  1858.         $session->set('prev_id'$vCard->getId());
  1859.         return new Response(null302, array(
  1860.                 'Location'        => '/v/card/auth',
  1861.         ));
  1862.     } else {
  1863. if ($vCard->getstatut() == 'rejetée') {
  1864.         $ide_dossier  $vCard->getide_dossier();
  1865.         $owner_datas $this->getPersonnelFromIdeDossier($ide_dossier);
  1866.          $uri "https://{$_SERVER['HTTP_HOST']}"// {$_SERVER['REQUEST_URI']}";
  1867.     $content_datas = array(
  1868.         'user' => 'Bonjour '.$owner_datas['PRENOM'].',<br/>'
  1869.                         .'Votre carte de visite vient d\'être rejetée.<br/>'
  1870.                             .'Vous pouvez la modifier à cette adresse:<br/>'
  1871.                             '<a href="'.$uri.'/v/card/'.$id_vcard.'">'
  1872.                             'Voir...'
  1873.                         '</a><br/>'
  1874.                         '<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>'
  1875.                     ,
  1876.                 'manager' => '' // 'Merci un mail a été envoyé au propriétaire de la carte...'
  1877.                             // . '<a href="'.$uri.'/v/card/'.$id_vcard.'?manager=1">'
  1878.                             // . 'Voir...'
  1879.                         //. '</a>'
  1880.                     ,
  1881.                 );
  1882.         $subject 'Carte de visite rejetée';
  1883.        $content $content_datas['user'].'<hr/>'.$content_datas['manager'];
  1884.        if (!isset($_GET['stay'])) {
  1885.            // $content = '<script type="text/JavaScript">window.close();</script>';
  1886.         $content '<script type="text/JavaScript">window.location.href = "/v/card/manager";</script>';
  1887.        }
  1888.         $this->notifyForVCard($mailer$vCard$subject$content_datas);
  1889. }    
  1890.     }
  1891.     return new Response($content200, array(
  1892.             'Content-type'        => 'text/html',
  1893.         )
  1894.     );
  1895.     }
  1896.    protected function getManagedCards($ide_manager$DBG false) : array {
  1897.        $out = array();
  1898.     if (!empty($ide_manager)) {
  1899.         $out $this->selectFromWhere('VCARD''IDE_MANAGER = '$ide_manager." AND STATUT='à valider'"null$DBG);
  1900.     }
  1901.     return $out;
  1902.    }
  1903.     /**
  1904.      * @Route("/v/card/{id_vcard}/submited", name="app_v_card_submited", methods={"GET", "POST"})
  1905.      */
  1906.     public function submited(Request $requestVCard $vCardVCardRepository $vCardRepositoryMailerInterface $mailerLoggerInterface $logger): Response
  1907.     {
  1908.     $session $request->getSession();
  1909.     $is_auth $session->get('is_auth');
  1910.     $user_email $session->get('user_email');
  1911.     $personnel_datas $this->getPersonnelFromEnv($session);
  1912.     if (!$is_auth) {
  1913.         $session->set('previous''app_v_card_submited');
  1914.         $session->set('prev_id'$vCard->getId());
  1915.         return new Response(null302, array(
  1916.                 'Location'        => '/v/card/auth',
  1917.         ));
  1918.     } else {
  1919.         $id_vcard $vCard->getId();
  1920.          $uri "https://{$_SERVER['HTTP_HOST']}"// {$_SERVER['REQUEST_URI']}";
  1921.     $content 'ACCESS_DENIED';
  1922. if ($vCard->getstatut() == 'à valider') { // NOTE: statut set in card_edit
  1923.     $ide_dossier  $vCard->getide_dossier();
  1924.     $this->disableOldPendingCards($vCard);
  1925.         $owner_datas $this->getPersonnelFromIdeDossier($ide_dossier);
  1926.     $content_datas = array(
  1927.         'user' =>     'Bonjour '.$owner_datas['PRENOM'].',<br/>'
  1928.                         .'Votre nouvelle carte vient d\'être soumise à validation...<br/>'
  1929.                             .'Vous pouvez suivre son statut à cette adresse:<br/>'
  1930.                             '<a href="'.$uri.'/v/card/'.$id_vcard.'">'
  1931.                             'Voir...'
  1932.                         '</a><br/>'
  1933.                         '<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>'
  1934.                         ,
  1935.                 '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/>'
  1936.                             '<a href="'.$uri.'/v/card/manager">'
  1937.                             'Voir...'
  1938.                         '</a>',
  1939.                         //. 'Une nouvelle carte ('.$owner_datas['EMAIL_PRO'].') attend votre validation à cette adresse:<br/>'
  1940.                 );
  1941.         /*
  1942.         $content = '<b>Utilisateur</b><br/>' 
  1943.             . 'Votre nouvelle carte vient d\'être soumise à validation...<br/>'
  1944.             .'Vous pouvez suivre sont statut à cette adresse:<br/>'
  1945.             . '<a href="'.$uri.'/v/card/'.$id_vcard.'">'
  1946.             . 'Voir...'
  1947.             . '</a>'
  1948.             .'<hr/><b>Manager</b><br/>'
  1949.             .'Une nouvelle carte attend votre validation à cette adresse:<br/>'
  1950.             . '<a href="'.$uri.'/v/card/'.$id_vcard.'?manager=1">'
  1951.             . 'Voir...'
  1952.             . '</a>'
  1953.             ;
  1954.         //*/
  1955.         $subject '[Arts et Métiers] - carte de visite à valider - '.$owner_datas['PRENOM'].' '.$owner_datas['NOM']; // 'Carte de visite soumise';
  1956.        // $content = $content_datas['user'].'<hr/>'.$content_datas['manager'];
  1957.         //* / TODO: enable this
  1958.         $this->notifyForVCard($mailer$vCard$subject$content_datas$logger);
  1959.         //*/
  1960. }
  1961. /*
  1962.     return new Response($content, 200, array(
  1963.             'Content-type'        => 'text/html',
  1964.         )
  1965.     );
  1966.         */
  1967.         return new Response(null302, array(
  1968.                 'Location'        => '/v/card',
  1969.         ));
  1970.     } // END is_auth
  1971.     }
  1972.     protected function duplicateCard(VCard $vCard, array $personnel_datasEntityManagerInterface $em) { // VCardRepository $vCardRepository) {
  1973.         $out false;
  1974.         if (isset($vCard) && isset($personnel_datas['IDE_MANAGER']) && isset($em)) {
  1975.         // echo(__METHOD__.': '.var_export($vCard, true)); echo('<br/>');
  1976.             $new_card = new VCard();
  1977.         $new_id $this->getNewVCardId();
  1978.         $new_card->setid_vcard($new_id);
  1979.         $new_card->settitre($vCard->gettitre());
  1980.         $new_card->settel($vCard->gettel());
  1981.         $new_card->setide_dossier($vCard->getide_dossier());
  1982.         $new_card->setemail($vCard->getemail());
  1983.         $new_card->setavec_photo($vCard->getavec_photo());
  1984.         $new_card->setstatut('enregistrée');
  1985.         $new_card->setVERSION(($vCard->getversion() * 1) + 1);
  1986.         $new_card->setide_manager($personnel_datas['IDE_MANAGER']);
  1987.         if ($this->isSelfValidator($personnel_datas)) {
  1988.             $new_card->setstatut('validé');        
  1989.         }
  1990.         $new_card->setDMODIFICATION((new DateTime('now', new DateTimeZone('Europe/Budapest'))));
  1991.         // echo(__METHOD__.': '.var_export($new_card, true)); exit();
  1992.                 // $vCardRepository->add($new_card, true);
  1993.         $em->detach($vCard);
  1994.         $em->persist($new_card);
  1995.         $em->flush();
  1996.            $out true
  1997.         }
  1998.         return($out);
  1999.     }
  2000.     /**
  2001.      * @Route("/v/card/{id_vcard}/duplicate", name="app_v_card_duplicate", methods={"GET", "POST"})
  2002.      */
  2003.     public function duplicate(Request $requestVCard $vCardVCardRepository $vCardRepository): Response
  2004.     {
  2005.     $session $request->getSession();
  2006.     $is_auth $session->get('is_auth');
  2007.     $user_email $session->get('user_email');
  2008.     $personnel_datas $this->getPersonnelFromEnv($session);
  2009.         
  2010.     if (!$is_auth) {
  2011.         $session->set('previous''app_v_card_duplicate');
  2012.         $session->set('prev_id'$vCard->getId());
  2013.         return new Response(null302, array(
  2014.                 'Location'        => '/v/card/auth',
  2015.         ));
  2016.     } else { 
  2017.         // echo(__METHOD__.': '.var_export($vCard, true)); exit();
  2018.         $new_card = new VCard();
  2019.         $new_id $this->getNewVCardId();
  2020.         $new_card->setid_vcard($new_id);
  2021.         $new_card->settitre($vCard->gettitre());
  2022.         $new_card->settel($vCard->gettel());
  2023.         $new_card->setide_dossier($vCard->getide_dossier());
  2024.         $new_card->setemail($vCard->getemail());
  2025.         $new_card->setavec_photo($vCard->getavec_photo());
  2026.         $new_card->setstatut('enregistrée');
  2027.         $new_card->setVERSION(($vCard->getversion() * 1) + 1);
  2028.         $new_card->setide_manager($personnel_datas['IDE_MANAGER']);
  2029.         // echo(__METHOD__.': '.var_export($new_card, true)); exit();
  2030.             $vCardRepository->add($new_cardtrue);
  2031.             return $this->redirectToRoute('app_v_card_edit', ['id_vcard' => $new_id], Response::HTTP_SEE_OTHER);
  2032.     }    
  2033.     }
  2034.     /**
  2035.      * @Route("/v/card/{id_vcard}/infos", name="app_v_card_info", methods={"GET", "POST"})
  2036.      */
  2037.     public function infos(Request $requestVCard $vCardVCardRepository $vCardRepository): Response {
  2038.     $session $request->getSession();
  2039.     $is_auth $session->get('is_auth');
  2040.     $user_email $session->get('user_email');
  2041.     $personnel_datas $this->getPersonnelFromEnv($session);
  2042.     // $user_email = $session->get('is_auth');
  2043.     // echo(__METHOD__.': session:'.var_export($_SESSION, true)); exit();
  2044.     
  2045.     $ide_dossier $vCard->getide_dossier();
  2046.     $is_owner $ide_dossier == $personnel_datas['IDE_DOSSIER'];
  2047.     $last_card $this->getLastCardId($vCard);
  2048.             $owner_id $vCard->getide_dossier();
  2049.             $query 'select max(id_vcard) as F_ID from vcard where ide_dossier='.$owner_id." AND statut='enregistrée' or statut='validé'";
  2050.     echo(__METHOD__.' query: ' $query);
  2051.         
  2052.     if (!$is_auth) {
  2053.         $session->set('previous''app_v_card_info');
  2054.         return new Response(null302, array(
  2055.                 'Location'        => '/v/card/auth',
  2056.         ));
  2057.     } else {
  2058.             $ide_manager $personnel_datas['IDE_MANAGER'];
  2059.             // $ide_dossier = $datas['IDE_DOSSIER'];
  2060.             $manager_datas $this->getPersonnelFromIdeDossier($ide_manager);
  2061.                $owner_datas $this->getPersonnelFromIdeDossier($ide_dossier);
  2062.         echo(__METHOD__.': last card datas: '.var_export($last_cardtrue));
  2063.             echo('<br/>');
  2064.         echo(__METHOD__.': owner_datas: '.var_export($owner_datastrue));
  2065.             echo('<br/>');
  2066.     
  2067.             echo(__METHOD__.': manager_datas: '.var_export($manager_datastrue));
  2068.             echo('<br/>');
  2069.         echo(__METHOD__.': personnel_datas: '.var_export($personnel_datastrue));
  2070.             echo('<br/>');
  2071.         echo(__METHOD__.': personnel_datas: '.var_export($personnel_datastrue));
  2072.         echo(__METHOD__.': '.var_export($vCardtrue));
  2073.         echo(__METHOD__.': photo:' $vCard->getavec_photo()); exit();
  2074.     
  2075.     } 
  2076.     }
  2077.     public function getLastCardId(VCard $vcard) {
  2078.         $out null;
  2079.         if (!empty($vcard)) {
  2080.             $owner_id $vcard->getide_dossier();
  2081.             $query 'select max(id_vcard) as F_ID from vcard where ide_dossier='.$owner_id." AND (statut='enregistrée' or statut='validé')";
  2082.             $result $this->selectRaw($query);
  2083.             if (isset($result[0]['F_ID'])) {
  2084.                 $out $result[0]['F_ID'];
  2085.             }
  2086.         }
  2087.         return $out;
  2088.     }
  2089.     /**
  2090.      * @Route("/v/card/{id_vcard}/liveedit", name="app_v_card_liveedit", methods={"GET", "POST"})
  2091.      */
  2092.     public function liveedit(Request $requestVCard $vCardEntityManagerInterface $em): Response
  2093.     {
  2094.     $session $request->getSession();
  2095.     $is_auth $session->get('is_auth');
  2096.     $user_email $session->get('user_email');
  2097.     $personnel_datas $this->getPersonnelFromEnv($session);
  2098.     // $user_email = $session->get('is_auth');
  2099.     // echo(__METHOD__.': session:'.var_export($_SESSION, true)); exit();
  2100.     // echo(__METHOD__.': personnel_datas: '.var_export($personnel_datas, true)); exit();
  2101.     $ide_dossier $vCard->getide_dossier();
  2102.     $cur_card_id $vCard->getId();
  2103.     if (isset($personnel_datas['IDE_DOSSIER'])) {
  2104.         $is_owner $ide_dossier == $personnel_datas['IDE_DOSSIER'];
  2105.     }
  2106.         
  2107.     if (!$is_auth) {
  2108.         $session->set('previous''app_v_card_edit');
  2109.         $session->set('prev_id'$vCard->getId());
  2110.         return new Response(null302, array(
  2111.                 'Location'        => '/v/card/auth',
  2112.         ));
  2113.     } else if (!$is_owner) {
  2114.         return new Response(null302, array(
  2115.                 'Location'        => 'notfound',
  2116.         ));
  2117.         exit();
  2118. /*
  2119.         return new Response(null, 404, array(
  2120.                 // 'Location'        => 'auth',
  2121.         ));
  2122.                  */
  2123.     // else 
  2124.         
  2125.     $last_card_id $this->getLastCardId($vCard);
  2126.     if (FALSE && 
  2127.         !empty($last_card_id) && $cur_card_id != $last_card_id
  2128.     ) {
  2129.             return $this->redirectToRoute('app_v_card_edit', ['id_vcard' => $last_card_id], Response::HTTP_SEE_OTHER);
  2130.     } else { 
  2131.     $infos_carte $this->getV_INFOS_CARTE($vCard->getide_dossier());
  2132.         $form $this->createForm(VCardType::class, $vCard);
  2133.         $form->handleRequest($request);
  2134.     $custom_photo_key '';
  2135.     $delete_custom_key '';
  2136.     $file_path $this->uploadsDIR.('photo_'.$ide_dossier.'.jpg');
  2137.     $is_custom_photo = (file_exists($file_path)); // NOTE: user needs to delete to disable custom
  2138.     if ($is_custom_photo) {
  2139.         $custom_photo_key $this->storeInSession($session$file_path);
  2140.         $delete_custom_key $this->storeInSession($session$file_path);
  2141.     }
  2142.     if ($form->isSubmitted() && $form->isValid()) {
  2143.         // echo(__METHOD__.': vCard:'.var_export($vCard, true)); exit();
  2144.         if (!$this->duplicateCard($vCard$personnel_datas$em)) { // $vCardRepository)) {
  2145.             // Redirect to error
  2146.             echo(__METHOD__.': vCard: duplicate FAILED: '); // .var_export($vCard, true)); exit();
  2147.             exit();
  2148.         }
  2149.             return $this->redirectToRoute('app_v_card_index', [], Response::HTTP_SEE_OTHER); exit();
  2150.         }
  2151.     // echo('<!-- '.__METHOD__.' '.$this->getLastCardId($vCard).' // -->');
  2152.         return $this->renderForm('v_card/edit.html.twig', [
  2153.         'v_card' => $vCard,
  2154.         'user_email' => $user_email,
  2155.         'personnel'    => $personnel_datas,
  2156.         'is_new'    => false,
  2157.         'is_live'    => true,
  2158.         'disp_form'    => true,
  2159.         'is_manager'    => $session->get('is_manager'),
  2160.         'custom_photo_key'     => $custom_photo_key,
  2161.         'delete_custom_key'    => $delete_custom_key,
  2162.             'form' => $form,
  2163.     ]);
  2164.     } // END if edit
  2165.     }
  2166.     /**
  2167.      * @Route("/v/card/{id_vcard}/edit", name="app_v_card_edit", methods={"GET", "POST"})
  2168.      */
  2169.     public function edit(Request $requestVCard $vCardVCardRepository $vCardRepository): Response
  2170.     {
  2171.     // $this->testConnection($vCardRepository->getDBConnection());
  2172.     // echo(__METHOD__.': vCard: '.var_export($vCard->getide_dossier(), true)); // exit();
  2173.     $session $request->getSession();
  2174.     $is_auth $session->get('is_auth');
  2175.     $user_email $session->get('user_email');
  2176.     $personnel_datas $this->getPersonnelFromEnv($session);
  2177.     // $user_email = $session->get('is_auth');
  2178.     // echo(__METHOD__.': session:'.var_export($_SESSION, true)); exit();
  2179.     // echo(__METHOD__.': personnel_datas: '.var_export($personnel_datas, true)); exit();
  2180.     $ide_dossier $vCard->getide_dossier();
  2181.     $cur_card_id $vCard->getId();
  2182.     if (isset($personnel_datas['IDE_DOSSIER'])) {
  2183.         $is_owner $ide_dossier == $personnel_datas['IDE_DOSSIER'];
  2184.     }
  2185.         
  2186.     if (!$is_auth) {
  2187.         $session->set('previous''app_v_card_edit');
  2188.         $session->set('prev_id'$vCard->getId());
  2189.         return new Response(null302, array(
  2190.                 'Location'        => '/v/card/auth',
  2191.         ));
  2192.     } else if (!$is_owner) {
  2193.         /*
  2194.         $owner_datas = $this->getPersonnelFromIdeDossier($ide_dossier);
  2195.         echo(__METHOD__.' owner: '.var_export($owner_datas, true).' personnel_datas: ' . var_export($personnel_datas, true));
  2196.         echo(__METHOD__. ': not owner'); exit();
  2197.         // */
  2198.         return new Response(null302, array(
  2199.                 'Location'        => 'notfound',
  2200.         ));
  2201. /*
  2202.         return new Response(null, 404, array(
  2203.                 // 'Location'        => 'auth',
  2204.         ));
  2205.                  */
  2206.     // else 
  2207.         
  2208.     $last_card_id $this->getLastCardId($vCard);
  2209.         if (!empty($last_card_id) && $cur_card_id != $last_card_id
  2210.     ) {
  2211.             return $this->redirectToRoute('app_v_card_edit', ['id_vcard' => $last_card_id], Response::HTTP_SEE_OTHER);
  2212.     } else { 
  2213.     $infos_carte $this->getV_INFOS_CARTE($vCard->getide_dossier());
  2214.         $form $this->createForm(VCardType::class, $vCard);
  2215.         $form->handleRequest($request);
  2216.     $custom_photo_key '';
  2217.     $delete_custom_key '';
  2218.     $file_path $this->uploadsDIR.('photo_'.$ide_dossier.'.jpg');
  2219.     $is_custom_photo = (file_exists($file_path)); // NOTE: user needs to delete to disable custom
  2220.     if ($is_custom_photo) {
  2221.         $custom_photo_key $this->storeInSession($session$file_path);
  2222.         $delete_custom_key $this->storeInSession($session$file_path);
  2223.     }
  2224.     if ($form->isSubmitted() && $form->isValid()) {
  2225.         // echo(__METHOD__.': vCard:'.var_export($vCard, true)); exit();
  2226.         if ($this->isSelfValidator($personnel_datas)) {
  2227.             $vCard->setstatut('validé');        
  2228.         }
  2229.         $vCard->setDMODIFICATION((new DateTime('now', new DateTimeZone('Europe/Budapest'))));
  2230.         $vCardRepository->add($vCardtrue);
  2231.             return $this->redirectToRoute('app_v_card_index', [], Response::HTTP_SEE_OTHER);
  2232.         }
  2233.     // echo('<!-- '.__METHOD__.' '.$this->getLastCardId($vCard).' // -->');
  2234.         return $this->renderForm('v_card/edit.html.twig', [
  2235.         'v_card' => $vCard,
  2236.         'user_email' => $user_email,
  2237.         'personnel'    => $personnel_datas,
  2238.         'is_new'    => false,
  2239.         'disp_form'    => true,
  2240.         'is_manager'    => $session->get('is_manager'),
  2241.         'custom_photo_key'     => $custom_photo_key,
  2242.         'delete_custom_key'    => $delete_custom_key,
  2243.             'form' => $form,
  2244.     ]);
  2245.     } // END if edit
  2246.     }
  2247.     /**
  2248.      * @Route("/v/card/{id_vcard}", name="app_v_card_delete", methods={"POST"})
  2249.      */
  2250.     public function delete(Request $requestVCard $vCardVCardRepository $vCardRepository): Response
  2251.     {
  2252.     $session $request->getSession();
  2253.     $is_auth $session->get('is_auth');
  2254.     $user_email $session->get('user_email');
  2255.     // $user_email = $session->get('is_auth');
  2256.     // echo(__METHOD__.': session:'.var_export($_SESSION, true)); exit();
  2257.         
  2258.     if (!$is_auth) {
  2259.         $session->set('previous''app_v_card_delete');
  2260.         return new Response(null302, array(
  2261.                 'Location'        => '/v/card/auth',
  2262.         ));
  2263.     } else { 
  2264.         if ($this->isCsrfTokenValid('delete'.$vCard->getID_VCARD(), $request->request->get('_token'))) {
  2265.             echo(__METHOD__.': id: '.$vCard->getID_VCARD()); exit();
  2266.             // $vCardRepository->remove($vCard, true);
  2267.         }
  2268.     return $this->redirectToRoute('app_v_card_index', [], Response::HTTP_SEE_OTHER);
  2269.     }
  2270.     }
  2271. }