<?php
namespace App\Controller;
use App\Entity\Contrat;
use App\Entity\Harpe;
//use App\Entity\RetourBanque;
use App\Entity\RetourPaiement;
//use App\Monetico\HmacComputer;
use App\Utility\Encryptor;
//use App\Utility\PaypalExpress;
use phpDocumentor\Reflection\Types\This;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mime\Message;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\User;
use App\Form\UserType;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
class DefaultController extends AbstractController
{
#[Route('/', name: 'default')]
public function index(Request $request): Response
{
$user = new User();
//dd($user);
$form = $this->createForm(UserType::class, $user, ['action' => $this->generateUrl('user_new')]);
$form->handleRequest($request);
return $this->render('user/new.html.twig', [
'user' => $user,
'form' => $form->createView(),
'page_title' => 'Les Harpes Camac - LocaConfiance'
]);
}
#[Route('/attente-confirmation', name: 'attente_confirmation', methods: ['GET'])]
public function waitForUserConfirmation(Request $request) {
return $this->render('user/attente_confirmation.html.twig', [
'page_title' => 'Les Harpes Camac - LocaConfiance'
]);
}
#[Route('/confirmation-email', name: 'confirmation_email', methods: ['GET'])]
public function confirmationEmail(Request $request, MailerInterface $mailer) {
if($request->query->has('usr')) {
$user = $this->getDoctrine()->getRepository(User::class)->findOneByToken($request->query->get('usr'));
if(!empty($user)) {
// Le user est bien authentifié. On recréee un token définitif
$user_token = sha1($user->getPrenom() . $user->getNom() . $user->getEmail()) . '_' . sha1(uniqid());
$em = $this->getDoctrine()->getManager();
$user->setToken($user_token);
$em->persist($user);
$em->flush();
$url_connexion = $this->generateUrl('harpe_new', ['usr' => $user_token], UrlGeneratorInterface::ABSOLUTE_URL);
$email = (new TemplatedEmail())->from($this->getParameter('camac.senderEmail'))
->to($user->getEmail())
->subject('Harpes Camac : votre lien de connexion')
->htmlTemplate('emails/user_link_email.html.twig')
->context([ 'user' => $user, 'url_connexion' => $url_connexion ]);
$mailer->send($email);
return $this->redirectToRoute('harpe_new', ['usr' => $user_token]);
}
}
return $this->redirectToRoute('default');
}
#[Route('/telechargement-fichier', name: 'download_file', methods: ['GET'])]
public function serveFile(Request $request){
if($request->query->has('inst') and $request->query->has('file') && $request->query->has('usr')) {
$user = $this->getDoctrine()->getRepository(User::class)->findOneByToken($request->query->get('usr'));
if(!empty($user)) {
$user_directory = $this->getParameter('camac.upload_dir') . '/' . 'harpe_' . $request->query->get('inst');
if (is_dir($user_directory)) {
$current_harpe = $this->getDoctrine()->getRepository(Harpe::class)->find(intval($request->query->get('inst')));
if(!empty($current_harpe)) {
if (!empty($current_harpe) && $current_harpe->getUser() != $user) {
$this->addFlash('danger', "Opération non autorisée.");
return $this->redirectToRoute('default');
}
$file = $user_directory . '/' . $request->query->get('file');
$response = new BinaryFileResponse($file);
if (strpos($request->query->get('file'), '.pdf') != -1) $content_type = 'application/pdf';
elseif (strpos($request->query->get('file'), '.jpg') != -1 || strpos($request->query->get('file'), '.jpeg') != -1) $content_type = 'image/jpeg';
elseif (strpos($request->query->get('file'), '.gif') != -1) $content_type = 'image/gif';
elseif (strpos($request->query->get('file'), '.png') != -1) $content_type = 'image/png';
$response->headers->set('Content-Type', $content_type);
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$request->query->get('file')
);
return $response;
}
else {
$this->addFlash('danger','Harpe non trouvée.');
return $this->redirectToRoute('default');
}
}
else {
$this->addFlash('danger','User dir non trouvé.');
return $this->redirectToRoute('default');
}
}
else {
$this->addFlash('danger', 'User non trouvé.');
return $this->redirectToRoute('default');
}
}
else return $this->redirectToRoute('default');
}
/**
* //Route définie dans routes.yaml
* @param Request $request
*/
public function confirmationSignature(Request $request){
//dump($request);exit();
if($request->query->has('event')) {
if($request->query->has('usr')) {
$user = $this->getDoctrine()->getRepository(User::class)->findOneByToken($request->query->get('usr'));
if(!empty($user)) {
$docusign_result = $request->query->get('event');
if($docusign_result == 'signing_complete') {
// Le contrat a été signé
$user_harpes = $this->getDoctrine()->getRepository(Harpe::class)->getCurrentHarpe($user);
if(!empty($user_harpes)) {
$current_harpe = $user_harpes[0];
$current_contract = $this->getDoctrine()->getRepository(Contrat::class)->findOneByHarpe($current_harpe->getId());
if(!empty($current_contract)) {
$current_contract->setDocusignResult($docusign_result)
->setDocusignDateSignature(new \DateTime('NOW'));
$em = $this->getDoctrine()->getManager();
$em->persist($current_contract);
$em->flush();
$this->addFlash('success', "La signature de votre document a été prise en compte.");
return $this->redirectToRoute('paiement', ['usr' => $user->getToken()]);
}
}
}
else {
// Le contrat a été refusé par le client ou un autre problème est survenu
// On stocke les données en base
$user_harpes = $this->getDoctrine()->getRepository(Harpe::class)->getCurrentHarpe($user);
if(!empty($user_harpes)) {
$current_harpe = $user_harpes[0];
$current_contract = $this->getDoctrine()->getRepository(Contrat::class)->findOneByHarpe($current_harpe->getId());
if(!empty($current_contract)) {
$current_contract->setDocusignResult($docusign_result)
->setDocusignDateSignature(new \DateTime('NOW'));
$em = $this->getDoctrine()->getManager();
$em->persist($current_contract);
$em->flush();
$this->addFlash('danger', 'Problème lors de la signature de votre contrat.');
return $this->redirectToRoute('harpe_new', ['usr' => $user->getToken()]);
}
}
}
}
}
else {
// Un problème est survenu, on n'a pas de retour correct de Docusign
$this->addFlash('danger', "Un problème est survenu lors de la signature de votre contrat.\nMerci de prendre contact avec votre magasin Camac.");
return $this->redirectToRoute('default');
}
}
else {
// Un problème est survenu, on n'a pas de retour correct de Docusign
$this->addFlash('danger', "Un problème est survenu lors de la signature de votre contrat.\nMerci de prendre contact avec votre magasin Camac.");
return $this->redirectToRoute('default');
}
}
#[Route('/retour-paiement', name: 'retour_paiement', methods: ['GET', 'POST'])]
public function retourPaiement(Request $request, LoggerInterface $logger) {
// 'PBX_RETOUR' => 'id:R;mont:M;dt:Q;trans:S;aut:A;err:E;', // paramètres retournés par Paybox
$receivedData = $request->query->all();
$logger->debug(json_encode($receivedData));
// on laisse passer que Paybox
if ( !in_array($request->getClientIp(), [
'195.25.7.147','195.101.99.76','194.2.160.85',
'194.2.122.190','195.25.67.22','195.25.67.12',
])
) {
return new JsonResponse('not authorized', 500);
}
if (array_key_exists("id", $receivedData) && array_key_exists("err", $receivedData) && array_key_exists("trans", $receivedData)
&& array_key_exists("aut", $receivedData) && array_key_exists("dt", $receivedData) ) {
/*
$receivedSeal = $receivedData['MAC'];
unset($receivedData['MAC']); // removes the MAC field itself
$isSealValidated = (new HmacComputer())->validateSeal($receivedData, $this->getParameter('monetico.cle_mac'), $receivedSeal);
if ($isSealValidated) {
$logger->info("Le sceau est correct !");
*/
/*
$isSandboxPayment = ($receivedData['aut'] === "XXXXXX"); // numéro d'autorisation en test : XXXXXX
$isPaymentValidated = ($receivedData["err"] === '00000');
*/
$received_ref = explode('-',$receivedData['id']);
$harpe_id = (int)str_replace('CAMAC', '', $received_ref[0]);
$em = $this->getDoctrine()->getManager();
$harpe = $em->getRepository(Harpe::class)->findOneBy(['id' => $harpe_id]);
if ($harpe instanceof Harpe) {
$retourPaiement = $em->getRepository(RetourPaiement::class)->findOneBy(['harpe' => $harpe]);
if ($retourPaiement instanceof RetourPaiement) {
$retoursBanque = (array) json_decode($retourPaiement->getRetourBanque(), true);
$retoursBanque[] = json_encode($receivedData, JSON_FORCE_OBJECT);
$retourPaiement->setDateHeureConfirm(\DateTime::createFromFormat('jmY H:i:s', $receivedData['dd'].' '.$receivedData['dt']))
->setState($receivedData['err'])
->setRetourBanque(json_encode(['retourBanque' => $retoursBanque, 'query' => $request->query->all()], JSON_OBJECT_AS_ARRAY))
->setTransactionID($receivedData['trans']);
$em->persist($retourPaiement);
$em->flush();
$logger->info("Data retour banque enregistré avec succès pour la harpe ". $harpe->getId());
}
else {
$logger->critical('Aucune demande de paiement en attente', $receivedData);
}
}
else {
$logger->critical('Harpe non trouvés après retour de la banque', $receivedData);
}
/* }
else {
$logger->critical('Sceau non validé après retour de la banque', $receivedData);
}*/
}
return new JsonResponse(['status' => 'ok']);
}
/*
* @Route("/process-payment", name="process_payment", methods={"GET", "POST"})
* @param Request $request
* @param LoggerInterface $logger
* @return \Symfony\Component\HttpFoundation\RedirectResponse
*/
/*public function processPayment(Request $request, LoggerInterface $logger) {
if(!empty($request->get('paymentID')) && !empty($request->get('token')) && !empty($request->get('payerID')) && !empty($request->get('usr_token')) && !empty($request->get('status')) ){
$paypal = new PaypalExpress($this->getParameter('paypal.env'), $this->getParameter('paypal.url'), $this->getParameter('paypal.client_id'), $this->getParameter('paypal.client_secret'));
$paymentCheck = $paypal->validate(trim($request->get('paymentID')), trim($request->get('token')), trim($request->get('payerID')), $request->get('usr_token'));
$logger->debug(json_encode($paymentCheck));
if($paymentCheck && $paymentCheck->state == 'approved') {
$transaction_id = $paymentCheck->id;
$state = $paymentCheck->state;
$payerID = $paymentCheck->payer->payer_info->payer_id;
$paidAmount = $paymentCheck->transactions[0]->amount->details->subtotal;
$user = $this->getDoctrine()->getRepository(User::class)->findOneByToken(trim($request->get('usr_token')));
if (!empty($user)) {
$user_harpes = $this->getDoctrine()->getRepository(Harpe::class)->getCurrentHarpe($user);
if (!empty($user_harpes)) {
$current_harpe = $user_harpes[0];
$em = $this->getDoctrine()->getManager();
$retour_paypal = new RetourPaypal();
$retour_paypal->setHarpe($current_harpe)
->setDatePaiement(new \DateTime('now'))
->setPayerID($payerID)
->setPaymentID(trim($request->get('paymentID')))
->setAmount($paidAmount)
->setState($state)
->setTransactionID($transaction_id)
->setPaymentToken(trim($request->get('token')));
$em->persist($retour_paypal);
$em->flush();
$request->getSession()->set('user', $user);
$request->getSession()->set('current_harpe', $current_harpe);
$request->getSession()->set('transaction_id', $transaction_id);
$request->getSession()->set('retour_paypal', $retour_paypal);
$logger->info("Data retour banque enregistré avec succès pour le user ". $user->getPrenom() .' '. $user->getNom());
return $this->redirectToRoute('paiement_accepte', ['usr' => trim($request->get('usr_token'))]);
}
}
}
else {
return $this->redirectToRoute('paiement_refuse', ['usr' => trim($request->get('usr_token'))]);
}
}
else {
$this->addFlash('danger', 'Aucun utilisateur ne correspond à votre requête.');
return $this->redirectToRoute('default');
}
}*/
#[Route('/process-ajax-payment', name: 'process_ajax_payment', methods: ['POST'])]
public function processAjaxPayment(Request $request){
$json = [];
if(!empty($request->request->get('paymentID')) && !empty($request->request->get('token')) && !empty($request->request->get('payerID')) && !empty($request->request->get('usr_token')) && !empty($request->request->get('status')) ){
if($request->request->get('status') == 'COMPLETED') {
$user = $this->getDoctrine()->getRepository(User::class)->findOneByToken(trim($request->request->get('usr_token')));
if (!empty($user)) {
$user_harpes = $this->getDoctrine()->getRepository(Harpe::class)->getCurrentHarpe($user);
if (!empty($user_harpes)) {
$current_harpe = $user_harpes[0];
$em = $this->getDoctrine()->getManager();
$retour_paypal = new RetourPaypal();
$retour_paypal->setHarpe($current_harpe)
->setDatePaiement(new \DateTime('now'))
->setPayerID(trim($request->request->get('payerID')))
->setPaymentID(trim($request->request->get('paymentID')))
->setAmount(trim($request->request->get('value')))
->setState(trim($request->request->get('status')))
->setTransactionID(trim($request->request->get('token')))
->setPaymentToken(trim($request->get('token')));
$em->persist($retour_paypal);
$em->flush();
$request->getSession()->set('user', $user);
$request->getSession()->set('current_harpe', $current_harpe);
//$request->getSession()->set('transaction_id', $transaction_id);
$request->getSession()->set('retour_paypal', $retour_paypal);
//$logger->info("Data retour banque enregistré avec succès pour le user ". $user->getPrenom() .' '. $user->getNom());
//return $this->redirectToRoute('paiement_accepte', ['usr' => trim($request->get('usr_token'))]);
$json['status'] = 'storage_completed';
}
}
}
}
return new JsonResponse($json);
}
#[Route('/paiement-accepte', name: 'paiement_accepte', methods: ['GET'])]
public function paiementAccepte(Request $request, MailerInterface $mailer, Encryptor $encryptor) {
// 'PBX_RETOUR' => 'id:R;mont:M;dt:Q;trans:S;aut:A;err:E;', // paramètres retournés par Paybox
$receivedData = $request->query->all();
//dd($request->getSession()->has('user'), $request->getSession()->has('current_harpe'), $request, $receivedData);
$retourOk = ( array_key_exists("id", $receivedData) && array_key_exists("err", $receivedData) && array_key_exists("trans", $receivedData)
&& array_key_exists("aut", $receivedData) && array_key_exists("dt", $receivedData) );
if ( $retourOk) {
$received_ref = explode('-',$receivedData['id']);
$harpe_id = intval(str_replace('CAMAC', '', $received_ref[0]));
$em = $this->getDoctrine()->getManager();
$current_harpe = $em->getRepository(Harpe::class)->findOneBy(['id' => $harpe_id]);
$user = $current_harpe->getUser();
$current_contract = $em->getRepository(Contrat::class)->findOneByHarpe($current_harpe->getId());
//$retour_paypal = $request->getSession()->get('retour_paypal');
if($current_harpe->getFichierAssurance() != null && $current_harpe->getTypeAssurance() == 'perso') {
$fichier_assurance = $current_harpe->getFichierAssurance();
}
$transaction_id = $receivedData['trans'];
$template_vars = [
'page_title' => 'Les Harpes Camac - LocaConfiance',
'transaction_id' => $transaction_id,
'user' => $user,
'contrat' => $current_contract,
'harpe' => $current_harpe
];
$user_email_vars = [
'user' => $user,
'harpe' => $current_harpe,
'transaction_id' => $transaction_id,
'montant' => str_replace('.',',',(float)$receivedData['mont']/100),
'iban' => $encryptor->decrypt($user->getIban(), true),
'bic' => $encryptor->decrypt($user->getBic(), true),
'banque' => $encryptor->decrypt($user->getBanque(), true)
];
$user_email_vars['docusign_contrat'] = $this->generateUrl('download_file', ['inst' => $current_harpe->getId(), 'file' => $current_contract->getSignedPath(), 'usr' => $user->getToken()], UrlGeneratorInterface::ABSOLUTE_URL);
if(isset($fichier_assurance)) {
$template_vars['fichier_assurance'] = $fichier_assurance;
$user_email_vars['fichier_assurance'] = $this->generateUrl('download_file', ['inst' => $current_harpe->getId(), 'file' => $fichier_assurance, 'usr' => $user->getToken()], UrlGeneratorInterface::ABSOLUTE_URL);
}
//dd($request->getSession()->get('email_sent'));
if(!$request->getSession()->has('email_sent')) {
$email = (new TemplatedEmail())->from($this->getParameter('camac.senderEmail'))
->to($user->getEmail())
->subject('Harpes Camac : Confirmation de paiement')
->htmlTemplate('emails/user_payment_email.html.twig')
->context($user_email_vars);
$mailer->send($email);
$email = (new TemplatedEmail())->from($this->getParameter('camac.senderEmail'))
->to($this->getParameter('camac.carbon_copy_address'))
->subject('Harpes Camac : un nouveau contrat de location vient d\'être signé.')
->htmlTemplate('emails/notification_payment_email.html.twig')
->context($user_email_vars);
$mailer->send($email);
$request->getSession()->set('email_sent', 1);
}
}
else {
$this->addFlash('danger', 'Aucun utilisateur ne correspond à votre requête.');
return $this->redirectToRoute('default');
}
$template_vars = [
'page_title' => 'Les Harpes Camac - LocaConfiance',
'transaction_id' => $transaction_id,
'userToken' => $user->getToken(),
'contrat' => $current_contract->getSignedPath(),
'harpeId' => $current_harpe->getId(),
'fichier_assurance' => (isset($fichier_assurance)) ? $fichier_assurance : null,
];
return $this->redirectToRoute('contrat_ok', ['c'=>\base64_encode(json_encode($template_vars))] );
}
#[Route('/paiement-refuse', name: 'paiement_refuse', methods: ['GET'])]
public function paiementRefuse(Request $request) {
return $this->render('default/paiement_refuse.html.twig', [
'codeRetour' => $request->query->get('err'),
'page_title' => 'Les Harpes Camac - LocaConfiance'
]);
}
#[Route('/paiement-annule', name: 'paiement_annule', methods: ['GET'])]
public function paiementAnnule(Request $request) {
return $this->render('default/paiement_refuse.html.twig', [
'page_title' => 'Les Harpes Camac - LocaConfiance'
]);
}
#[Route('/contrat', name: 'contrat_ok', methods: ['GET'])]
public function confirmationContrat(Request $request) {
$what = $request->get('c');
$template_vars = json_decode(\base64_decode($what), true);
return $this->render('default/paiement_accepte.html.twig', $template_vars);
}
}