<?php
namespace App\Controller;
use App\Entity\Voucher;
use App\Entity\VoucherTracker;
use App\Form\VoucherType;
use App\Helper\FileCrypt;
use App\Helper\Tools;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/voucher")
*/
class VoucherController extends AbstractController
{
/**
* @Route("/", name="app_voucher_index", methods={"GET"})
*/
public function index(EntityManagerInterface $entityManager): Response
{
$vouchers = $entityManager
->getRepository(Voucher::class)
->findBy(['status' => [Voucher::STATUS_NEW, Voucher::STATUS_NOT_EMPTY]]);
$allvouchers = $entityManager
->getRepository(Voucher::class)
->findAll();
return $this->render('voucher/index.html.twig', [
'vouchers' => $vouchers,
'allvouchers' => $allvouchers,
'voucherstrack' => $entityManager->getRepository(VoucherTracker::class)->findAll(),
'all' => false,
'pageParams' => [
'title' => 'Bons d\'achat actifs',
'domain' => 'voucher',
'breadcrumbs' => []
],
]);
}
/**
* @Route("/all", name="app_voucher_all", methods={"GET"})
*/
public function all(EntityManagerInterface $entityManager): Response
{
$vouchers = $entityManager->getRepository(Voucher::class)->findAll();
return $this->render('voucher/index.html.twig', [
'vouchers' => $vouchers,
'voucherstrack' => $entityManager->getRepository(VoucherTracker::class)->findAll(),
'all' => true,
'pageParams' => [
'title' => 'Tous les bons d\'achat',
'domain' => 'voucher',
'breadcrumbs' => []
],
]);
}
/**
* @Route("/new", name="app_voucher_new", methods={"GET", "POST"})
*/
public function new(Request $request, EntityManagerInterface $entityManager, FileCrypt $fileCrypt): Response
{
$voucher = new Voucher();
$plus6 = new \DateTime();
$plus6->modify('+6 months');
$voucher->setEndDate($plus6);
$form = $this->createForm(VoucherType::class, $voucher);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$uploadedFile = $form['onefile']->getData();
if ($uploadedFile) {
// crypt and move the file
$key = $this->getParameter('voucher_files_key');
$fileName = md5(uniqid()).'.'.$uploadedFile->guessExtension();
$documentsDir = $this->getParameter('voucher_files_directory');
if (!$fileCrypt->encrypt($uploadedFile->getPathname(), $documentsDir, $fileName, $key)) {
$this->get('session')->getFlashBag()->add('error', 'basic.error');
}
$voucher->setFilename($fileName);
}
$voucher->setAddDate(new \DateTime());
$voucher->setStatus(Voucher::STATUS_NEW);
$entityManager->persist($voucher);
$entityManager->flush();
return $this->redirectToRoute('app_voucher_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('voucher/new.html.twig', [
'voucher' => $voucher,
'form' => $form,
'pageParams' => [
'title' => 'Nouveau bon d\'achat',
'domain' => 'voucher',
'breadcrumbs' => ['Bons d\'achat' => 'app_voucher_index']
],
]);
}
/**
* @Route("/{id}", name="app_voucher_show", methods={"GET"})
*/
public function show(Voucher $voucher): Response
{
return $this->render('voucher/show.html.twig', [
'voucher' => $voucher,
'pageParams' => [
'title' => 'Bon d\'achat '.$voucher->getBrand(),
'domain' => 'voucher',
'breadcrumbs' => ['Bons d\'achat' => 'app_voucher_index']
],
]);
}
/**
* @Route("/activshare/{id}", name="app_voucher_activshare", methods={"GET"})
*/
public function activshare(Voucher $voucher, EntityManagerInterface $entityManager): Response
{
$voucher->setShareSlug(Tools::generateStrongPassword(64, false, 'ld'));
$entityManager->persist($voucher);
$entityManager->flush();
$this->get('session')->getFlashBag()->add('info', 'Bon d\'achat <b>'.$voucher->getBrand().' / '.$voucher->getVoucher().'</b> est maintenant partageable');
return $this->redirectToRoute('app_voucher_index', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/unactivshare/{id}", name="app_voucher_unactivshare", methods={"GET"})
*/
public function unactivshare(Voucher $voucher, EntityManagerInterface $entityManager): Response
{
$voucher->setShareSlug(null);
$entityManager->persist($voucher);
$entityManager->flush();
$this->get('session')->getFlashBag()->add('info', 'Bon d\'achat <b>'.$voucher->getBrand().' / '.$voucher->getVoucher().'</b> n\'est plus partageable');
return $this->redirectToRoute('app_voucher_index', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/{id}/edit", name="app_voucher_edit", methods={"GET", "POST"})
*/
public function edit(Request $request, Voucher $voucher, EntityManagerInterface $entityManager, FileCrypt $fileCrypt): Response
{
$form = $this->createForm(VoucherType::class, $voucher, ['edit' => true]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if (isset($form['onefile'])) {
$uploadedFile = $form['onefile']->getData();
if ($uploadedFile) {
// crypt and move the file
$key = $this->getParameter('voucher_files_key');
$fileName = md5(uniqid()).'.'.$uploadedFile->guessExtension();
$documentsDir = $this->getParameter('voucher_files_directory');
if (!$fileCrypt->encrypt($uploadedFile->getPathname(), $documentsDir, $fileName, $key)) {
$this->get('session')->getFlashBag()->add('error', 'basic.error');
}
$voucher->setFilename($fileName);
}
}
if ($voucher->getUsed() > 0 && $voucher->getUsed() < $voucher -> getMontant()) {
$voucher->setStatus(Voucher::STATUS_NOT_EMPTY);
$entityManager->persist($voucher);
}
$entityManager->flush();
$this->get('session')->getFlashBag()->add('info', 'Bon d\'achat <b>'.$voucher->getBrand().' / '.$voucher->getVoucher().'</b> a été mis à jour');
return $this->redirectToRoute('app_voucher_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('voucher/edit.html.twig', [
'voucher' => $voucher,
'form' => $form,
'pageParams' => [
'title' => 'Modifier bon d\'achat '.$voucher->getBrand(),
'domain' => 'voucher',
'breadcrumbs' => ['Bons d\'achat' => 'app_voucher_index']
],
]);
}
/**
* @Route("/archive/{id}", name="app_voucher_close", methods={"GET"})
*/
public function close(Voucher $voucher, EntityManagerInterface $entityManager)
{
$voucher->setShareSlug(null);
$voucher->setStatus(Voucher::STATUS_EMPTY);
$entityManager->persist($voucher);
$entityManager->flush();
$this->get('session')->getFlashBag()->add('info', 'Bon d\'achat <b>'.$voucher->getBrand().' / '.$voucher->getVoucher().'</b> a été archivé');
return $this->redirectToRoute('app_voucher_index', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/{id}", name="app_voucher_delete", methods={"POST"})
*/
public function delete(Request $request, Voucher $voucher, EntityManagerInterface $entityManager): Response
{
if ($this->isCsrfTokenValid('delete'.$voucher->getId(), $request->request->get('_token'))) {
$entityManager->remove($voucher);
$entityManager->flush();
$this->get('session')->getFlashBag()->add('info', 'Bon d\'achat <b>'.$voucher->getBrand().' / '.$voucher->getVoucher().'</b> a été supprimé');
}
return $this->redirectToRoute('app_voucher_index', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/download_file/{id}/{action?download}", name="app_voucher_download_file", methods={"GET"})
*/
public function downloadFile(Voucher $voucher, string $action = 'download', EntityManagerInterface $entityManager, FileCrypt $fileCrypt)
{
$key = $this->getParameter('voucher_files_key');
$documentsDir = $this->getParameter('voucher_files_directory');
$filePath = $documentsDir.'/'.$voucher->getFilename();
$fileContent = $fileCrypt->encodeThis(file_get_contents($filePath), 'd', $key);
$response = new Response($fileContent);
if ($action === 'download') {
$response->headers->set('Content-Type', 'application/octet-stream');
$response->headers->set('Content-Disposition', 'attachment; filename="' . $voucher->getBrand().'-'.$voucher->getMontant().'.pdf"');
} else {
$response->headers->set('Content-Type', 'application/pdf');
$response->headers->set('Content-Disposition', 'inline; filename="' . $voucher->getBrand().'-'.$voucher->getMontant().'.pdf"');
}
return $response;
}
/**
* @Route("/ignoretoggle/{id}/{ignore}", name="app_voucher_ignore")
*/
public function ignoreAlert(Voucher $voucher, $ignore, EntityManagerInterface $entityManager)
{
if($ignore == 1) {
$this->get('session')->getFlashBag()->add('info', $voucher->getBrand().' '.$voucher->getMontant().'€ <b>alerte ignorée</b>');
$voucher->setIgnored(1);
} else {
$this->get('session')->getFlashBag()->add('info', $voucher->getBrand().' '.$voucher->getMontant().'€ <b>alerte plus ignorée</b>');
$voucher->setIgnored(0);
}
$entityManager->persist($voucher);
$entityManager->flush();
return $this->redirectToRoute('app_voucher_index');
}
}