src/Controller/VCardController.php line 1454

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