src/Controller/DefaultController.php line 31

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Contrat;
  4. use App\Entity\Harpe;
  5. //use App\Entity\RetourBanque;
  6. use App\Entity\RetourPaiement;
  7. //use App\Monetico\HmacComputer;
  8. use App\Utility\Encryptor;
  9. //use App\Utility\PaypalExpress;
  10. use phpDocumentor\Reflection\Types\This;
  11. use Psr\Log\LoggerInterface;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\HttpFoundation\JsonResponse;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\Mime\Message;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use App\Entity\User;
  19. use App\Form\UserType;
  20. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  21. use Symfony\Component\Mailer\MailerInterface;
  22. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  23. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  24. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  25. class DefaultController extends AbstractController
  26. {
  27.     #[Route('/'name'default')]
  28.     public function index(Request $request): Response
  29.     {
  30.         $user = new User();
  31.         //dd($user);
  32.         $form $this->createForm(UserType::class, $user, ['action' => $this->generateUrl('user_new')]);
  33.         $form->handleRequest($request);
  34.         return $this->render('user/new.html.twig', [
  35.             'user' => $user,
  36.             'form' => $form->createView(),
  37.             'page_title' => 'Les Harpes Camac - LocaConfiance'
  38.         ]);
  39.     }
  40.     #[Route('/attente-confirmation'name'attente_confirmation'methods: ['GET'])]
  41.     public function waitForUserConfirmation(Request $request) {
  42.         return $this->render('user/attente_confirmation.html.twig', [
  43.             'page_title' => 'Les Harpes Camac - LocaConfiance'
  44.         ]);
  45.     }
  46.     #[Route('/confirmation-email'name'confirmation_email'methods: ['GET'])]
  47.     public function confirmationEmail(Request $requestMailerInterface $mailer) {
  48.         if($request->query->has('usr')) {
  49.             $user $this->getDoctrine()->getRepository(User::class)->findOneByToken($request->query->get('usr'));
  50.             if(!empty($user)) {
  51.                 // Le user est bien authentifié. On recréee un token définitif
  52.                 $user_token sha1($user->getPrenom() . $user->getNom() . $user->getEmail()) . '_' sha1(uniqid());
  53.                 $em $this->getDoctrine()->getManager();
  54.                 $user->setToken($user_token);
  55.                 $em->persist($user);
  56.                 $em->flush();
  57.                 $url_connexion $this->generateUrl('harpe_new', ['usr' => $user_token], UrlGeneratorInterface::ABSOLUTE_URL);
  58.                 $email = (new TemplatedEmail())->from($this->getParameter('camac.senderEmail'))
  59.                     ->to($user->getEmail())
  60.                     ->subject('Harpes Camac : votre lien de connexion')
  61.                     ->htmlTemplate('emails/user_link_email.html.twig')
  62.                     ->context([ 'user' => $user'url_connexion' => $url_connexion ]);
  63.                 $mailer->send($email);
  64.                 return $this->redirectToRoute('harpe_new', ['usr' => $user_token]);
  65.             }
  66.         }
  67.         return $this->redirectToRoute('default');
  68.     }
  69.     #[Route('/telechargement-fichier'name'download_file'methods: ['GET'])]
  70.     public function serveFile(Request $request){
  71.         if($request->query->has('inst') and $request->query->has('file') && $request->query->has('usr')) {
  72.             $user $this->getDoctrine()->getRepository(User::class)->findOneByToken($request->query->get('usr'));
  73.             if(!empty($user)) {
  74.                 $user_directory $this->getParameter('camac.upload_dir') . '/' 'harpe_' $request->query->get('inst');
  75.                 if (is_dir($user_directory)) {
  76.                     $current_harpe $this->getDoctrine()->getRepository(Harpe::class)->find(intval($request->query->get('inst')));
  77.                     if(!empty($current_harpe)) {
  78.                         if (!empty($current_harpe) && $current_harpe->getUser() != $user) {
  79.                             $this->addFlash('danger'"Opération non autorisée.");
  80.                             return $this->redirectToRoute('default');
  81.                         }
  82.                         $file $user_directory '/' $request->query->get('file');
  83.                         $response = new BinaryFileResponse($file);
  84.                         if (strpos($request->query->get('file'), '.pdf') != -1$content_type 'application/pdf';
  85.                         elseif (strpos($request->query->get('file'), '.jpg') != -|| strpos($request->query->get('file'), '.jpeg') != -1$content_type 'image/jpeg';
  86.                         elseif (strpos($request->query->get('file'), '.gif') != -1$content_type 'image/gif';
  87.                         elseif (strpos($request->query->get('file'), '.png') != -1$content_type 'image/png';
  88.                         $response->headers->set('Content-Type'$content_type);
  89.                         $response->setContentDisposition(
  90.                             ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  91.                             $request->query->get('file')
  92.                         );
  93.                         return $response;
  94.                     }
  95.                     else {
  96.                         $this->addFlash('danger','Harpe non trouvée.');
  97.                         return $this->redirectToRoute('default');
  98.                     }
  99.                 }
  100.                 else {
  101.                     $this->addFlash('danger','User dir non trouvé.');
  102.                     return $this->redirectToRoute('default');
  103.                 }
  104.             }
  105.             else {
  106.                 $this->addFlash('danger''User non trouvé.');
  107.                 return $this->redirectToRoute('default');
  108.             }
  109.         }
  110.         else return $this->redirectToRoute('default');
  111.     }
  112.     /**
  113.      * //Route définie dans routes.yaml
  114.      * @param Request $request
  115.      */
  116.     public function confirmationSignature(Request $request){
  117.         //dump($request);exit();
  118.         if($request->query->has('event')) {
  119.             if($request->query->has('usr')) {
  120.                 $user $this->getDoctrine()->getRepository(User::class)->findOneByToken($request->query->get('usr'));
  121.                 if(!empty($user)) {
  122.                     $docusign_result $request->query->get('event');
  123.                     if($docusign_result == 'signing_complete') {
  124.                         // Le contrat a été signé
  125.                         $user_harpes $this->getDoctrine()->getRepository(Harpe::class)->getCurrentHarpe($user);
  126.                         if(!empty($user_harpes)) {
  127.                             $current_harpe $user_harpes[0];
  128.                             $current_contract $this->getDoctrine()->getRepository(Contrat::class)->findOneByHarpe($current_harpe->getId());
  129.                             if(!empty($current_contract)) {
  130.                                 $current_contract->setDocusignResult($docusign_result)
  131.                                     ->setDocusignDateSignature(new \DateTime('NOW'));
  132.                                 $em $this->getDoctrine()->getManager();
  133.                                 $em->persist($current_contract);
  134.                                 $em->flush();
  135.                                 $this->addFlash('success'"La signature de votre document a été prise en compte.");
  136.                                 return $this->redirectToRoute('paiement', ['usr' => $user->getToken()]);
  137.                             }
  138.                         }
  139.                     }
  140.                     else {
  141.                         // Le contrat a été refusé par le client ou un autre problème est survenu
  142.                         // On stocke les données en base
  143.                         $user_harpes $this->getDoctrine()->getRepository(Harpe::class)->getCurrentHarpe($user);
  144.                         if(!empty($user_harpes)) {
  145.                             $current_harpe $user_harpes[0];
  146.                             $current_contract $this->getDoctrine()->getRepository(Contrat::class)->findOneByHarpe($current_harpe->getId());
  147.                             if(!empty($current_contract)) {
  148.                                 $current_contract->setDocusignResult($docusign_result)
  149.                                     ->setDocusignDateSignature(new \DateTime('NOW'));
  150.                                 $em $this->getDoctrine()->getManager();
  151.                                 $em->persist($current_contract);
  152.                                 $em->flush();
  153.                                 $this->addFlash('danger''Problème lors de la signature de votre contrat.');
  154.                                 return $this->redirectToRoute('harpe_new', ['usr' => $user->getToken()]);
  155.                             }
  156.                         }
  157.                     }
  158.                 }
  159.             }
  160.             else {
  161.                 // Un problème est survenu, on n'a pas de retour correct de Docusign
  162.                 $this->addFlash('danger'"Un problème est survenu lors de la signature de votre contrat.\nMerci de prendre contact avec votre magasin Camac.");
  163.                 return $this->redirectToRoute('default');
  164.             }
  165.         }
  166.         else {
  167.             // Un problème est survenu, on n'a pas de retour correct de Docusign
  168.             $this->addFlash('danger'"Un problème est survenu lors de la signature de votre contrat.\nMerci de prendre contact avec votre magasin Camac.");
  169.             return $this->redirectToRoute('default');
  170.         }
  171.     }
  172.     #[Route('/retour-paiement'name'retour_paiement'methods: ['GET''POST'])]
  173.     public function retourPaiement(Request $requestLoggerInterface $logger) {
  174.         // 'PBX_RETOUR' => 'id:R;mont:M;dt:Q;trans:S;aut:A;err:E;', // paramètres retournés par Paybox
  175.         $receivedData $request->query->all();
  176.         $logger->debug(json_encode($receivedData));
  177.         // on laisse passer que Paybox
  178.         if ( !in_array($request->getClientIp(), [
  179.             '195.25.7.147','195.101.99.76','194.2.160.85',
  180.             '194.2.122.190','195.25.67.22','195.25.67.12',
  181.             ])
  182.         ) {
  183.             return new JsonResponse('not authorized'500);
  184.         }
  185.         if (array_key_exists("id"$receivedData) && array_key_exists("err"$receivedData) && array_key_exists("trans"$receivedData)
  186.                 && array_key_exists("aut"$receivedData) && array_key_exists("dt"$receivedData) ) {
  187. /*
  188.             $receivedSeal = $receivedData['MAC'];
  189.             unset($receivedData['MAC']); // removes the MAC field itself
  190.             $isSealValidated = (new HmacComputer())->validateSeal($receivedData, $this->getParameter('monetico.cle_mac'), $receivedSeal);
  191.             if ($isSealValidated) {
  192.                 $logger->info("Le sceau est correct !");
  193. */
  194. /*
  195.                 $isSandboxPayment = ($receivedData['aut'] === "XXXXXX"); // numéro d'autorisation en test : XXXXXX
  196.                 $isPaymentValidated = ($receivedData["err"] === '00000');
  197. */
  198.                 $received_ref explode('-',$receivedData['id']);
  199.                 $harpe_id = (int)str_replace('CAMAC'''$received_ref[0]);
  200.                 $em $this->getDoctrine()->getManager();
  201.                 $harpe $em->getRepository(Harpe::class)->findOneBy(['id' => $harpe_id]);
  202.                 if ($harpe instanceof Harpe) {
  203.                     $retourPaiement $em->getRepository(RetourPaiement::class)->findOneBy(['harpe' => $harpe]);
  204.                     if ($retourPaiement instanceof RetourPaiement) {
  205.                         $retoursBanque = (array) json_decode($retourPaiement->getRetourBanque(), true);
  206.                         $retoursBanque[] = json_encode($receivedDataJSON_FORCE_OBJECT);
  207.                         $retourPaiement->setDateHeureConfirm(\DateTime::createFromFormat('jmY H:i:s'$receivedData['dd'].' '.$receivedData['dt']))
  208.                                 ->setState($receivedData['err'])
  209.                                 ->setRetourBanque(json_encode(['retourBanque' => $retoursBanque'query' => $request->query->all()], JSON_OBJECT_AS_ARRAY))
  210.                                 ->setTransactionID($receivedData['trans']);
  211.                         $em->persist($retourPaiement);
  212.                         $em->flush();
  213.                         $logger->info("Data retour banque enregistré avec succès pour la harpe "$harpe->getId());
  214.                     }
  215.                     else {
  216.                         $logger->critical('Aucune demande de paiement en attente'$receivedData);
  217.                     }
  218.                 }
  219.                 else {
  220.                     $logger->critical('Harpe non trouvés après retour de la banque'$receivedData);
  221.                 }
  222.   /*          }
  223.             else {
  224.                 $logger->critical('Sceau non validé après retour de la banque', $receivedData);
  225.             }*/
  226.         }
  227.         return new JsonResponse(['status' => 'ok']);
  228.     }
  229.     /*
  230.      * @Route("/process-payment", name="process_payment", methods={"GET", "POST"})
  231.      * @param Request $request
  232.      * @param LoggerInterface $logger
  233.      * @return \Symfony\Component\HttpFoundation\RedirectResponse
  234.      */
  235.     /*public function processPayment(Request $request, LoggerInterface $logger) {
  236.         if(!empty($request->get('paymentID')) && !empty($request->get('token')) && !empty($request->get('payerID')) && !empty($request->get('usr_token')) && !empty($request->get('status')) ){
  237.             $paypal = new PaypalExpress($this->getParameter('paypal.env'), $this->getParameter('paypal.url'), $this->getParameter('paypal.client_id'), $this->getParameter('paypal.client_secret'));
  238.             $paymentCheck = $paypal->validate(trim($request->get('paymentID')), trim($request->get('token')), trim($request->get('payerID')), $request->get('usr_token'));
  239.             $logger->debug(json_encode($paymentCheck));
  240.             if($paymentCheck && $paymentCheck->state == 'approved') {
  241.                 $transaction_id = $paymentCheck->id;
  242.                 $state = $paymentCheck->state;
  243.                 $payerID = $paymentCheck->payer->payer_info->payer_id;
  244.                 $paidAmount = $paymentCheck->transactions[0]->amount->details->subtotal;
  245.                 $user = $this->getDoctrine()->getRepository(User::class)->findOneByToken(trim($request->get('usr_token')));
  246.                 if (!empty($user)) {
  247.                     $user_harpes = $this->getDoctrine()->getRepository(Harpe::class)->getCurrentHarpe($user);
  248.                     if (!empty($user_harpes)) {
  249.                         $current_harpe = $user_harpes[0];
  250.                         $em = $this->getDoctrine()->getManager();
  251.                         $retour_paypal = new RetourPaypal();
  252.                         $retour_paypal->setHarpe($current_harpe)
  253.                             ->setDatePaiement(new \DateTime('now'))
  254.                             ->setPayerID($payerID)
  255.                             ->setPaymentID(trim($request->get('paymentID')))
  256.                             ->setAmount($paidAmount)
  257.                             ->setState($state)
  258.                             ->setTransactionID($transaction_id)
  259.                             ->setPaymentToken(trim($request->get('token')));
  260.                         $em->persist($retour_paypal);
  261.                         $em->flush();
  262.                         $request->getSession()->set('user', $user);
  263.                         $request->getSession()->set('current_harpe', $current_harpe);
  264.                         $request->getSession()->set('transaction_id', $transaction_id);
  265.                         $request->getSession()->set('retour_paypal', $retour_paypal);
  266.                         $logger->info("Data retour banque enregistré avec succès pour le user ". $user->getPrenom() .' '. $user->getNom());
  267.                         return $this->redirectToRoute('paiement_accepte', ['usr' => trim($request->get('usr_token'))]);
  268.                     }
  269.                 }
  270.             }
  271.             else {
  272.                 return $this->redirectToRoute('paiement_refuse', ['usr' => trim($request->get('usr_token'))]);
  273.             }
  274.         }
  275.         else {
  276.             $this->addFlash('danger', 'Aucun utilisateur ne correspond à votre requête.');
  277.             return $this->redirectToRoute('default');
  278.         }
  279.     }*/
  280.     #[Route('/process-ajax-payment'name'process_ajax_payment'methods: ['POST'])]
  281.     public function processAjaxPayment(Request $request){
  282.         $json = [];
  283.         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')) ){
  284.             if($request->request->get('status') == 'COMPLETED') {
  285.                 $user $this->getDoctrine()->getRepository(User::class)->findOneByToken(trim($request->request->get('usr_token')));
  286.                 if (!empty($user)) {
  287.                     $user_harpes $this->getDoctrine()->getRepository(Harpe::class)->getCurrentHarpe($user);
  288.                     if (!empty($user_harpes)) {
  289.                         $current_harpe $user_harpes[0];
  290.                         $em $this->getDoctrine()->getManager();
  291.                         $retour_paypal = new RetourPaypal();
  292.                         $retour_paypal->setHarpe($current_harpe)
  293.                             ->setDatePaiement(new \DateTime('now'))
  294.                             ->setPayerID(trim($request->request->get('payerID')))
  295.                             ->setPaymentID(trim($request->request->get('paymentID')))
  296.                             ->setAmount(trim($request->request->get('value')))
  297.                             ->setState(trim($request->request->get('status')))
  298.                             ->setTransactionID(trim($request->request->get('token')))
  299.                             ->setPaymentToken(trim($request->get('token')));
  300.                         $em->persist($retour_paypal);
  301.                         $em->flush();
  302.                         $request->getSession()->set('user'$user);
  303.                         $request->getSession()->set('current_harpe'$current_harpe);
  304.                         //$request->getSession()->set('transaction_id', $transaction_id);
  305.                         $request->getSession()->set('retour_paypal'$retour_paypal);
  306.                         //$logger->info("Data retour banque enregistré avec succès pour le user ". $user->getPrenom() .' '. $user->getNom());
  307.                         //return $this->redirectToRoute('paiement_accepte', ['usr' => trim($request->get('usr_token'))]);
  308.                         $json['status'] = 'storage_completed';
  309.                     }
  310.                 }
  311.             }
  312.         }
  313.         return new JsonResponse($json);
  314.     }
  315.     #[Route('/paiement-accepte'name'paiement_accepte'methods: ['GET'])]
  316.     public function paiementAccepte(Request $requestMailerInterface $mailerEncryptor $encryptor) {
  317.         // 'PBX_RETOUR' => 'id:R;mont:M;dt:Q;trans:S;aut:A;err:E;', // paramètres retournés par Paybox
  318.         $receivedData $request->query->all();
  319.         //dd($request->getSession()->has('user'), $request->getSession()->has('current_harpe'), $request, $receivedData);
  320.         $retourOk = ( array_key_exists("id"$receivedData) && array_key_exists("err"$receivedData) && array_key_exists("trans"$receivedData)
  321.                 && array_key_exists("aut"$receivedData) && array_key_exists("dt"$receivedData) );
  322.         if ( $retourOk) {
  323.             $received_ref explode('-',$receivedData['id']);
  324.             $harpe_id intval(str_replace('CAMAC'''$received_ref[0]));
  325.             $em $this->getDoctrine()->getManager();
  326.             $current_harpe $em->getRepository(Harpe::class)->findOneBy(['id' => $harpe_id]);
  327.             $user $current_harpe->getUser();
  328.             $current_contract $em->getRepository(Contrat::class)->findOneByHarpe($current_harpe->getId());
  329.             //$retour_paypal = $request->getSession()->get('retour_paypal');
  330.             if($current_harpe->getFichierAssurance() != null && $current_harpe->getTypeAssurance() == 'perso') {
  331.                 $fichier_assurance $current_harpe->getFichierAssurance();
  332.             }
  333.             $transaction_id $receivedData['trans'];
  334.             $template_vars = [
  335.                 'page_title' => 'Les Harpes Camac - LocaConfiance',
  336.                 'transaction_id' => $transaction_id,
  337.                 'user' => $user,
  338.                 'contrat' => $current_contract,
  339.                 'harpe' => $current_harpe
  340.             ];
  341.             $user_email_vars = [
  342.                 'user' => $user,
  343.                 'harpe' => $current_harpe,
  344.                 'transaction_id' => $transaction_id,
  345.                 'montant' => str_replace('.',',',(float)$receivedData['mont']/100),
  346.                 'iban' => $encryptor->decrypt($user->getIban(), true),
  347.                 'bic' => $encryptor->decrypt($user->getBic(), true),
  348.                 'banque' => $encryptor->decrypt($user->getBanque(), true)
  349.             ];
  350.             $user_email_vars['docusign_contrat'] = $this->generateUrl('download_file', ['inst' => $current_harpe->getId(), 'file' => $current_contract->getSignedPath(), 'usr' => $user->getToken()], UrlGeneratorInterface::ABSOLUTE_URL);
  351.             if(isset($fichier_assurance)) {
  352.                 $template_vars['fichier_assurance'] = $fichier_assurance;
  353.                 $user_email_vars['fichier_assurance'] = $this->generateUrl('download_file', ['inst' => $current_harpe->getId(), 'file' => $fichier_assurance'usr' => $user->getToken()], UrlGeneratorInterface::ABSOLUTE_URL);
  354.             }
  355.             //dd($request->getSession()->get('email_sent'));
  356.             if(!$request->getSession()->has('email_sent')) {
  357.                 $email = (new TemplatedEmail())->from($this->getParameter('camac.senderEmail'))
  358.                     ->to($user->getEmail())
  359.                     ->subject('Harpes Camac : Confirmation de paiement')
  360.                     ->htmlTemplate('emails/user_payment_email.html.twig')
  361.                     ->context($user_email_vars);
  362.                 $mailer->send($email);
  363.                 $email = (new TemplatedEmail())->from($this->getParameter('camac.senderEmail'))
  364.                     ->to($this->getParameter('camac.carbon_copy_address'))
  365.                     ->subject('Harpes Camac : un nouveau contrat de location vient d\'être signé.')
  366.                     ->htmlTemplate('emails/notification_payment_email.html.twig')
  367.                     ->context($user_email_vars);
  368.                 $mailer->send($email);
  369.                 $request->getSession()->set('email_sent'1);
  370.             }
  371.         }
  372.         else {
  373.             $this->addFlash('danger''Aucun utilisateur ne correspond à votre requête.');
  374.             return $this->redirectToRoute('default');
  375.         }
  376.         $template_vars = [
  377.             'page_title' => 'Les Harpes Camac - LocaConfiance',
  378.             'transaction_id' => $transaction_id,
  379.             'userToken' => $user->getToken(),
  380.             'contrat' => $current_contract->getSignedPath(),
  381.             'harpeId' => $current_harpe->getId(),
  382.             'fichier_assurance' => (isset($fichier_assurance)) ? $fichier_assurance null,
  383.         ];
  384.         return $this->redirectToRoute('contrat_ok', ['c'=>\base64_encode(json_encode($template_vars))] );
  385.     }
  386.     #[Route('/paiement-refuse'name'paiement_refuse'methods: ['GET'])]
  387.     public function paiementRefuse(Request $request) {
  388.         return $this->render('default/paiement_refuse.html.twig', [
  389.             'codeRetour' => $request->query->get('err'),
  390.             'page_title' => 'Les Harpes Camac - LocaConfiance'
  391.         ]);
  392.     }
  393.     #[Route('/paiement-annule'name'paiement_annule'methods: ['GET'])]
  394.     public function paiementAnnule(Request $request) {
  395.         return $this->render('default/paiement_refuse.html.twig', [
  396.             'page_title' => 'Les Harpes Camac - LocaConfiance'
  397.         ]);
  398.     }
  399.     #[Route('/contrat'name'contrat_ok'methods: ['GET'])]
  400.     public function confirmationContrat(Request $request) {
  401.         $what $request->get('c');
  402.         $template_vars json_decode(\base64_decode($what), true);
  403.         return $this->render('default/paiement_accepte.html.twig'$template_vars);
  404.     }
  405. }