<?php
namespace App\Controller;
use App\Entity\PersonBioVerification;
use App\Entity\CheckQr;
use App\Entity\Device;
use App\Repository\ApplicationRepository;
use App\Repository\DeviceRepository;
use App\Repository\PersonCivilRepository;
use App\Repository\CheckQrRepository;
use App\Form\PersonBioVerificationType;
use App\Repository\PersonBioVerificationRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Filesystem\Filesystem;
use Google\Auth\Credentials\ServiceAccountCredentials;
Use Google\Auth\HttpHandler\HttpHandlerFactory;
use Symfony\Component\HttpFoundation\JsonResponse;
use Psr\Container\ContainerInterface;
use App\API\SqrApi as SqrApi;
use App\API\Tech5DigitalApi as Tech5DigitalApi;
use Symfony\Component\String\Slugger\SluggerInterface;
/**
* @Route("/person/bio/verification")
*/
class PersonBioVerificationController extends AbstractController
{
//Cette fonction Manipule la table Person Bio Verification pour initier une vérification biométrique
/**
* @Route("/initiate", name="app_person_bio_verification_initiate", methods={"GET", "POST"})
*/
public function initiateVerification(Request $request, PersonBioVerificationRepository $personBioVerificationRepository, PersonCivilRepository $personCivilRepository, CheckQrRepository $checkQrRepository, ContainerInterface $container, SluggerInterface $slugger, ApplicationRepository $applicationRepository): Response
{
$notificationTitle = $request->get("notificationTitle");
$notificationMessage = $request->get("notificationMessage");
//$notificationToken = $request->get("notificationToken");
$title = $request->get("title");
$appKey = $request->get("appKey");
$ido = $request->get("ido");
$process = $request->get("process");
if (!empty($appKey) &&!empty($ido) && !empty($process) && !empty($notificationMessage) && !empty($notificationTitle))
{
$application = $applicationRepository->findOneBy(['applicationPass'=>$appKey]);
$requesterPersonCivil = $personCivilRepository->findOneBySqr($ido); // IDO vérifieur
if(!empty($application))
{
if(!empty($requesterPersonCivil))
{
$cle = $this->getParameter('api_key');
$piece = 'New Verification';
$proprietaire = "API Root user";
$post = array(
'cle' => $cle,
'pieceqr'=> $piece,
'proprietaire' => $proprietaire,
);
$api = new SqrApi($container);
$res = $api->callAPI($post);
if($res[0]) // si SQR a repondu, on utilise sa référence et on stock
{
$qr = $res[0]->qr;
$num = $res[0]->niu;
$checkqr = new CheckQr();
$checkqr->setLibelle($qr);
$checkqr->setNumero($num);
// method to flush
$checkQrRepository ->add($checkqr, false);
$personBioVerification = new PersonBioVerification();
/** @var UploadedFile $file */
$fich = $request->files->get('file');
//This condition is needed because the 'brochure' field is not required
//So the PDF file must be processed only when a file is uploaded
if ($fich)
{
$originalFilename = pathinfo($fich->getClientOriginalName(), PATHINFO_FILENAME);
//This is needed to safely include the file name as part of the URL
$safeFilename = $slugger->slug($originalFilename);
$newFilename = $safeFilename.'-'.uniqid().'.'.$fich->guessExtension();
$extension = $fich->guessExtension();
// Move the file to the directory where they must be stored
try {
$fich->move(
$this->getParameter('file_directory'),
$newFilename
);
} catch (FileException $e)
{
// ... handle exception if something happens during file upload
}
$personBioVerification->setFile($newFilename);
}
$personBioVerification->setTitle($title);
$personBioVerification->setNotificationTitle($notificationTitle);
$personBioVerification->setNotificationMessage($notificationMessage);
$personBioVerification->setApplication($application);
$personBioVerification->setCheckQr($checkqr);
$personBioVerification->setUserReference($requesterPersonCivil->getCheckQr());
$personBioVerification->setProcess($process);
$personBioVerificationRepository->add($personBioVerification, true);
$return = array(
'Etat' =>'SUCCESS',
'Message' =>"Demande d'authentification biométrique enregistré avec succès !!!",
'process'=>$process,
'référenceDemande'=>$num,
);
}else
{
$return = array(
'Etat' =>'FAILED' ,
'Message' =>"L'API SQR n'a pas repondu. Veuillez essayer à nouveau",
);
}
}else
{
$return = array(
'Etat' =>'FAILED' ,
'Message' =>"L'IDO de l'utilisateur à identifier est non conforme...",
);
}
}else
{
$return = array(
'Etat' =>'FAILED' ,
'Message' =>"La clé de l'application est incorrecte !!!",
);
}
}else
{
$return = array(
'Etat' =>'FAILED',
'Message' =>"Paramètres requis manquants !!!",
);
}
return new JsonResponse($return);
}
//Cette fonction Manipule la table Person bio verification en cas d'echec ou succès d'une vérification biométrique
/**
* @Route("/new/verify", name="app_person_bio_verification_new_verify_json", methods={"GET", "POST"})
*/
public function newVerify(Request $request, SluggerInterface $slugger, PersonBioVerificationRepository $personBioVerificationRepository, PersonCivilRepository $personCivilRepository, DeviceRepository $deviceRepository, CheckQrRepository $checkQrRepository, ContainerInterface $container, ApplicationRepository $applicationRepository): Response
{
$transactionReference = $request->get("transactionReference");
$appKey = $request->get("appKey"); // Référence de la transaction de signature
if (!empty($appKey))// vérification de la présence de la clé app dans la requette
{
if (!empty($transactionReference))// vérification de la présence de la référence de validation biométrique dans la requette
{
$personBioVerif = $personBioVerificationRepository->findOneBySqr($transactionReference);
if($personBioVerif)// vérification de l'existence de la référence de la transaction si existant en base ou pas
{
if($personBioVerif->getStatus() == 0)// vérification du statut de la transaction si déjà traitée ou pas
{
//to save newFilename
$cle = $this->getParameter('api_key');
$piece = 'Compare Fp TOKEN';
$proprietaire = "API Root user";
$post = array(
'cle' => $cle,
'pieceqr'=> $piece,
'proprietaire' => $proprietaire,
);
$api = new SqrApi($container);
$res = $api->callAPI($post);
if($res[0]) // si SQR a repondu, on utilise sa référence et on stock
{
$qr = $res[0]->qr;
$num = $res[0]->niu;
$checkqr = new CheckQr();
$checkqr->setLibelle($qr);
$checkqr->setNumero($num);
//$checkqr->setChemin($newname);
// method to flush
$checkQrRepository ->add($checkqr, false);
//$personRepository->add($person, true);
//////////////////////////////////////////////////////////////
try
{
$tech5DigitalApi = new Tech5DigitalApi($container);// Added for AIS 9
$resltTab = $tech5DigitalApi->getAndSaveFingerPrintsFromRequestObjects($request, $slugger, $num);
if($resltTab['isPosAvailable'] == "true") // on vérifie si au moins une empreinte a été envoyé.
{
if($resltTab['Etat'] == "SUCCESS") // on vérifie si l'extraction et la tranformation des FP en base64 s'est bien passé
{
$fst = new Filesystem();
$device = $resltTab['device'];
$deviceRepository->add($device, false);
$personBioVerif->setDevice($device);// on stock les informations du périphérique qui as effectué la requette
//extract finger base 64 data from object
//$resultExtractFpFromObject = $this->extractFingerBase_64_DataFromObject($personBiotrics, $personBiotrics->getCheckQr()->getNumero() /*, $slugger*/);
//$personBiotrics->setAbisFingerJson($resultExtractFpFromObject);
/// generate template
$resultTemplateCreation = $tech5DigitalApi->createTemplateWithJson($resltTab['t5Abis'], $num);
$personBioVerif->setFingerJson($resultTemplateCreation); // save template creation
$fst->appendToFile('log/personBioVerification/'.date("Y")."/".date("d-m-Y").'/personBioVerification.txt', "\r\n ".date("d-m-Y H:i:s")." - result Template creation : ".json_encode($resultTemplateCreation));
// end create template.
$bio = $personBioVerif->getUserReference()->getPersonBiometrics()[0];// on recupère les empreintes de l'utilisateur à identifier.
//$bio = $bioAuthHistory->getBioAuth()->getUserReference()->getPersonBiometrics()[0];// on recupère les empreintes de l'utilisateur à identifier.
$fing = json_encode($resultTemplateCreation['finger_data']['live_scan_plain']);
$fing = json_decode($fing,true);
$rslt = $tech5DigitalApi->verificationfingerTemplateCurlUpdated($bio, $num, $fing); // TECH5 abis 9 UPDATE
// Verification to ABIS server
$personBioVerif->setVerificationStatus($rslt);// store verification result
// End verification of ABIS Server
$fst->appendToFile('log/personBioVerification/'.date("Y")."/".date("d-m-Y").'/personBioVerification.txt', "\r\n ".date("d-m-Y H:i:s")." - response : ".json_encode($rslt));
$fingRslt = null;
if($rslt["fingerScore"] && $rslt["fingerScore"] > 16)// on valide le score supérieur à 16
{
$fingRslt = "True";
$personBioVerif->setStatus(1);
//$personBioVerif->setFile($newFilename);
$personBioVerif->setDateSign(new \Datetime());
$personBioVerif->setScore($rslt["fingerScore"]);
$personBioVerificationRepository->add($personBioVerif, true);
$return = array(
'Etat' =>'SUCCESS',
'Message' =>'vérification effectuée avec succès !!!',
'process'=>$personBioVerif->getProcess(),
'request_reference'=>$num,
'transaction_reference'=>$personBioVerif->getCheckQr()->getNumero(),
'finger_compare_result'=>$fingRslt,
'score'=>$rslt["fingerScore"]
);
// send notification
$devce = $resltTab['device'];//get notification object.
if(!empty($devce->getDeviceToken()))//
{
//$tech5DigitalApi->sendNotif($devce->getDeviceToken(),$personBioVerif->getNotificationMessage(),$personBioVerif->getNotificationTitle());
$this->sendNotif($devce->getDeviceToken(),$personBioVerif->getNotificationMessage(),$personBioVerif->getNotificationTitle());
}
}else // tout score inférieur à 16 est echec
{
$fingRslt = "False";
//$personMeetingMember->setStatus(2);
$return = array(
'Etat' =>'FAILED',
'Message' =>"Le match des empreintes a échoué.",
'process'=>$personBioVerif->getProcess(),
'request_reference'=>$num,
'transaction_reference'=>$personBioVerif->getCheckQr()->getNumero(),
'finger_compare_result'=>$fingRslt,
'score'=>$rslt["fingerScore"]
);
}
}else
{
$return = array(
'Etat' =>'FAILED',
'Message' =>"Une erreur est survenue lors de l'enregistrement des empreintes",
);
}
}else
{
$return = array(
'Etat' =>'FAILED',
'Message' =>"Aucune empreinte n'a été transmise pour comparaison. Veuillez reprendre le processus.",
);
}
} catch (\Throwable $error)
{
//not actions
$fs = new Filesystem();
//$fs->appendToFile('EventLogFiles.txt', "\r\n ".json_encode($error));
$fs->appendToFile('log/personBioVerification/Exceptions/'.date("Y")."/".date("d-m-Y").'/personBioVerification.txt', "\r\n ".date("d-m-Y H:i:s")." - exception : ".$error);
$return = array(
'Etat' =>'FAILED' ,
'Message' =>"Une erreur est survenue lors de l'opération. Veuillez essayer ultérieurement SVP",
'error'=>$error,
);
}
//////////////////////////////////////////////////////////////
}else
{
$return = array(
'Etat' =>'FAILED' ,
'Message' =>"L'API SQR n'a pas repondu. Veuillez essayer à nouveau",
);
}
}else{
$return = array(
'Etat' =>'FAILED' ,
'Message' =>"Cette demande a déjà été traitée et n'est plus disponible...",
);
}
}else
{
$return = array(
'Etat' =>'FAILED',
'Message' =>"La référence ne correspond à aucune transaction de demande de validation crée",
);
}
}else
{
$return = array(
'Etat' =>'FAILED',
'Message' =>"La référence de la vérification biométrique est absente...",
);
}
}else
{
$return = array(
'Etat' =>'FAILED',
'Message' =>"La clé d'autorisation de l'application est absente...",
);
}
return new JsonResponse($return);
}
/**
* @Route("/update/status", name="app_person_bio_verification_update_status", methods={"GET", "POST"})
*/
public function updateAuthenticationStatus(Request $request, PersonBioVerificationRepository $personBioVerificationRepository): Response
{
$authReference = $request->get("validationReference");//project transaction reference
$status = $request->get("status");//Statut de la vérification biométrique
$appKey = $request->get("appKey");//clé de l'application autorisant la mise jour
if($authReference && $status && $appKey)
{
$personbioVerification = $personBioVerificationRepository->findOneBySqr($authReference);
$statusTab = [/*"1","2",*/"3","4"]; // Real status tabs 1 ok 2 denied 3 warning 4 fraud
if(in_array($status, $statusTab, true))
{
if($personbioVerification)
{
if($personbioVerification->getStatus() ==0)
{
$personbioVerification->setStatus($status);
$personBioVerificationRepository->add($personbioVerification, true);
$return = array(
'Etat' => 'SUCCESS',
'Message' => "Le résultat de votre demande a été transmis avec succès sur ".$personbioVerification->getApplication()->getName(),
'authentication_status' => $personbioVerification->getUserAccess(),
'transactionReferene'=>$personbioVerification->getCheckQr()->getNumero(),
);
}else
{
$return = array(
'Etat' =>'FAILED' ,
'Message' =>"La transaction a déjà été traitée et ne peut plus être mis à jour...",
);
}
}else
{
$return = array(
'Etat' =>'FAILED' ,
'Message' =>"La référence n'est associé à aucune transaction en cours...",
);
}
}else
{
$return = array(
'Etat' =>'FAILED' ,
'Message' =>"Le statut à mettre à jour n'est pas conforme...",
);
}
}else
{
$return = array(
'Etat' =>'FAILED' ,
'Message' =>"Paramètres requis manquants !!!",
);
}
return new JsonResponse($return);
}
//get user validation history per project and per user.
/**
* @Route("/get/validations/history", name="app_person_bio_verification_history", methods={"GET", "POST"})
*/
public function getVerificationHistory(Request $request, PersonBioVerificationRepository $personBioVerificationRepository): Response
{
$userIdo = $request->get("userIdo");
$appKey = $request->get("appKey");
$action = $request->get("action");// HOLDER APPLICATION
if(!empty($userIdo) && !empty($appKey) && !empty($action))
{
$tabPersonBioVerificationHistories = array();
switch ($action)
{
case 'HOLDER':
$personBioVerificationHistories = $personBioVerificationRepository->findVerificationByUser($userIdo);
break;
case 'APPLICATION':
$personBioVerificationHistories = $personBioVerificationRepository->findVerificationByApplicationPass($appKey);
break;
default:
$return = array(
'Etat' =>'FAILED' ,
'Message' =>"L'action ne correspond à aucun attendu !!!",
);
return new JsonResponse($return);
break;
}
$nb = count($personBioVerificationHistories);
//dump($personBioVerificationHistories);die;
if($personBioVerificationHistories)
{
foreach ($personBioVerificationHistories as $key)
{
$tabPersonBioVerificationHistories [] =
[
'objet'=>$key->getTitle(),
'transactionReferene'=>$key->getCheckQr()->getNumero(),
'userIdo'=>$key->getUserReference()->getNumero(),
'civility'=>$key->getUserReference()->getPersonCivil()[0]->getCivility(),
'firstName'=>$key->getUserReference()->getPersonCivil()[0]->getFirstName(),
'lastName'=>$key->getUserReference()->getPersonCivil()[0]->getLastName(),
'application'=>$key->getApplication()->getName(),
'fichier'=>empty($key->getfile())? null : "uploads/kyvala/fichier/".$key->getfile(),
'statut'=>$key->getUserAccess(),
'score'=>$key->getScore(),
'dateEnregistrement'=>$key->getDateCreated()->format("d/m/Y H:i:s"),
'dateSignature'=>empty($key->getDateCreated()) ? null : $key->getDateCreated()->format("d/m/Y H:i:s"),
];
}
$return = array(
'Etat' => 'SUCCESS',
'Message' => "Historique recupérés avec succès...",
'nb' => $nb,
'records'=>$tabPersonBioVerificationHistories,
);
}else{
$return = array(
'Etat' => 'SUCCESS',
'Message' => "Aucun historique disponible pour ce critère de recherche...",
'nb' => $nb,
'records'=>$tabPersonBioVerificationHistories,
);
}
}else
{
$return = array(
'Etat' =>'FAILED' ,
'Message' =>"Paramètres requis manquants !!!",
);
}
return new JsonResponse($return);
}
// Ce end point permet à une application de vérifier le statut de la demande de d'authentification biométrique.
/**
* @Route("/check/status/authentication", name="app_person_bio_verification_check_status", methods={"GET", "POST"})
*/
public function checkAuthenticationStatus(Request $request, PersonBioVerificationRepository $personBioVerificationRepository, ApplicationRepository $applicationRepository): Response
{
$validationReference = $request->get("validationReference");//project transaction reference
$appKey = $request->get("appKey");// project unique key
if (!empty($validationReference) && !empty($appKey))
{
$application = $applicationRepository->findOneBy(['applicationPass'=>$appKey]);
if($application)
{
$personBioVerification = $personBioVerificationRepository->findOneBySqr($validationReference);
if($personBioVerification)
{
$return = array(
'Etat' => 'SUCCESS',
'Message' => "Enregistrement recupérée avec succès...",
'objet'=>$personBioVerification->getTitle(),
'transactionReferene'=>$personBioVerification->getCheckQr()->getNumero(),
'userIdo'=>$personBioVerification->getUserReference()->getNumero(),
'civility'=>$personBioVerification->getUserReference()->getPersonCivil()[0]->getCivility(),
'firstName'=>$personBioVerification->getUserReference()->getPersonCivil()[0]->getFirstName(),
'lastName'=>$personBioVerification->getUserReference()->getPersonCivil()[0]->getLastName(),
'application'=>$personBioVerification->getApplication()->getName(),
'fichier'=>empty($personBioVerification->getfile())? null : "uploads/kyvala/fichier/".$personBioVerification->getfile(),
'statut'=>$personBioVerification->getUserAccess(),
'score'=>$personBioVerification->getScore(),
'dateEnregistrement'=>$personBioVerification->getDateCreated()->format("d/m/Y H:i:s"),
'dateSignature'=>empty($personBioVerification->getDateSign()) ? null : $personBioVerification->getDateSign()->format("d/m/Y H:i:s"),
'isPouceGauche'=>$personBioVerification->getUserReference()->getPersonBiometrics()[0]->isPouceGauche(),
'isPouceDroit'=>$personBioVerification->getUserReference()->getPersonBiometrics()[0]->isPouceDroit(),
'isIndexDroit'=>$personBioVerification->getUserReference()->getPersonBiometrics()[0]->isIndexDroit(),
'isIndexGauche'=>$personBioVerification->getUserReference()->getPersonBiometrics()[0]->isIndexGauche(),
'isMajeurDroit'=>$personBioVerification->getUserReference()->getPersonBiometrics()[0]->isMajeurDroit(),
'isMajeurGauche'=>$personBioVerification->getUserReference()->getPersonBiometrics()[0]->isMajeurGauche(),
'isAnnulaireDroit'=>$personBioVerification->getUserReference()->getPersonBiometrics()[0]->isAnnulaireDroit(),
'isAnnulaireGauche'=>$personBioVerification->getUserReference()->getPersonBiometrics()[0]->isAnnulaireGauche(),
'isAuriculaireGauche'=>$personBioVerification->getUserReference()->getPersonBiometrics()[0]->isAuriculaireGauche(),
'isAuriculaireDroit'=>$personBioVerification->getUserReference()->getPersonBiometrics()[0]->isAuriculaireDroit(),
);
}else
{
$return = array(
'Etat' =>'FAILED' ,
'Message' =>"La référence n'est associé à aucune transaction...",
);
}
}else
{
$return = array(
'Etat' =>'FAILED' ,
'Message' =>"Vous n'avez pas l'autorisation pour cette requette",
);
}
}else
{
$return = array(
'Etat' =>'FAILED' ,
'Message' =>"Paramètres requis manquants",
);
}
return new JsonResponse($return);
}
private function sendNotif($user_notification_token,$title,$message)
{
//https://www.youtube.com/watch?v=YHniUsrmX9Y
$fs = new Filesystem();
$credential = new ServiceAccountCredentials(
"https://www.googleapis.com/auth/firebase.messaging",
json_decode(file_get_contents
("kyvala-45525-firebase-adminsdk-cxpp5-cf78b66d72.json"),true)
);
$token = $credential->fetchAuthToken(HttpHandlerFactory::build());
$accessToken = $token['access_token'];
$ch = curl_init("https://fcm.googleapis.com/v1/projects/kyvala-45525/messages:send");
curl_setopt($ch, CURLOPT_HTTPHEADER,[
'Content-Type: application/json',
'Authorization: ' . 'Bearer ' .$accessToken
]);
//"uploads/kyvala/fichier/".$key->getLogo() logo-sans-fond.png
////"image":"http://poc.kyvala.com/uploads/TOKEN/Token-logo-avec-fond.png"
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
"message": {
"token":"'.$user_notification_token.'",
"notification": {
"title":"'.$title.'",
"body":"'.$message.'",
"image":"http://poc.kyvala.com/uploads/Logo/logo-sans-fond.png"
}
}
}');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
$response = curl_exec($ch);
if (curl_errno($ch))
{
print "Error: " . curl_error($ch);
$fs->appendToFile('EventLogNotification.txt', "\r\n ".date("d-m-Y H:i:s")." : deviceToken :".$user_notification_token.", Title: ".$title.", Notification: ".$message.", Error: ".json_encode(curl_error($ch)));
exit();
}else
{
$json = json_decode($response, true);
}
// Show me the result
curl_close($ch);
//dump($season_data);
$fs->appendToFile('EventLogNotification.txt', "\r\n ".date("d-m-Y H:i:s")." : DeviceToken :".$user_notification_token.", Title: ".$title.", Notification: ".$message.", Retours: ".json_encode($response));
// return a JSON object to caller
return $json;
}
// @Route("/", name="app_person_bio_verification_index", methods={"GET"})
/*
public function index(PersonBioVerificationRepository $personBioVerificationRepository): Response
{
return $this->render('person_bio_verification/index.html.twig', [
'person_bio_verifications' => $personBioVerificationRepository->findAll(),
]);
}
*/
//@Route("/new", name="app_person_bio_verification_new", methods={"GET", "POST"})
/*
public function new(Request $request, PersonBioVerificationRepository $personBioVerificationRepository): Response
{
$personBioVerification = new PersonBioVerification();
$form = $this->createForm(PersonBioVerificationType::class, $personBioVerification);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$personBioVerificationRepository->add($personBioVerification, true);
return $this->redirectToRoute('app_person_bio_verification_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('person_bio_verification/new.html.twig', [
'person_bio_verification' => $personBioVerification,
'form' => $form,
]);
}*/
// @Route("/{id}", name="app_person_bio_verification_show", methods={"GET"})
/*
public function show(PersonBioVerification $personBioVerification): Response
{
return $this->render('person_bio_verification/show.html.twig', [
'person_bio_verification' => $personBioVerification,
]);
}
*/
// @Route("/{id}/edit", name="app_person_bio_verification_edit", methods={"GET", "POST"})
/*
public function edit(Request $request, PersonBioVerification $personBioVerification, PersonBioVerificationRepository $personBioVerificationRepository): Response
{
$form = $this->createForm(PersonBioVerificationType::class, $personBioVerification);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$personBioVerificationRepository->add($personBioVerification, true);
return $this->redirectToRoute('app_person_bio_verification_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('person_bio_verification/edit.html.twig', [
'person_bio_verification' => $personBioVerification,
'form' => $form,
]);
}
*/
// @Route("/{id}", name="app_person_bio_verification_delete", methods={"POST"})
/*
public function delete(Request $request, PersonBioVerification $personBioVerification, PersonBioVerificationRepository $personBioVerificationRepository): Response
{
if ($this->isCsrfTokenValid('delete'.$personBioVerification->getId(), $request->request->get('_token'))) {
$personBioVerificationRepository->remove($personBioVerification, true);
}
return $this->redirectToRoute('app_person_bio_verification_index', [], Response::HTTP_SEE_OTHER);
}
*/
}