<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\CategoriesRepository;
use App\Repository\AnnoncesRepository;
use App\Repository\FavorisRepository;
use App\Repository\PaysRepository;
use App\Repository\VillesRepository;
use App\Repository\UserRepository;
use App\Repository\CommandesRepository;
use App\Repository\FacturesRepository;
use App\Repository\NotesEnseignesRepository;
use App\Repository\NotesAnnoncesRepository;
use App\Entity\Commandes;
use App\Entity\Factures;
use App\Entity\Alertes;
use App\Entity\Villes;
use App\Entity\Categories;
use Datetime;
use Spipu\Html2Pdf\Html2Pdf;
use App\Entity\Favoris;
use Stripe\Stripe;
use Symfony\Component\HttpFoundation\Request;
use Knp\Component\Pager\PaginatorInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use App\Entity\User;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Length;
use DansMaCulotte\Monetico\Monetico;
use DansMaCulotte\Monetico\Requests\PurchaseRequest;
use DansMaCulotte\Monetico\Resources\BillingAddressResource;
use DansMaCulotte\Monetico\Resources\ShippingAddressResource;
use DansMaCulotte\Monetico\Resources\ClientResource;
class DefaultController extends AbstractController
{
private $entityManager;
private $stripeSecretKey;
public function __construct(EntityManagerInterface $entityManager,string $stripeSecretKey)
{
$this->entityManager = $entityManager;
$this->stripeSecretKey = $stripeSecretKey;
}
/**
* @Route("/loginPopup", name="custom_login")
*/
public function loginPopup(Request $request, UserPasswordEncoderInterface $passwordEncoder)
{
$referer = $request->headers->get('referer');
// Vérifier si l'utilisateur est déjà connecté, rediriger vers une autre page si nécessaire
if ($this->getUser()) {
return $this->redirectToRoute(' ');
}
if ($request->isMethod('POST')) {
$email = $request->request->get('email');
$password = $request->request->get('password');
// Récupérer l'utilisateur depuis la source de données (base de données, API, etc.)
$user = $this->getDoctrine()->getRepository(User::class)->findOneBy(['email' => $email]);
if (!$user) {
throw new AuthenticationException('Adresse e-mail ou mot de passe incorrect.');
}
// Vérifier le mot de passe
$isPasswordValid = $passwordEncoder->isPasswordValid($user, $password);
if (!$isPasswordValid) {
throw new AuthenticationException('Adresse e-mail ou mot de passe incorrect.');
}
// Authentifier l'utilisateur
$token = new UsernamePasswordToken($user, $user->getPassword(), 'main', $user->getRoles());
$this->get('security.token_storage')->setToken($token);
// Rediriger l'utilisateur vers une page sécurisée après la connexion réussie
return $this->redirect($referer);
}
}
/**
* @Route("/", name="app_default")
*/
public function index(Request $request): Response
{
$session = $request->getSession();
$session->set('type', 'part');
return $this->render('default/index.html.twig', []);
}
/**
* @Route("/professionnels", name="professionnels")
*/
public function professionnels(Request $request): Response
{
$session = $request->getSession();
$session->set('type', 'pro');
return $this->render('default/indexPro.html.twig', []);
}
/**
* @Route("/achatCredit", name="achatCredit")
*/
public function achatCredit(Request $request): Response
{
return $this->render('default/achatCredit.html.twig', []);
}
/**
* @Route("/achatRecap", name="achatRecap")
*/
public function achatRecap(Request $request): Response
{
$qt = $_POST['quantite'];
return $this->render('default/achatRecap.html.twig', [
'qt'=>$qt
]);
}
/**
* @Route("/paiementStripeForm", name="paiementStripeForm")
*/
public function paiementStripeForm(Request $request, CommandesRepository $commandesRepo): Response
{
$uniq = uniqid();
$session = $request->getSession();
$session->set('orderIdTemp', $uniq);
$user = $this->getUser();
$qt = $_POST['qt'];
$total = $qt;
$commandes = new Commandes();
$commandes->setCreated(new DateTime());
$commandes->setQuantite($qt);
$commandes->setTotal($total);
$commandes->setUser($user);
$commandes->setUniqId($uniq);
$commandesRepo->add($commandes, true);
return $this->render('default/paiement.html.twig', [
]);
}
/**
* @Route("/stripe", name="stripe")
*/
public function stripe(Request $request, CommandesRepository $commandesRepo): Response
{
$session = $request->getSession();
$uniq = $session->get('orderIdTemp');
$commandes = $commandesRepo->findOneBy(array('UniqId'=>$uniq));
$total = $commandes->getTotal() * 100;
$description = 'commande numéro '.$commandes->getId();
// Récupérer le token envoyé depuis le frontend
$token = json_decode($request->getContent(), true)['token'];
// clé secrète TEST
Stripe::setApiKey('sk_test_51OuD3FGwTslbSP9Q7fBBkAOs8ouF2U2uxofmuPoX7YiBuF7FIol7MGuCFFX59QjQs04mlLcJkNpw9jctLSfv1C8R002fM4y74R');
// clé secrète PRODUCTION
//Stripe::setApiKey('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');
try {
// Effectuer la charge avec le token
// Par exemple :
$charge = \Stripe\Charge::create([
'amount' => $total, // Montant en centimes
'currency' => 'eur',
'source' => $token, // Token de carte de crédit
'description' => $description,
]);
// Ici, vous pouvez gérer la réponse de Stripe, puis renvoyer une réponse appropriée au frontend
return $this->json(['message' => 'Paiement effectué avec succès']);
} catch (CardException $e) {
// Si une exception liée à la carte se produit (par exemple, la carte est déclinée), capturez l'erreur
// et renvoyez le message d'erreur au frontend
return $this->json(['error' => $e->getMessage()], Response::HTTP_BAD_REQUEST);
} catch (ApiErrorException $e) {
// Si une autre exception Stripe se produit, capturez l'erreur
// et renvoyez un message d'erreur générique au frontend
return $this->json(['error' => 'Une erreur est survenue lors du traitement du paiement. Veuillez réessayer.'], Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
/**
* @Route("/retourStripe/{etat}", name="retourStripe")
*/
public function retourStripe(Request $request, $etat, CommandesRepository $commandesRepo,FacturesRepository $facturesRepo, UserRepository $userRepo): Response
{
$session = $request->getSession();
$uniq = $session->get('orderIdTemp');
$commandes = $commandesRepo->findOneBy(array('UniqId'=>$uniq));
if($etat == 'success')
{
if($commandes->isPaye())
{
}
else
{
$commandes->setPaye(1);
$commandesRepo->add($commandes, true);
$user = $this->getUser();
$credit = $user->getCredits() + $commandes->getQuantite();
$user->setCredits($credit);
$userRepo->add($user, true);
$factureNew = new Factures();
$factureNew->setCreated(new DateTime());
$factureNew->setCommandes($commandes);
$factureNew->setUser($user);
$facturesRepo->add($factureNew, true);
$template = $this->renderView('default/facturesPdf.html.twig', [
'facture'=>$factureNew
]);
$numero = date('Y').$factureNew->getId();
$html2pdf = new Html2Pdf();
$html2pdf->writeHTML($template);
$html2pdf->output('/var/www/vhosts/modixom.fr/httpdocs/public/factures/' . $numero . '.pdf', 'F');
/* $msg = $this->renderView(
// templates/emails/registration.txt.twig
'default/confirmationEmail.html.twig',
[
'nom'=>$res->getUser()->getNom(),
'prenom'=>$res->getUser()->getPrenom(),
'nbPlaces'=>$res->getNbPlaces(),
'type'=>'billet',
'resa'=>$res
]
);
// if (!empty($_POST['g-recaptcha-response'])){
$mj = new \Mailjet\Client('bce86e9943d59ded740db2a28c2f3083','a1db2837eee29a897454015828aba390',true,['version' => 'v3.1']);
$body = [
'Messages' => [
[
'From' => [
'Email' => "noreply@lions-laclaireau.be",
'Name' => "LIONS LACLAIREAU"
],
'To' => [
[
'Email' => $res->getUser()->getEmail(),
//'Email' => 'matthieu@aready.io',
]
],
'Subject' => "Confirmation de réservation",
'HTMLPart' => $msg
]
]
];
$response = $mj->post(Resources::$Email, ['body' => $body]);
$response->success();
$info = $response->getData();*/
}
}
return $this->renderForm('default/retourStripe.html.twig', [
'etat'=>$etat
]);
}
/**
* @Route("/testpdf", name="testpdf")
*/
public function testpdf(Request $request, FacturesRepository $facturesRepo): Response
{
$facture = $facturesRepo->findOneById(1);
$template = $this->renderView('default/facturesPdf.html.twig', [
'facture'=>$facture
]);
$html2pdf = new Html2Pdf();
$html2pdf->writeHTML($template);
$html2pdf->output('test.pdf');
}
/**
* @Route("/achatGenerationFacture", name="achatGenerationFacture")
*/
public function achatGenerationFacture(Request $request): Response
{
$session = $request->getSession();
$session->set('type', 'part');
return $this->render('default/achatGenerationFacture.html.twig', []);
}
/**
* @Route("/annonces", name="annonces")
*/
public function annonces(CategoriesRepository $categoriesRepository, FavorisRepository $favorisRepository, Request $request, AnnoncesRepository $annoncesRepository, VillesRepository $villesRepository, PaginatorInterface $paginator, NotesEnseignesRepository $notesEnseignesRepository): Response
{
$categoriesSearch = '';
$citiesRes = '';
if (isset($_GET['tri'])) {
$triSearch = $_GET['tri'];
} else {
$triSearch = '';
}
if (isset($_GET['nbParPage'])) {
$nbParPage = $_GET['nbParPage'];
} else {
$nbParPage = 25;
}
if (isset($_GET['pro'])) {
$pro = $_GET['pro'];
} else {
$pro = 0;
}
if (isset($_GET['motscles'])) {
$motscles = $_GET['motscles'];
} else {
$motscles = '';
}
$villes = array();
$citiesRes = array();
$em = $this->getDoctrine()->getManager();
// A dupliquer sur toutes les methodes
$session = $request->getSession();
$user = $this->getUser();
$favorisUser = array();
if (empty($session->get('type'))) {
$session->set('type', 'part');
}
if ($user) {
$session->set('type', $user->getType());
$favoris = $favorisRepository->findBy(array('User'=>$user));
foreach($favoris as $res)
{
array_push($favorisUser,$res->getAnnonces()->getId());
}
}
// Fin
if (isset($_GET['categories'])) {
$categoriesSearch = $_GET['categories'];
} else {
$categoriesSearch = array();
}
if (isset($_GET['ville'])) {
$ville = $_GET['ville'];
} else {
$ville = '';
}
$villes = $villesRepository->findOneById($ville);
if (isset($_GET['rayon'])) {
$distance = $_GET['rayon'];
} else {
$distance = 50;
}
// Il faut ajouter le repertoire doctrine/dql dans src
// Il faut ajouter les lignes dans services.yaml
// Il faut ajouter les lignes dans doctrine.yaml
if (!empty($villes)) {
// RECUPERER LES VILLES DANS UN RAYON
$lat = $villes->getVilleLatitudeDeg();
$lng = $villes->getVilleLongitudeDeg();
$formule = '(6371 * ACOS(COS(RADIANS(:lat)) * COS(RADIANS(c.VilleLatitudeDeg)) * COS(RADIANS(c.VilleLongitudeDeg) - RADIANS(:lng)) + SIN(RADIANS(:lat)) * SIN(RADIANS(c.VilleLatitudeDeg))))';
$query = $em->createQuery("
SELECT c.id,c.VilleNom, $formule as dist
FROM App\Entity\Villes c
WHERE $formule <= :distance order by dist asc ")->setParameters([
'lat' => $lat,
'lng' => $lng,
'distance' => $distance,
]);
$cities = $query->getResult();
foreach ($cities as $resVille) {
array_push($citiesRes, $resVille['id']);
}
}
$annoncesReq = $annoncesRepository->findByMultiCriteres($categoriesSearch, $citiesRes, $pro, $triSearch, $motscles);
$annonces = array();
$i = -1;
foreach ($annoncesReq as $res) {
$i++;
$annonces[$i]['id'] = $res->getId();
$annonces[$i]['booste'] = $res->isBooster();
$annonces[$i]['titre'] = $res->getTitre();
$annonces[$i]['enseigne'] = $res->getUser()->getRaisonSociale();
$annonces[$i]['images'] = $res->getImages()[0]->getLien();
$annonces[$i]['pourcentRemise'] = $res->getPourcentRemise();
$annonces[$i]['prix'] = $res->getPrix();
$pourcent = 1 - $res->getPourcentRemise() / 100;
$annonces[$i]['newprix'] = $res->getPrix() * $pourcent;
$fin = strtotime($res->getDateFin()->format('Y-m-d H:i:s'));
$debut = strtotime(date('Y-m-d H:i:s'));
$diff = abs($debut - $fin); // abs pour avoir la valeur absolute, ainsi éviter d'avoir une différence négative
$retour = array();
$tmp = $diff;
$retour['second'] = $tmp % 60;
$tmp = floor(($tmp - $retour['second']) / 60);
$retour['minute'] = $tmp % 60;
$tmp = floor(($tmp - $retour['minute']) / 60);
$retour['hour'] = $tmp % 24;
$tmp = floor(($tmp - $retour['hour']) / 24);
$retour['day'] = $tmp * 24;
$annonces[$i]['heures'] = $tmp * 24 + $retour['hour'];
$annonces[$i]['minutes'] = $retour['minute'];
$annonces[$i]['secondes'] = $retour['second'];
// CALCUL DE LA MOYENNE DE LANNONCE
$sum = 0;
$moy = 0;
$y = 0;
foreach ($res->getNotesAnnonces() as $res2) {
$y++;
$sum = $sum + $res2->getNote();
}
if ($y > 0) {
$moy = $sum / $y;
$moyAnnonce = (round($moy * 2) / 2);
} else {
$moyAnnonce = 0;
}
$annonces[$i]['moyAnnonce'] = $moyAnnonce;
// CALCUL DE LA MOYENNE DE ENSEIGNE
$sum = 0;
$moy = 0;
$y = 0;
$notesEns = $notesEnseignesRepository->findBy(array('Enseigne'=>$res->getUser()));
foreach ($notesEns as $res2) {
$y++;
$sum = $sum + $res2->getNote();
}
$maxNote = $y * 5;
if ($maxNote > 0) {
$noteEnseigne = ($sum * 100) / $maxNote;
} else {
$noteEnseigne = 0;
}
$annonces[$i]['moyEnseigne'] = $noteEnseigne;
}
$pagination = $paginator->paginate(
$annonces, /* query NOT result */
$request->query->getInt('page', 1), /*page number*/
$nbParPage /*limit per page*/
);
return $this->render('default/annonces.html.twig', [
'categories' => $categoriesRepository->findAll(),
'annonces' => $pagination,
'ville' => $ville,
'distance' => $distance,
'categoriesSearch' => $categoriesSearch,
'triSearch' => $triSearch,
'nbParPage' => $nbParPage,
'pro' => $pro,
'motscles' => $motscles,
'favorisUser'=>$favorisUser,
]);
}
/**
* @Route("/detailAnonnce/{id}", name="detailAnonnce")
*/
public function detailAnonnce(CategoriesRepository $categoriesRepository, Request $request, $id, AnnoncesRepository $annoncesRepository, NotesEnseignesRepository $notesEnseignesRepository): Response
{
// A dupliquer sur toutes les methodes
$session = $request->getSession();
$user = $this->getUser();
if (empty($session->get('type'))) {
$session->set('type', 'part');
}
if ($user) {
$session->set('type', $user->getType());
}
// Fin
$annoncesReq = $annoncesRepository->findOneById($id);
$annoncesReq->setNbvues($annoncesReq->getNbVues() + 1);
$annoncesRepository->add($annoncesReq, true);
$annonces['id'] = $annoncesReq->getId();
$annonces['booste'] = $annoncesReq->isBooster();
$annonces['titre'] = $annoncesReq->getTitre();
$annonces['enseigne'] = $annoncesReq->getUser()->getRaisonSociale();
$annonces['logo'] = $annoncesReq->getUser()->getLogo();
$annonces['adresse'] = $annoncesReq->getUser()->getAdresse();
$annonces['cp'] = $annoncesReq->getVilles()->getVilleCodePostal();
$annonces['telephone'] = $annoncesReq->getUser()->getTelephone();
$annonces['ville'] = $annoncesReq->getVilles()->getVilleNom();
$annonces['images'] = $annoncesReq->getImages()[0]->getLien();
$annonces['pourcentRemise'] = $annoncesReq->getPourcentRemise();
$annonces['prix'] = $annoncesReq->getPrix();
$annonces['description'] = $annoncesReq->getDescription();
$annonces['quantite'] = $annoncesReq->getQuantite();
$annonces['debut'] = $annoncesReq->getDateDebut()->format('d-m-Y H:i');
$annonces['fin'] = $annoncesReq->getDateFin()->format('d-m-Y H:i');
// $annonces['pourcentRemise'] = $annoncesReq->getPourcentRemise();
$pourcent = 1 - $annoncesReq->getPourcentRemise() / 100;
$annonces['newprix'] = $annoncesReq->getPrix() * $pourcent;
$fin = strtotime($annoncesReq->getDateFin()->format('Y-m-d H:i:s'));
$debut = strtotime(date('Y-m-d H:i:s'));
$diff = abs($debut - $fin); // abs pour avoir la valeur absolute, ainsi éviter d'avoir une différence négative
$retour = array();
$tmp = $diff;
$retour['second'] = $tmp % 60;
$tmp = floor(($tmp - $retour['second']) / 60);
$retour['minute'] = $tmp % 60;
$tmp = floor(($tmp - $retour['minute']) / 60);
$retour['hour'] = $tmp % 24;
$tmp = floor(($tmp - $retour['hour']) / 24);
$retour['day'] = $tmp * 24;
$annonces['heures'] = $tmp * 24 + $retour['hour'];
$annonces['minutes'] = $retour['minute'];
$annonces['secondes'] = $retour['second'];
// CALCUL DE LA MOYENNE DE LANNONCE
$sum = 0;
$moy = 0;
$y = 0;
foreach ($annoncesReq->getNotesAnnonces() as $res2) {
$y++;
$sum = $sum + $res2->getNote();
}
if ($y > 0) {
$moy = $sum / $y;
$moyAnnonce = (round($moy * 2) / 2);
} else {
$moyAnnonce = 0;
}
$annonces['moyAnnonce'] = $moyAnnonce;
// CALCUL DE LA MOYENNE DE ENSEIGNE
$sum = 0;
$moy = 0;
$y = 0;
$notesEns = $notesEnseignesRepository->findBy(array('Enseigne' => $annoncesReq->getUser()));
foreach ($notesEns as $res2) {
$y++;
$sum = $sum + $res2->getNote();
}
$maxNote = $y * 5;
if ($maxNote > 0) {
$noteEnseigne = ($sum * 100) / $maxNote;
} else {
$noteEnseigne = 0;
}
$annonces['moyEnseigne'] = $noteEnseigne;
return $this->render('default/detailAnonnce.html.twig', [
'annonce' => $annoncesReq,
'res' => $annonces // Ajoutez cette ligne pour passer la variable 'res' à la vue
]);
}
/**
* @Route("/update-rating", name="update_rating", methods={"POST"})
*/
/**
* @Route("/inscription", name="inscription")
*/
public function inscription(Request $request, PaysRepository $paysRepository, UserRepository $userRepository, VillesRepository $villesRepository): Response
{
$session = $request->getSession();
$session->set('type', $_GET['type']);
if ($_GET['type'] == 'pro') {
$type = 'pro';
$role = array("ROLE_PRO");
$credit = 100;
} else {
$type = 'part';
$role = array("ROLE_PART");
$credit = 0;
}
if ($type == 'part') {
$client = new User();
$formClient = $this->createFormBuilder($client)
->add('nom', TextType::class, array('label' => false))
->add('prenom', TextType::class, array('label' => false))
->add('adresse', TextType::class, array('label' => false))
->add('codePostal', TextType::class, array('label' => false))
->add('telephone', TextType::class, array('label' => false))
->add('email', EmailType::class, array('label' => false))
->add('password', PasswordType::class, array('label' => false))
->getForm();
} else {
$client = new User();
$formClient = $this->createFormBuilder($client)
->add('nom', TextType::class, array('label' => false))
->add('prenom', TextType::class, array('label' => false))
->add('adresse', TextType::class, array('label' => false))
->add('codePostal', TextType::class, array('label' => false))
->add('telephone', TextType::class, array('label' => false))
->add('email', EmailType::class, array('label' => false))
->add('logo', FileType::class, array('label' => false))
->add('password', PasswordType::class, array('label' => false))
->add('raisonSociale', TextType::class, array('label' => false))
->add('siret', TextType::class, array('label' => false))
->add('tva', TextType::class, array('label' => false))
->getForm();
}
//on génère le html du formulair
$formClientView = $formClient->createView();
//On crée l'action pour ajouter en bdd
$formClient->handleRequest($request);
//si le formClient est soumis
if ($formClient->isSubmitted()) {
$ville = $villesRepository->findOneById($_POST['ville']);
$pays = $paysRepository->findOneById($_POST['pays']);
$clientExist = $userRepository->findOneBy(array('email' => $_POST['form']['email']));
if ($type == 'pro') {
$file = $formClient->get('logo')->getData();
if ($file != 'null') {
$path = '/';
$fileName = uniqid() . '-' . $file->getClientOriginalName();
$file->move(
$this->getParameter('logos_directory') . $path,
$fileName
);
$client->setLogo($fileName);
}
}
if (!empty($clientExist)) {
return $this->redirectToRoute('inscription', ['erreur' => 'email', 'type' => $type], Response::HTTP_SEE_OTHER);
}
$pass = password_hash($_POST['form']['password'], PASSWORD_BCRYPT);
$client->setPassword($pass);
$client->setType($type);
$client->setRoles($role);
$client->setCivilite($_POST['genre']);
$client->setPays($pays);
$client->setVilles($ville);
$client->setCredits($credit);
$client->setCreated(new DateTime());
$userRepository->add($client, true);
return $this->redirectToRoute('app_login', [], Response::HTTP_SEE_OTHER);
}
return $this->render('default/inscription.html.twig', [
'form' => $formClientView,
'pays' => $paysRepository->findAll()
]);
}
/**
* @Route("/profil", name="profil")
*/
public function profil(Request $request, PaysRepository $paysRepository, UserRepository $userRepository, VillesRepository $villesRepository): Response
{
$client = $userRepository->findOneById($this->getUser());
$oldLogo = $client->getLogo();
$type = $client->getType();
if ($type == 'part') {
$formClient = $this->createFormBuilder($client)
->add('nom', TextType::class, array('label' => false))
->add('prenom', TextType::class, array('label' => false))
->add('adresse', TextType::class, array('label' => false))
->add('codePostal', TextType::class, array('label' => false))
->add('telephone', TextType::class, array('label' => false))
->add('email', EmailType::class, array('label' => false))
->getForm();
} else {
$formClient = $this->createFormBuilder($client)
->add('nom', TextType::class, array('label' => false))
->add('prenom', TextType::class, array('label' => false))
->add('adresse', TextType::class, array('label' => false))
->add('codePostal', TextType::class, array('label' => false))
->add('telephone', TextType::class, array('label' => false))
->add('email', EmailType::class, array('label' => false))
->add('logo', FileType::class, array('label' => false, 'data_class' => null, 'required'=>false))
->add('raisonSociale', TextType::class, array('label' => false))
->add('siret', IntegerType::class, array('label' => false, 'required'=>false))
->add('tva', TextType::class, array('label' => false, 'required'=>false))
->getForm();
}
//on génère le html du formulair
$formClientView = $formClient->createView();
//On crée l'action pour ajouter en bdd
$formClient->handleRequest($request);
//si le formClient est soumis
if ($formClient->isSubmitted()) {
$ville = $villesRepository->findOneById($_POST['ville']);
$pays = $paysRepository->findOneById($_POST['pays']);
$clientExist = $userRepository->findOneBy(array('email' => $_POST['form']['email']));
if (!empty($clientExist)) {
if($clientExist->getId() != $client->getId())
{
return $this->redirectToRoute('profil', ['erreur' => 'email'], Response::HTTP_SEE_OTHER);
}
}
if ($type == 'pro') {
$file = $formClient->get('logo')->getData();
if (!empty($file)) {
$path = '/';
$fileName = uniqid() . '-' . $file->getClientOriginalName();
$file->move(
$this->getParameter('logos_directory') . $path,
$fileName
);
$client->setLogo($fileName);
}
else
{
$client->setLogo($oldLogo);
}
}
$client->setPays($pays);
$client->setVilles($ville);
$userRepository->add($client, true);
return $this->redirectToRoute('profil', [], Response::HTTP_SEE_OTHER);
}
if(!empty($_POST['new1']))
{
$pass = password_hash($_POST['new1'], PASSWORD_BCRYPT);
$client->setPassword($pass);
$userRepository->add($client, true);
}
return $this->render('default/profil.html.twig', [
'pays'=>$paysRepository->findAll(),
'form' => $formClientView,
]);
}
/**
* @Route("/favoris", name="favoris")
*/
public function favoris(Request $request, $id = 1, AnnoncesRepository $annoncesRepository, FavorisRepository $favorisRepository): Response
{
$session = $request->getSession();
$session->set('type', 'part');
$user = $this->getUser();
$annonces = array();
$annoncesRes = $favorisRepository->findBy(['User'=>$user]);
$annonces = array();
$i = -1;
foreach($annoncesRes as $res)
{
$i++;
$annonces[$i]['id'] = $res->getAnnonces()->getId();
$annonces[$i]['booste'] = $res->getAnnonces()->isBooster();
$annonces[$i]['titre'] = $res->getAnnonces()->getTitre();
$annonces[$i]['enseigne'] = $res->getUser()->getRaisonSociale();
$annonces[$i]['images'] = $res->getAnnonces()->getImages()[0]->getLien();
$annonces[$i]['pourcentRemise'] = $res->getAnnonces()->getPourcentRemise();
$annonces[$i]['prix'] = $res->getAnnonces()->getPrix();
$pourcent = 1 - $res->getAnnonces()->getPourcentRemise() / 100;
$annonces[$i]['newprix'] = $res->getAnnonces()->getPrix() * $pourcent;
$fin = strtotime($res->getAnnonces()->getDateFin()->format('Y-m-d H:i:s'));
$debut = strtotime(date('Y-m-d H:i:s'));
$diff = abs($debut - $fin); // abs pour avoir la valeur absolute, ainsi éviter d'avoir une différence négative
$retour = array();
$tmp = $diff;
$retour['second'] = $tmp % 60;
$tmp = floor(($tmp - $retour['second']) / 60);
$retour['minute'] = $tmp % 60;
$tmp = floor(($tmp - $retour['minute']) / 60);
$retour['hour'] = $tmp % 24;
$tmp = floor(($tmp - $retour['hour']) / 24);
$retour['day'] = $tmp * 24;
$annonces[$i]['heures'] = $tmp * 24 + $retour['hour'];
$annonces[$i]['minutes'] = $retour['minute'];
$annonces[$i]['secondes'] = $retour['second'];
// CALCUL DE LA MOYENNE DE LANNONCE
$sum = 0;
$moy = 0;
$y = 0;
foreach ($res->getAnnonces()->getNotesAnnonces() as $res2) {
$y++;
$sum = $sum + $res2->getNote();
}
if ($y > 0) {
$moy = $sum / $y;
$moyAnnonce = (round($moy * 2) / 2);
} else {
$moyAnnonce = 0;
}
$annonces[$i]['moyAnnonce'] = $moyAnnonce;
// CALCUL DE LA MOYENNE DE ENSEIGNE
$sum = 0;
$moy = 0;
$y = 0;
foreach ($res->getUser()->getNotesEnseignes() as $res2) {
$y++;
$sum = $sum + $res2->getNote();
}
$maxNote = $y * 5;
if ($maxNote > 0) {
$noteEnseigne = ($sum * 100) / $maxNote;
} else {
$noteEnseigne = 0;
}
$annonces[$i]['moyEnseigne'] = $noteEnseigne;
}
return $this->render('default/favoris.html.twig', [
'annonce' => $annonces,
]);
}
/**
* @Route("/addFavoris", name="addFavoris")
*/
public function addFavoris(Request $request, AnnoncesRepository $annoncesRepository, FavorisRepository $favorisRepository): Response
{
$user = $this->getUser();
$id = $_POST['id'];
$etat = $_POST['etat'];
$annonce = $annoncesRepository->findOneById($id);
if($etat == 'non active')
{
$favoris = new Favoris();
$favoris->setUser($user);
$favoris->setDate(new Datetime);
$favoris->setAnnonces($annonce);
$favorisRepository->add($favoris, true);
}
else
{
$favoris = $favorisRepository->findOneBy(array('User'=>$user,'Annonces'=>$annonce));
$favorisRepository->remove($favoris, true);
}
return new Response('ok');
}
/**
* @Route("/addAlertes", name="addAlertes")
*/
/**
* @Route("/addAlertes", name="addAlertes")
*/
public function addAlertes(Request $request, AnnoncesRepository $annoncesRepository, FavorisRepository $favorisRepository): Response
{
$entityManager = $this->getDoctrine()->getManager();
$villeId = $request->request->get('ville');
$rayon = $request->request->get('rayon');
$categorieId = $request->request->get('categorie');
$texte = $request->request->get('texte');
$userId = $this->getUser()->getId();
// Récupérer les instances des entités liées (Villes, Categories, User)
$ville = $entityManager->getRepository(Villes::class)->find($villeId);
$categorie = $entityManager->getRepository(Categories::class)->find($categorieId);
$user = $entityManager->getRepository(User::class)->find($userId);
// Créer une nouvelle alerte avec les données du formulaire
$alerte = new Alertes();
$alerte->setVilles($ville);
$alerte->setRayon($rayon);
$alerte->setCategories($categorie);
$alerte->setTexte($texte);
$alerte->setUser($user);
// Enregistrer l'alerte dans la base de données
$entityManager->persist($alerte);
$entityManager->flush();
// Retourner une réponse indiquant que l'alerte a été ajoutée avec succès
return new Response("Alerte ajoutée avec succès", Response::HTTP_CREATED);
}
/**
* @Route("/contact", name="contact")
*/
public function contact(Request $request): Response
{
$lienAnnonce = '';
if(isset($_GET['id']))
{
$lienAnnonce = $request->headers->get('referer');
}
return $this->render('default/contact.html.twig', [
'lienAnnonce'=>$lienAnnonce
]);
}
/**
* @Route("/achatFacture", name="achatFacture")
*/
public function achatFacture(Request $request): Response
{
return $this->render('default/achatGenerationFacture.html.twig');
}
/**
* @Route("/notesEnseignes", name="notesEnseignes")
*/
public function notesEnseignes(Request $request, NotesEnseignesRepository $notesEnseignesRepository): Response
{
$notes = $notesEnseignesRepository->findBy(['Enseigne'=>$this->getUser()],['Date'=>'desc']);
// CALCUL DE LA MOYENNE DE ENSEIGNE
$sum = 0;
$moy = 0;
$y = 0;
$noteEnseigne = 0;
foreach ($notes as $res2) {
$y++;
$sum = $sum + $res2->getNote();
}
if ($y > 0) {
$noteEnseigne = $sum / $y;
}
return $this->render('default/notesEnseignes.html.twig', [
'notes' => $notes,
'noteEnseigne' => $noteEnseigne
]);
}
/**
* @Route("/notesAnnonces/{id}", name="notesAnnonces")
*/
public function notesAnnonces(Request $request, NotesAnnoncesRepository $notesAnnoncesRepository,$id): Response
{
$notes = $notesAnnoncesRepository->findBy(['Annonces'=>$id],['Date'=>'desc']);
// CALCUL DE LA MOYENNE DE ENSEIGNE
$sum = 0;
$moy = 0;
$y = 0;
$noteAnnonces = 0;
foreach ($notes as $res2) {
$y++;
$sum = $sum + $res2->getNote();
}
if($y > 0)
{
$noteAnnonces = $sum/$y;
}
return $this->render('default/notesAnnonces.html.twig', [
'notes'=>$notes,
'noteAnnonces'=>$noteAnnonces
]);
}
/**
* @Route("/mesAnnonces/{type}", name="mesAnnonces")
*/
public function mesAnnonces(Request $request, AnnoncesRepository $annoncesRepository, FavorisRepository $favorisRepository,$type): Response
{
$user = $this->getUser();
$annonces = array();
if($type == 'encours')
{
$annoncesRes = $annoncesRepository->findByAnnoncesEnCours($user->getId());
}
else
{
$annoncesRes = $annoncesRepository->findByAnnoncesExpire($user->getId());
}
$annonces = array();
$i = -1;
foreach($annoncesRes as $res)
{
$i++;
$annonces[$i]['id'] = $res->getId();
$annonces[$i]['booste'] = $res->isBooster();
$annonces[$i]['titre'] = $res->getTitre();
$annonces[$i]['enseigne'] = $res->getUser()->getRaisonSociale();
// Vérifier si l'annonce a des images
$image = $res->getImages()[0] ?? null;
$annonces[$i]['images'] = $image ? $image->getLien() : null;
$annonces[$i]['pourcentRemise'] = $res->getPourcentRemise();
$annonces[$i]['prix'] = $res->getPrix();
$annonces[$i]['nbVues'] = $res->getNbVues();
$pourcent = 1 - $res->getPourcentRemise() / 100;
$annonces[$i]['newprix'] = $res->getPrix() * $pourcent;
$fin = strtotime($res->getDateFin()->format('Y-m-d H:i:s'));
$debut = strtotime(date('Y-m-d H:i:s'));
$diff = abs($debut - $fin); // abs pour avoir la valeur absolute, ainsi éviter d'avoir une différence négative
$retour = array();
$tmp = $diff;
$retour['second'] = $tmp % 60;
$tmp = floor(($tmp - $retour['second']) / 60);
$retour['minute'] = $tmp % 60;
$tmp = floor(($tmp - $retour['minute']) / 60);
$retour['hour'] = $tmp % 24;
$tmp = floor(($tmp - $retour['hour']) / 24);
$retour['day'] = $tmp * 24;
$annonces[$i]['heures'] = $tmp * 24 + $retour['hour'];
$annonces[$i]['minutes'] = $retour['minute'];
$annonces[$i]['secondes'] = $retour['second'];
// CALCUL DE LA MOYENNE DE LANNONCE
$sum = 0;
$moy = 0;
$y = 0;
foreach ($res->getNotesAnnonces() as $res2) {
$y++;
$sum = $sum + $res2->getNote();
}
if ($y > 0) {
$moy = $sum / $y;
$moyAnnonce = (round($moy * 2) / 2);
} else {
$moyAnnonce = 0;
}
$annonces[$i]['moyAnnonce'] = $moyAnnonce;
// CALCUL DE LA MOYENNE DE ENSEIGNE
$sum = 0;
$moy = 0;
$y = 0;
foreach ($res->getUser()->getNotesEnseignes() as $res2) {
$y++;
$sum = $sum + $res2->getNote();
}
$maxNote = $y * 5;
if ($maxNote > 0) {
$noteEnseigne = ($sum * 100) / $maxNote;
} else {
$noteEnseigne = 0;
}
$annonces[$i]['moyEnseigne'] = $noteEnseigne;
}
return $this->render('default/mesAnnonces.html.twig', [
'annonces' => $annonces,
'type'=>$type
]);
}
/**
* @Route("/paiement", name="paiement")
*/
public function paiement(): Response
{
/* $tpe = '7199003';
$total = 62.73;
$societe='MODIXOM';
$version = "3.0";
$email = 'cedric@aready.io';
$ref = 'test1234';
$context = array();
$context['billing']['firstName'] ='test';
$context['billing']['lastName'] ='test';
$context['billing']['addressLine1'] ='test';
$context['billing']['city'] ='test';
$context['billing']['postalCode'] ='1234';
$context['billing']['country'] ='FR';
$context['shipping']['firstName'] ='test';
$context['shipping']['lastName'] ='test';
$context['shipping']['addressLine1'] ='test';
$context['shipping']['city'] ='test';
$context['shipping']['postalCode'] ='1234';
$context['shipping']['country'] ='FR';
$context['shipping']['email'] ='cedric@aready.io';
$context['shipping']['phone'] ='+33785864783';
$context['shipping']['shipIndicator'] ='billing_address';
$context['shipping']['deliveryTimeframe'] ='two_day';
$context['shipping']['firstUseDate'] ='2023-11-13';
$context['shipping']['matchBillingAddress'] =true;
$context['client']['email'] ='cedric@aready.io';
$context['client']['phone'] ='+33785864783';
$context['client']['birthCity'] ='Colmar';
$context['client']['birthPostalCode'] ='68000';
$context['client']['birthCountry'] ='FR';
$context['client']['birthdate'] ='1987-03-27';
$con = json_encode($context);
$con2 = base64_encode($con);*/
echo "ok";
$date = date('d/m/Y:h:i:s');
// contexte commande de la doc
$contextCmd = 'ewogICAiYmlsbGluZyI6ewogICAgICAiZmlyc3ROYW1lIjoiSsOpcsOpbXkiLAogICAgICAibGFzdE5hbWUiOiJHcmltbSIsCiAgICAgICJhZGRyZXNzTGluZTEiOiIzIHJ1ZSBkZSBsJ8OpZ2xpc2UiLAogICAgICAiY2l0eSI6Ik9zdGhlaW0iLAogICAgICAicG9zdGFsQ29kZSI6IjY4MTUwIiwKICAgICAgImNvdW50cnkiOiJGUiIKICAgfSwKICAgInNoaXBwaW5nIjp7CiAgICAgICJmaXJzdE5hbWUiOiJKw6lyw6lteSIsCiAgICAgICJsYXN0TmFtZSI6IkdyaW1tIiwKICAgICAgImFkZHJlc3NMaW5lMSI6IjMgcnVlIGRlIGwnw6lnbGlzZSIsCiAgICAgICJjaXR5IjoiT3N0aGVpbSIsCiAgICAgICJwb3N0YWxDb2RlIjoiNjgxNTAiLAogICAgICAiY291bnRyeSI6IkZSIiwKICAgICAgImVtYWlsIjoiamVyZW02OEBob3RtYWlsLmNvbSIsCiAgICAgICJwaG9uZSI6IiszMy02MTIzNDU2NzgiLAogICAgICAic2hpcEluZGljYXRvciI6ImJpbGxpbmdfYWRkcmVzcyIsCiAgICAgICJkZWxpdmVyeVRpbWVmcmFtZSI6InR3b19kYXkiLAogICAgICAiZmlyc3RVc2VEYXRlIjoiMjAxNy0wMS0yNSIsCiAgICAgICJtYXRjaEJpbGxpbmdBZGRyZXNzIjp0cnVlCiAgIH0sCiAgICJjbGllbnQiOnsKICAgICAgImVtYWlsIjoiamVyZW02OEBob3RtYWlsLmNvbSIsCiAgICAgICJtb2JpbGVQaG9uZSI6IiszMy02MTIzNDU2NzgiLAogICAgICAiYmlydGhDaXR5IjoiQ29sbWFyIiwKICAgICAgImJpcnRoUG9zdGFsQ29kZSI6IjY4MDAwIiwKICAgICAgImJpcnRoQ291bnRyeSI6IkZSIiwKICAgICAgImJpcnRoZGF0ZSI6IjE5ODctMDMtMjciCiAgIH0KfQ==';
// Clé secrète du compte
$cle_secrete = '9CC0C314AA4843441B1E1FB90A1BD992D4AD4A94';
// Générer sceau mac
$mac = "TPE=7199003*contexte_commande=".$contextCmd."*date=".$date."*lgue=FR*mail=contact@modixom.fr*montant=62.73EUR*reference=MODIXOM1234*societe=modixom*texte-libre=ExempleTexteLibre*version=3.0";
echo $mac;
// Calcul du sceau MAC avec HMAC-SHA1
$sceau_mac = hash_hmac('sha1', $mac, $cle_secrete,false);
return $this->render('default/paiement.html.twig', [
"mac"=>$sceau_mac,
'date'=>$date,
'contextCmd'=>$contextCmd
]);
}
/**
* @Route("/retourpaiement", name="retourpaiement")
*/
public function retourpaiement(): Response
{
dd('ok');
}
}