<?php
namespace App\Controller;
use App\Entity\Vehicule;
use App\Entity\Facture;
use App\Form\FactureType;
use App\Repository\FactureRepository;
use App\Repository\VehiculeRepository;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\String\Slugger\SluggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
/**
* @Route("/vehicule")
*/
class FactureController extends AbstractController
{
/**
* @Route("/facture/{vehicule_id}", name="app_facture", methods={"GET", "POST"})
*/
public function index(Request $request, FactureRepository $factureRepository, int $vehicule_id, SluggerInterface $slugger, VehiculeRepository $vehiculeRepository): Response
{
$facture = new Facture();
$repository = $this->getDoctrine()->getRepository(Vehicule::class);
$vehicule = $repository->findOneById($vehicule_id);
$factures = $vehicule->getFactures();
// dir de stockage
$factures_vehicules = $this->getParameter('factures_vehicules');
// types de factures
$factures_types = $this->getParameter('types_factures');
$types_factures = array_flip($factures_types);
array_splice($types_factures, 0, 1);
$form = $this->createForm(FactureType::class, $facture, [
'typesFactures' => $types_factures,
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
//$datas = $form->getData();
$facture = $form->get('filename')->getData();
$originalFilename = pathinfo($facture->getClientOriginalName(), PATHINFO_FILENAME);
// this is needed to safely include the file name as part of the URL
// slugger nettoie le nom et enleve l unicode
$safeFilename = $slugger->slug($originalFilename);
$newFilename = $safeFilename.'-'.uniqid().'.'.$facture->guessExtension();
// Move the file to the directory where factures are stored
try {
$facture->move($this->getParameter('factures_vehicules'), $newFilename);
} catch (FileException $e) {
// ... handle exception if something happens during file upload
$this->addFlash('warning', 'Impossible de copier le fichier : ' . $e->getMessage());
return $this->redirectToRoute('app_facture', array(
'vehicule_id' => $vehicule_id,
)
);
}
$facture = new Facture();
$facture->setFilename($newFilename);
$facture->setDate($form->get('date')->getData());
$facture->setObservations($form->get('observations')->getData());
$facture->setGarage($form->get('garage')->getData());
$facture->setMontant($form->get('montant')->getData());
$facture->setTypeFacture($form->get('type_facture')->getData());
$facture->setVehicule($vehicule);
$facture->setFiletype("");
try {
$factureRepository->add($facture, true);
$vehicule->setDateUpdate(new \DateTime());
$vehicule->setUser($this->getUser());
$vehiculeRepository->add($vehicule, true);
$this->addFlash('success', 'Facture correctement ajoutée');
} catch (\Exception $e) {
$this->addFlash('warning', 'Le téléchargement de la facture a échoué : ' . $e->getMessage());
}
return $this->redirectToRoute('app_facture', ['vehicule_id' => $vehicule_id], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('facture/index.html.twig', [
'facture' => $facture,
'vehicule_id' => $vehicule_id,
'form' => $form,
'vehicule' => $vehicule,
'controller_name' => 'facture',
'title' => 'Facture / Document',
'factures' => $factures,
'factures_types' => $factures_types,
]);
}
/**
* @Route("/pdf/{filePath}", name="app_show_facture")
*/
public function showFacture(string $filePath): BinaryFileResponse
{
$response = new BinaryFileResponse(
$this->getParameter('factures_vehicules') // related to project root dir
. '/'
. urldecode($filePath)
);
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_INLINE
);
return $response;
}
/**
* @Route("/facture/delete/{vehicule_id}/{id}", name="app_facture_delete", methods={"POST"})
*/
public function delete(Request $request, Facture $facture, int $vehicule_id, FactureRepository $factureRepository): Response
{
if ($this->isCsrfTokenValid('delete'.$facture->getId(), $request->request->get('_token'))) {
unlink($this->getParameter('factures_vehicules') . "/" . $facture->getFilename());
$factureRepository->remove($facture, true);
}
return $this->redirectToRoute('app_facture', ['vehicule_id' => $vehicule_id], Response::HTTP_SEE_OTHER);
}
}