<?php
namespace App\Controller;
use App\Entity\Client;
use App\Entity\Devis;
use App\Entity\DevisActivite;
use App\Entity\DevisClient;
use App\Entity\DevisModaliteCharge;
use App\Entity\DevisSection;
use App\Entity\DevisSousSection;
use App\Entity\SocSociete;
use App\Entity\User;
use App\Service\AdminService;
use App\Service\HomeService;
use App\Service\MailService;
use App\Service\SearchService;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use Dompdf\Dompdf;
use Dompdf\Options;
use App\Service\PasswordHash;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Asset\Packages;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class HomeController extends AbstractController
{
private $entityManager ;
private $searchService ;
private $homeService ;
private $session ;
private $adminService ;
public function __construct(AdminService $adminService, SessionInterface $session, EntityManagerInterface $entityManager, SearchService $searchService, HomeService $homeService)
{
$this->entityManager = $entityManager ;
$this->searchService = $searchService ;
$this->homeService = $homeService ;
$this->session = $session ;
$this->adminService = $adminService ;
}
public function wp_style_hash_password($password) {
// Crée une instance de PasswordHash avec un coût de 8 (similaire à WordPress)
$wp_hasher = new \App\Service\PasswordHash(8, true);
return $wp_hasher->HashPassword(trim($password));
}
#[Route('/', name: 'home_accueil')]
public function index(): Response
{
// dd($this->wp_style_hash_password("Iw1qSGu08V8s")) ;
return $this->render('home/pageAccueil.html.twig', [
'title' => 'Accueil',
'controller' => 'home',
'filename' => 'accueil',
'isBanner' => True,
'backBanner' => 'datas/images/banner/banner-bg.jpg'
]);
}
#[Route('/home/estimation/{refPage}/{isLinkUrl}', name: 'home_estimation_page', defaults:["refPage" => NULL, "isLinkUrl" => NULL])]
public function homePageEstimation($refPage, $isLinkUrl, Request $request): Response
{
// $session = $request->getSession() ;
$sections = $this->entityManager->getRepository(DevisSection::class)->getData() ;
$detailSections = $this->entityManager->getRepository(DevisSection::class)->getDetailSection() ;
$item = $this->session->all() ;
$tableauDevis = [] ;
$numeroDevis = 0 ;
$infoClient = [] ;
$dateDuJour = "" ;
$refArray = [
$this->homeService->encodePage("CRN") => [
"preview" => NULL,
"next" => "CMP"
],
$this->homeService->encodePage("CMP") => [
"preview" => "CRN",
"next" => "CLN"
],
$this->homeService->encodePage("CLN") => [
"preview" => "CMP",
"next" => "TCE"
],
$this->homeService->encodePage("TCE") => [
"preview" => "CLN",
"next" => "SCL"
],
$this->homeService->encodePage("SCL") => [
"preview" => "TCE",
"next" => "FST"
],
$this->homeService->encodePage("FST") => [
"preview" => "SCL",
"next" => "ENR"
],
$this->homeService->encodePage("ENR") => [
"preview" => "FST",
"next" => "DVS"
],
$this->homeService->encodePage("DVS") => [
"preview" => "ENR",
"next" => "END"
],
] ;
if(is_null($isLinkUrl))
{
if($refPage == "undefined" or is_null($refPage))
{
$refPage = $this->homeService->encodePage("CRN") ;
}
else
{
$oldRefPage = $refPage ;
$devis_step = $request->request->get("devis_step") ;
if(is_null($devis_step) or empty($devis_step))
$refPage = $this->homeService->encodePage($refArray[$refPage]["next"]) ;
else
$refPage = $this->homeService->encodePage($refArray[$refPage][$devis_step]) ;
foreach ($request->request as $key => $value) {
// $data[$key] = $value ;
$this->session->set($key,$value) ;
}
if($refPage == $this->homeService->encodePage("DVS"))
{
// Calcul du dévis pour afficher sur le tableau
$tableauDevis = $this->homeService->getCalculatedDevisEstimation() ;
$societe = $this->entityManager->getRepository(SocSociete::class)->find(1) ;
$numeroDevis = $this->entityManager->getRepository(Devis::class)->getNextId($societe) ;
$objDate = new \DateTime() ;
$dateDuJour = $objDate->format("d/m/Y") ;
$this->session->set("devisClient",$tableauDevis) ;
$infoClient = [
"nomSociete" => $request->request->get("devis_societe"),
"nomGerant" => $request->request->get("devis_nom"),
"nif" => $request->request->get("devis_nif"),
"stat" => $request->request->get("devis_stat"),
"addrSociete" => $request->request->get("devis_adresse"),
"telSoc" => $request->request->get("devis_telephone"),
"emailSoc" => $request->request->get("devis_email"),
] ;
}
}
}
if($this->session->get("generate") !== null)
$this->session->clear();
// dd($session->all()) ;
/*
Ensemble des ref Pages :
Création (CRN) => NULL (Première page par défaut)
Comptabilité generale (CMP)
Controle et révision (CLN)
Travaux de cloture (TCE)
Sociale (SCL)
Fiscalite (FST)
Enregistrement (ENR)
Devis (DVS)
*/
return $this->render('home/pageEstimation.html.twig', [
'title' => 'Estimation',
'controller' => 'home',
'filename' => 'estimation',
'backBanner' => 'datas/images/banner/estimation.png',
"sections" => $sections,
"detailSections" => $detailSections,
"refPage" => $refPage,
"isLinkUrl" => $isLinkUrl,
"refArray" => $refArray,
"tableauDevis" => $tableauDevis,
"infoClient" => $infoClient,
"numeroDevis" => $numeroDevis,
"dateDuJour" => $dateDuJour,
]);
}
// #[Route('/home/estimation/save', name: 'home_estimation_page_save')]
// public function homeSaveEstimation(Request $request)
// {
// }
#[Route('/home/termes/condition/user', name: 'home_termes_et_conidtion')]
public function homeTermesEtCondition(): Response
{
return $this->render('home/termesEtConditionUser.html.twig', [
'title' => 'Termes & Conditions',
'controller' => 'home',
// 'filename' => 'estimation',
'backBanner' => 'datas/images/banner/estimation.png',
]);
}
#[Route('/home/espace/membre', name: 'home_espace_membre')]
public function homeEspaceMembre(): Response
{
return $this->render('home/espaceMembre.html.twig', [
'title' => 'Membre',
'controller' => 'home',
// 'filename' => 'estimation',
'backBanner' => 'datas/images/banner/estimation.png',
]);
}
#[Route('/home/generate/pdf', name: 'home_generate_pdf')]
public function homeGeneratePdf(MailService $mailService)
{
// $session = $request->getSession() ;
// dd($this->session->get('checkTermUser')) ;
if($this->session->get('checkTermUser') == "on")
$devis = $this->homeService->saveDevis() ;
else
$devis = $this->entityManager->getRepository(Devis::class)->findOneBy([], ['id' => 'DESC']) ;
// Si saveDevis ne fait pas déjà de flush, faire un flush ici
$this->entityManager->flush();
$client = $this->entityManager->getRepository(Client::class)->getInfoClient($devis->getClient()) ;
$infoClient = [
"nomGerant" => $client["nomGerant"],
"nomSociete" => $client["nomSoc"],
"addrSociete" => $client["adresse"],
"telSoc" => $client["telephone"],
"emailSoc" => $client["email"],
"nif" => $client["nif"],
"stat" => $client["stat"],
] ;
// $societe = $this->entityManager->getRepository(SocSociete::class)->find(1) ;
$numeroDevis = $devis->getNumero() ;
$objDate = new \DateTime() ;
$dateDuJour = $objDate->format("d/m/Y") ;
$devisClient = $this->homeService->getDetailDevis($devis) ;
// Configure Dompdf according to your needs
$pdfOptions = new Options();
$pdfOptions->set('defaultFont', 'Century Gothic');
// Instantiate Dompdf with our options
$dompdf = new Dompdf($pdfOptions);
// $bootstrapCss = $this->generateUrl('app_assets', ['path' => 'assets/vendor/bootstrap/css/bootstrap.css'], true);
$imagePath = $this->convertToBase64('datas/images/logo.png');
$bootstrapCss = $this->renderView('home/bootstrap.html.twig', []);
// $devis = $this->entityManager->getRepository(Devis::class)->find(base64_decode($numeroDevis)) ;
// $infoDevis = $this->entityManager->getRepository(Devis::class)->getResumeDevis([
// "filename" => "baseFile/devis/crmnc_last_data_devis.json",
// "devis" => $devis
// ]) ;
// Retrieve the HTML generated in our twig file
$html = $this->renderView('home/pdf/pdfDevis.html.twig', [
'image_path' => $imagePath,
'bootstrap_css' => $bootstrapCss,
'devisClient' => $devisClient,
'infoClient' => $infoClient,
'numeroDevis' => $numeroDevis,
'dateDuJour' => $dateDuJour,
]);
// Load HTML to Dompdf
$dompdf->loadHtml($html);
// (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
$dompdf->setPaper('A4', 'portrait');
// Render the HTML as PDF
$dompdf->render();
// Output the generated PDF to Browser (force download)
// $dompdf->stream("mypdf.pdf", [
// "Attachment" => true
// ]);
// $filename = 'baseFile/pdf/'.$devis->getNumero().'.pdf' ;
// $message = "
// Bonjour ,
// Nous vous remercions de l’intérêt que vous portez à nos services.
// Veuillez trouver ci-joint le correspondant à vos spécifications ;
// Cordialement,
// Cliquez sur ce lien pour valider : https://crmnc-expert.com/admin/devis/valider
// " ;
// // If you want to store the PDF as a file in your server:
// $output = $dompdf->output();
// file_put_contents($filename, $output);
// $responseMail = $mailService->appSendMail([
// "objet" => "DEVIS CRMNC",
// "destinataire" => "nadiarasolomahandry@gmail.com",
// "message" => $message,
// // "filename" => ,
// ]) ;
// $type = $responseMail ? "green" : "orange" ;
// $responseMessage = $responseMail ? "Traitement effectué" : "Erreur de traitement" ;
// Envoyer le PDF en téléchargement
$dompdf->stream("document.pdf", [
"Attachment" => false
]);
$this->session->set('checkTermUser','off') ;
$this->session->set('generate','ok') ;
// $url = $this->generateUrl('route_name');
// $content = "<script>window.open('{$url}', '_blank'); window.location.href='/';</script>";
// return new Response($content);
return new Response('', 200, [
'Content-Type' => 'application/pdf',
]);
// return new JsonResponse([
// "type" => $type,
// "message" => $responseMessage,
// "pdfName" => base64_encode($devis->getNumero())
// ]) ;
}
#[Route('/home/download/pdf/{pdfName}', name: 'home_download_pdf', defaults:["pdfName" => NULL])]
public function downloadFile($pdfName): BinaryFileResponse
{
$filename = "baseFile/devis/crmnc_last_data_devis.json" ;
if(file_exists($filename))
unlink($filename) ;
// Chemin du fichier PDF dans le dossier public
$filePath = $this->getParameter('kernel.project_dir').'/public/baseFile/pdf/'.base64_decode($pdfName).'.pdf';
// Créer une réponse pour le fichier
$response = new BinaryFileResponse($filePath);
// Optionnel : Définir le nom du fichier lors du téléchargement
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, base64_decode($pdfName).'.pdf');
return $response;
}
public function convertToBase64(string $imagePath): string
{
$imageData = file_get_contents($imagePath);
$base64 = base64_encode($imageData);
$mimeType = mime_content_type($imagePath);
return 'data:' . $mimeType . ';base64,' . $base64;
}
#[Route('/admin/update/user/password/save', name: 'admin_update_user_pass_save')]
public function adminUserPasswordSave(Request $request)
{
$adm_email = $request->request->get("adm_email") ;
$adm_new_password = $request->request->get("adm_new_password") ;
$adm_confirm_password = $request->request->get("adm_confirm_password") ;
// dd($request->request) ;
$isUpdated = $this->entityManager->getRepository(User::class)->updatePassword([
"email" => $adm_email,
"password" => $adm_new_password,
"confirm" => $adm_confirm_password,
]) ;
$user_enrypted = $this->adminService->encodeSession($adm_email) ;
if($isUpdated)
{
$user = $this->entityManager->getRepository(User::class)->findOneBy([
"email" => $adm_email
]) ;
$user->setMdpUpdated(true) ;
$this->entityManager->flush() ;
$mdp_updated = true ;
$this->addFlash('confirm', [
"status" => "success",
"title" => "Mise à jour (MDP)",
"message" => "Mise à jour mot de passe effectué",
]) ;
}
else
{
$mdp_updated = false ;
$this->addFlash('confirm', [
"status" => "danger",
"title" => "Erreur",
"message" => "Vérifiez votre mot de passe",
]) ;
}
return $this->redirectToRoute("admin_update_user_password",[
"user_encrypted" => $user_enrypted,
"mdp_updated" => $mdp_updated,
]) ;
}
#[Route('/admin/update/pass/user/{user_encrypted}', name: 'admin_update_user_password', defaults:["user_encrypted" => NULL])]
public function adminUserPasswordUpdate($user_encrypted)
{
$user_derypted = !is_null($user_encrypted) ? $this->adminService->decodeSession($user_encrypted) : 'testSitraka@gmail.com' ;
$user = $this->entityManager->getRepository(User::class)->findOneBy([
"email" => $user_derypted
]) ;
return $this->render('admin/user/updatePassword.html.twig', [
"titlePage" => "Réinitialisation Mot de passe",
"username" => $user_derypted,
"mdp_updated" => is_null($user->isMdpUpdated()) ? false : $user->isMdpUpdated(),
]);
}
#[Route('/admin/send/reset/password/{user_encrypted}', name: 'admin_send_reset_pass', defaults:["user_encrypted" => NULL])]
public function adminUserSendResetPassword($user_encrypted)
{
// $user_encrypted = $request->request->get("user_encrypted") ;
// dd($request->request) ;
$lien = $this->generateUrl(
'admin_update_user_password',
['user_encrypted' => $user_encrypted],
UrlGeneratorInterface::ABSOLUTE_URL
);
$user = $this->entityManager->getRepository(User::class)->findOneBy([
"email" => $this->adminService->decodeSession($user_encrypted)
]) ;
$user->setMdpUpdated(false) ;
$this->entityManager->flush() ;
$message = $this->renderView('admin/user/templateLinkMessage.html.twig', [
'lien' => $lien,
'user' => $user,
'user_encrypted' => $this->adminService->decodeSession($user_encrypted),
]);
// $mailService->appSendMail([
// "destinataire" =>$this->adminService->decodeSession($user_encrypted) ,
// "objet" => "Réinitialisation Mot de Passe",
// "message" => $message,
// ]) ;
// $filename = "distribution_mail.txt" ;
// if(!file_exists($filename))
// file_put_contents($filename,$message) ;
$texte = $this->session->get("distribution_texte") ;
$texte = isset($texte) ? $texte : "" ;
$texte .= "</br>".$message ;
$this->session->set("distribution_texte",$texte) ;
$this->addFlash('confirm', [
"status" => "success",
"title" => "Texte Email",
"message" => "Texte mis à jour",
]) ;
return $this->redirectToRoute("adm_params_utiliateurs") ;
}
}