<?php
namespace App\Controller;
use App\Entity\CarrossPageConfig;
use App\Entity\Contrat;
use App\Entity\MaZonePageConfig;
use App\Entity\Metier;
use App\Entity\Modele;
use App\Entity\PhotoPageConfig;
use App\Entity\Reservation;
use App\Entity\TransfoPageConfig;
use App\Entity\TypeTransformation;
use App\Entity\User;
use App\Form\EmailProduitType;
use Proxies\__CG__\App\Entity\Concession;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use App\Entity\FicheProduit;
use App\Entity\Carrossier;
use Doctrine\Persistence\ManagerRegistry;
use Knp\Component\Pager\PaginatorInterface;
class DefaultController extends AbstractController
{
private $passwordHasher;
public function __construct(UserPasswordHasherInterface $passwordHasher)
{
$this->passwordHasher = $passwordHasher;
}
/**
* @Route("/", name="homepage")
*/
public function index(Request $request, ManagerRegistry $registry, PaginatorInterface $paginator)
{
if (!$this->getUser()->getValidPassword()) {
return $this->redirectToRoute('change_password');
}
$produitsPage = $registry->getRepository(FicheProduit::class)->findBy(['hide' => false]); // TT-386
$produitsPage = $paginator->paginate($produitsPage, $request->query->getInt('page', 1), 12);
$produitsPage->setCustomParameters(['align' => 'center','size' => 'small',]);
$modelesId = $typeTransfosId = $metierId = $carrossiersId = null;
$pageConfig = $registry->getRepository(TransfoPageConfig::class)->findAll();
$form = $this->createFormBuilder()
->add('modele', EntityType::class, [
'class' => Modele::class,
'choice_label' => 'name',
'placeholder' => 'Modèles',
'label' => false,
'required' => false,
'multiple' => true,
'attr' => ['data-placeholder' => 'Modèles']
])
->add('carrossier', EntityType::class, [
'class' => Carrossier::class,
'choice_label' => 'name',
'placeholder' => 'Carrossiers',
'label' => false,
'required' => false,
'multiple' => true,
'attr' => ['data-placeholder' => 'Carrossiers']
])
->add('type', EntityType::class, [
'class' => TypeTransformation::class,
'choice_label' => 'name',
'placeholder' => 'Type de transformations',
'label' => false,
'required' => false,
'multiple' => true,
'attr' => ['data-placeholder' => 'Type de transformations']
])
->add('metier', EntityType::class, [
'class' => Metier::class,
'choice_label' => 'name',
'placeholder' => 'Métiers',
'label' => false,
'required' => false,
'multiple' => true,
'attr' => ['data-placeholder' => 'Métiers']
])
/*->add('submit', SubmitType::class, [
'label' => 'Rechercher',
])*/
->getForm()
->handleRequest($request);
$search = $this->createFormBuilder()
->add('query', TextType::class, [
'label' => false,
'attr' => [
'class' => 'form-control',
'placeholder' => 'Rechercher'
]
])
->getForm();
$search->handleRequest($request);
if ($search->isSubmitted() && $search->isValid())
{
$query = $search->getData()['query'];
if($query) {
$produitsPage = $registry->getRepository(FicheProduit::class)->findByTitle($query);
$produitsPage = $paginator->paginate($produitsPage, $request->query->getInt('page', 1), 12);
$produitsPage->setCustomParameters(['align' => 'center','size' => 'small',]);
}
return $this->render('default/index.html.twig', [
'produitsPage' => $produitsPage,
'form' => $form->createView(),
'pageConfig' => $pageConfig,
'search' => $search->createView(),
'modelesId' => $modelesId,
'carrossiersId' => $carrossiersId,
'typeTransfosId' => $typeTransfosId,
'metierId' => $metierId,
]);
}
if ($request->getMethod() == 'POST')
{
$query = $request->request->get('query');
if($query !== "") {
$produitsPage = $registry->getRepository(FicheProduit::class)->findByTitle($query);
$produitsPage = $paginator->paginate($produitsPage, $request->query->getInt('page', 1), 12);
$produitsPage->setCustomParameters(['align' => 'center','size' => 'small',]);
return new JsonResponse([ 'view' => $this->renderView('default/dynamic.html.twig',
[
'produitsPage' => $produitsPage,
'search' => $search->createView(),
'form' => $form->createView(),
'pageConfig' => $pageConfig,
'modelesId' => "",
'carrossiersId' => "",
'typeTransfosId' => "",
'metierId' => ""
]
)]);
}
$modelesId = explode(',', $request->request->get('form_modele'));;
$carrossiersId = explode(',', $request->request->get('form_carrossier'));;
$typeTransfosId = explode(',', $request->request->get('form_type'));;
$metierId = explode(',', $request->request->get('form_metier'));
$modelesIds = $registry->getRepository(Modele::class)->findById($modelesId);
$carrossiersIds= $registry->getRepository(Carrossier::class)->findById($carrossiersId);
$typeTransfosIds = $registry->getRepository(TypeTransformation::class)->findById($typeTransfosId);
$metiersIds = $registry->getRepository(Metier::class)->findById($metierId);
$modeles = $registry->getRepository(FicheProduit::class)->findByModele($modelesId);
$carrossiers = $registry->getRepository(FicheProduit::class)->findByCarrossier($carrossiersId);
$typeTransfos = $registry->getRepository(FicheProduit::class)->findByType($typeTransfosId);
$metiers = $registry->getRepository(FicheProduit::class)->findByMetier($metierId);
$produitsPage = array_unique(array_merge($modeles, $carrossiers, $typeTransfos, $metiers));
if (!$modelesId[0] && !$carrossiersId[0] && !$typeTransfosId[0] && !$metierId[0]){
$produitsPage = $registry->getRepository(FicheProduit::class)->findBy(['hide' => false]); // TT-386
}
$produitsPage = $paginator->paginate($produitsPage, $request->query->getInt('page', 1), 12);
$produitsPage->setCustomParameters(['align' => 'center','size' => 'small',]);
return new JsonResponse([ 'view' => $this->renderView('default/dynamic.html.twig',
[
'produitsPage' => $produitsPage,
'search' => $search->createView(),
'form' => $form->createView(),
'pageConfig' => $pageConfig,
'modelesId' => $modelesIds,
'carrossiersId' => $carrossiersIds,
'typeTransfosId' => $typeTransfosIds,
'metierId' => $metiersIds
]
)]);
}
return $this->render('default/index.html.twig', [
'produitsPage' => $produitsPage,
'form' => $form->createView(),
'pageConfig' => $pageConfig,
'search' => $search->createView(),
'modelesId' => $modelesId,
'carrossiersId' => $carrossiersId,
'typeTransfosId' => $typeTransfosId,
'metierId' => $metierId,
]);
}
/**
* @Route("/phototheque", name="phototheque")
*/
public function indexPhoto(Request $request, ManagerRegistry $registry, PaginatorInterface $paginator): Response
{
$photosPage = $registry->getRepository(FicheProduit::class)->findAll();
$pageConfig = $registry->getRepository(PhotoPageConfig::class)->findAll();
$modelesId = $typeTransfosId = $metierId = $carrossiersId = null;
$countPhotos = 0;
foreach ($photosPage as $produit){
$photos = $produit->getPhototheques();
foreach ($photos as $photo){
$countPhotos+=1;
}
}
$nbChoice = ceil($countPhotos / 12);
if($nbChoice > 3){
$nbChoice = 3;
}
$photos = [];
for($i = 1; $i <= $nbChoice; $i++){
$photos[$i * 12] = $i * 12;
}
$form = $this->createFormBuilder()
->add('modele', EntityType::class, [
'class' => Modele::class,
'choice_label' => 'name',
'placeholder' => 'Modèles',
'label' => false,
'required' => false,
'multiple' => true,
'attr' => ['data-placeholder' => 'Modèles']
])
->add('carrossier', EntityType::class, [
'class' => Carrossier::class,
'choice_label' => 'name',
'placeholder' => 'Carrossiers',
'label' => false,
'required' => false,
'multiple' => true,
'attr' => ['data-placeholder' => 'Carrossiers']
])
->add('type', EntityType::class, [
'class' => TypeTransformation::class,
'choice_label' => 'name',
'placeholder' => 'Type de transformations',
'label' => false,
'required' => false,
'multiple' => true,
'attr' => ['data-placeholder' => 'Type de transformations']
])
->add('metier', EntityType::class, [
'class' => Metier::class,
'choice_label' => 'name',
'placeholder' => 'Métiers',
'label' => false,
'required' => false,
'multiple' => true,
'attr' => ['data-placeholder' => 'Métiers']
])
/*->add('submit', SubmitType::class, [
'label' => 'Rechercher',
])*/
->getForm()
->handleRequest($request);
$visuelForm = $this->createFormBuilder()
->add('visuel', ChoiceType::class, [
'choices' => $photos,
'placeholder' => 'Visuels par page',
'label' => false,
])
->getForm();
$visuelForm->handleRequest($request);
if ($visuelForm->isSubmitted() && $visuelForm->isValid())
{
$id = $visuelForm->get('visuel')->getData();
$photoResult = [];
foreach ($photosPage as $produit){
$photos = $produit->getPhototheques();
foreach ($photos as $photo){
array_push($photoResult, $photo);
}
}
if ($id === null){
$photoResult = $paginator->paginate($photoResult, $request->query->getInt('page', 1), 12);
}else{
$photoResult = $paginator->paginate($photoResult, $request->query->getInt('page', 1), $id);
}
$photoResult->setCustomParameters(['align' => 'center','size' => 'small',]);
return $this->render('default/phototheque.html.twig', [
'photosPage' => $photoResult,
'form' => $form->createView(),
'visuelForm' => $visuelForm->createView(),
'pageConfig' => $pageConfig,
'modelesId' => $modelesId,
'carrossiersId' => $carrossiersId,
'typeTransfosId' => $typeTransfosId,
'metierId' => $metierId
]);
}
if ($request->getMethod() == 'POST')
{
$id = (int)$request->request->get('form_visuel');
$photoResult = [];
foreach ($photosPage as $produit){
$photos = $produit->getPhototheques();
foreach ($photos as $photo){
array_push($photoResult, $photo);
}
}
$modelesId = explode(',', $request->request->get('form_modele'));;
$carrossiersId = explode(',', $request->request->get('form_carrossier'));;
$typeTransfosId = explode(',', $request->request->get('form_type'));;
$metierId = explode(',', $request->request->get('form_metier'));
$modelesIds = $registry->getRepository(Modele::class)->findById($modelesId);
$carrossiersIds= $registry->getRepository(Carrossier::class)->findById($carrossiersId);
$typeTransfosIds = $registry->getRepository(TypeTransformation::class)->findById($typeTransfosId);
$metiersIds = $registry->getRepository(Metier::class)->findById($metierId);
$modeles = $registry->getRepository(FicheProduit::class)->findByModele($modelesId);
$carrossiers = $registry->getRepository(FicheProduit::class)->findByCarrossier($carrossiersId);
$typeTransfos = $registry->getRepository(FicheProduit::class)->findByType($typeTransfosId);
$metiers = $registry->getRepository(FicheProduit::class)->findByMetier($metierId);
$photosPage = array_unique(array_merge($modeles, $carrossiers, $typeTransfos, $metiers));
if (!$modelesId[0] && !$carrossiersId[0] && !$typeTransfosId[0] && !$metierId[0]){
$photosPage = $registry->getRepository(FicheProduit::class)->findAll();
}
$photoResult = [];
foreach ($photosPage as $produit){
$photos = $produit->getPhototheques();
foreach ($photos as $photo){
array_push($photoResult, $photo);
}
}
if ($id === 0){
$photoResult = $paginator->paginate($photoResult, $request->query->getInt('page', 1), 12);
}else{
$photoResult = $paginator->paginate($photoResult, $request->query->getInt('page', 1), (int)$id);
}
$photoResult->setCustomParameters(['align' => 'center','size' => 'small',]);
return new JsonResponse([ 'view' => $this->renderView('default/dynamicPhoto.html.twig',
[
'photosPage' => $photoResult,
'visuelForm' => $visuelForm->createView(),
'form' => $form->createView(),
'pageConfig' => $pageConfig,
'modelesId' => $modelesIds,
'carrossiersId' => $carrossiersIds,
'typeTransfosId' => $typeTransfosIds,
'metierId' => $metiersIds
]
)]);
}
$photoResult = [];
foreach ($photosPage as $produit){
$photos = $produit->getPhototheques();
foreach ($photos as $photo){
array_push($photoResult, $photo);
}
}
$photoResult = $paginator->paginate($photoResult, $request->query->getInt('page', 1), 12);
$photoResult->setCustomParameters(['align' => 'center','size' => 'small',]);
return $this->render('default/phototheque.html.twig', [
'photosPage' => $photoResult,
'form' => $form->createView(),
'visuelForm' => $visuelForm->createView(),
'pageConfig' => $pageConfig,
'modelesId' => $modelesId,
'carrossiersId' => $carrossiersId,
'typeTransfosId' => $typeTransfosId,
'metierId' => $metierId
]);
}
/**
* @Route("/carrossiers", name="carrossiers")
*/
public function indexCarrossiers(ManagerRegistry $registry): Response
{
$repository = $registry->getRepository(Carrossier::class);
$carrossiers = $repository->findAll();
$pageConfig = $registry->getRepository(CarrossPageConfig::class)->findAll();
return $this->render('default/carrossiers.html.twig', [
'carrossiers' => $carrossiers,
'pageConfig' => $pageConfig,
]);
}
/**
* @Route("/ma-zone", name="maZone")
* @IsGranted("ROLE_CDR")
*/
public function indexMaZone(ManagerRegistry $registry): Response
{
$concession = $this->getUser()->getConcession();
$zone = $concession->getZone();
$contrats = $registry->getRepository(Contrat::class)->findBy(array('zone' => $zone, 'status' => 'A'));
$pageConfig = $registry->getRepository(MaZonePageConfig::class)->findAll();
return $this->render('default/maZone.html.twig', [
'pageConfig' => $pageConfig,
'contrats' => $contrats,
'zone' => $zone
]);
}
/**
* @Route("/fiche-produit/{id}", name="ficheProduit")
*/
public function indexFicheProduit(Request $request, int $id, ManagerRegistry $registry, MailerInterface $mailer): Response
{
$produit = $registry->getRepository(FicheProduit::class)->find($id);
$activites = $produit->getActiviteProduits();
$form = $this->createForm(EmailProduitType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
$email = (new Email());
$email
->from(new Address('info@resacaravanevu.fr', 'L’INTÉGRALE VÉHICULES CARROSSES'))
->to($data['email'])
->subject('Toyota Professional - Véhicules transformés - Votre fiche produit')
->html(nl2br($data['body']));
$mailer->send($email);
$this->addFlash('success', 'Votre message a bien été envoyé');
return $this->render('default/ficheProduit.html.twig', [
'produit' => $produit,
'activites' => $activites,
'form' => $form->createView()
]);
}
return $this->render('default/ficheProduit.html.twig', [
'produit' => $produit,
'activites' => $activites,
'form' => $form->createView()
]);
}
/**
* @Route("/import", name="import_users")
*/
public function importUser(Request $request): Response
{
if ($request->files->get('file') === null) {
$this->addFlash('danger', 'Fichier invalide');
return $this->redirectToRoute('admin');
}
$em = $this->getDoctrine()->getManager();
//Creation Des Concessions
$count = 1;
if (($fp = fopen($request->files->get('file'), "r")) !== FALSE) {
while (($row = fgetcsv($fp, 1000, ",")) !== FALSE) {
if ($count > 1 ) {
$data = explode(';', $row[0]);
$concession = $em->getRepository(Concession::class)->findOneByCode($data['4']);
if (!$concession) {
$concession = new Concession();
}
$concession->setCode(trim($data['4']));
$concession->setName(trim($data['5']));
$concession->setZone($data['8'] == 'NORD' ? 'N' : 'S');
$em->persist($concession);
}
$count++;
}
fclose($fp);
}
$em->flush();
//Creation Des user
$count = 1;
if (($fp = fopen($request->files->get('file'), "r")) !== FALSE) {
while (($row = fgetcsv($fp, 1000, ",")) !== FALSE) {
if ($count > 1 ) {
$data = explode(';', $row[0]);
$user = $em->getRepository(User::class)->findOneByEmail($data['7']);
$concession = $em->getRepository(Concession::class)->findOneByCode($data['4']);
if (!$user) {
$user = new User();
$password = uniqid();
$user->setFirstPassword($password);
$user->setPassword($this->passwordHasher->hashPassword($user, $password));
$user->setRoles(["ROLE_USER"]);
}
$user->setEmail($data['7']);
$user->setConcession($concession);
$user->setNom($data['2']);
$user->setPrenom($data['1']);
$user->setCivilite($data['0'] ?? 'M.' ? 'H' : 'F');
$user->setSite($data['6']);
$user->setMetier($data['3']);
$em->persist($user);
$em->flush();
}
$count++;
}
fclose($fp);
}
$this->addFlash('success', 'Import effectué avec succès');
return $this->redirectToRoute('admin');
}
/**
* @Route("/export", name="export_users")
*/
public function exportUser(Request $request)
{
$em = $this->getDoctrine()->getManager();
$users = $em->getRepository(User::class)->findAll();
$handle = tmpfile();
$data = [
'Civilité',
'Prénom',
'Nom',
'Métier',
'Code CE',
'Raison Sociale',
'Site de Travail : Entreprise mère',
'Adresse e-mail',
'ZONE'
];
fputcsv($handle, array_map('utf8_decode',$data), ';');
$data = [];
foreach ($users as $user) {
$data['Civilité'] = $user->getCivilite() == 'H' ? 'M.' : 'MME.';
$data['Prénom'] = $user->getPrenom();
$data['Nom'] = $user->getNom();
$data['Métier']= $user->getMetier();
$data['Code CE'] = $user->getConcession()->getCode();
$data['Raison Sociale'] = trim($user->getConcession()->getName());
$data['Site de Travail : Entreprise mère'] = $user->getSite();
$data['Adresse e-mail'] = $user->getEmail();
$data['ZONE']= $user->getConcession()->getZone();
fputcsv($handle, array_map('utf8_decode',$data), ';', chr(0));
}
rewind($handle);
return new Response(stream_get_contents($handle), 200, array(
'Content-Type' => 'application/csv',
'Content-Disposition' => 'attachment; filename=users.csv'
));
}
/**
* @Route("/export-contract-accepted", name="export_contract_accepted")
*/
public function exportContractAccepted(Request $request, ManagerRegistry $registry)
{
$contrats = $registry->getRepository(Contrat::class)->findContractAccepted();
$handle = tmpfile();
$data = [
'Concession',
'Code Concession',
'ZONE',
'Civilité',
'Nom et Prénom',
'Adresse e-mail',
'Téléphone',
'Date de début',
'Date de fin'
];
fputcsv($handle, array_map('utf8_decode',$data), ';');
$data = [];
foreach ($contrats as $contrat) {
$data['Concession'] = $contrat->getCreatedBy()->getConcession()->getName();
$data['Code Concession'] = $contrat->getCreatedBy()->getConcession()->getCode();
$data['ZONE']= $contrat->getZone() === 'N' ? 'NORD' : 'SUD';
$data['Civilité'] = $contrat->getCivilite() == 'H' ? 'M.' : 'MME.';;
$data['Nom et Prénom']= $contrat->getNomContactLivraison();
$data['Adresse e-mail'] = $contrat->getEmailLivraison();
$data['Téléphone'] = $contrat->getPhoneLivraison();
$data['Date de début'] = $contrat->getReservation()->getStartDate()->format('d-m-Y');
$data['Date de fin'] = $contrat->getReservation()->getEndDate()->format('d-m-Y');
fputcsv($handle, array_map('utf8_decode',$data), ';', chr(0));
}
rewind($handle);
return new Response(stream_get_contents($handle), 200, array(
'Content-Type' => 'application/csv',
'Content-Disposition' => 'attachment; filename=contracts_accepted.csv'
));
}
/**
* @Route("/export-dateblocked/{zone}", name="export_dateblocked")
*/
public function exportBlockedDateZoneN(Request $request, ManagerRegistry $registry, $zone)
{
$blockedDates = $registry->getRepository(Reservation::class)->findBlockedDate($zone);
$handle = tmpfile();
$data = [
'Code CE',
'Créé par',
'ZONE',
'Date de début',
'Date de fin'
];
fputcsv($handle, array_map('utf8_decode',$data), ';');
$data = [];
foreach ($blockedDates as $blockedDate) {
$data['Code CE'] = $blockedDate->getCreatedBy()->getConcession()->getCode();
$data['Concession'] = $blockedDate->getCreatedBy()->getEmail();
$data['ZONE']= $zone;
$data['Date de début'] = $blockedDate->getStartDate()->format('d-m-Y');
$data['Date de fin'] = $blockedDate->getEndDate()->format('d-m-Y');
fputcsv($handle, array_map('utf8_decode',$data), ';', chr(0));
}
rewind($handle);
return new Response(stream_get_contents($handle), 200, array(
'Content-Type' => 'application/csv',
'Content-Disposition' => 'attachment; filename=dates_bloquées_zone_'. $zone .'.csv'
));
}
}