<?php
namespace App\Controller;
use App\Entity\AifredRestaurants;
use App\Entity\GiftCards;
use App\Entity\QrRedirection;
use App\Entity\User;
use App\Entity\UserRestaurant;
use App\Repository\RestaurantsRepository;
use App\Services\EventLog;
use App\Services\Postgre;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Dompdf\Dompdf;
use Dompdf\Options;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use App\Repository\UserRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Validator\Constraints\Date;
class PageController extends AbstractController
{
private $user;
private $user_vendor;
private $userCurrent;
private $user_vendors=[];
private $urid_selected="";
private $user_restaurants=[];
private $user_restaurant=[];
private $nav=[];
/**
* PageController constructor.
* @param Security $security
* @param UserRepository $userRepository
* @param Postgre $postgre
*/
public function __construct(Security $security, EntityManagerInterface $em){
$this->user = $security->getUser();
$this->userCurrent = $this->user ;
// dd($this->user);
// $this->user = $this->getDoctrine()->getRepository(User::class)->find($securityUser->id);
if (!is_null($this->user)) {
// recuperer les userRestaurant par order de num_order ou id
$this->userCurrent = $this->user;
if(in_array(User::ROLE_ADMIN,$this->user->getRoles())){
$this->userCurrent =$em->getRepository(User::class)->find($this->userCurrent->getUserId());
}
$UserRestaurants = $em->getRepository(UserRestaurant::class)->findBy(['user'=>$this->userCurrent],["num_order"=>"ASC","id"=>"ASC"]);
//recuperation de tous les restaurants associer (aifred ou corporate)
$this->user_restaurants=[];
foreach ( $UserRestaurants as $uResto){
$key = $uResto->getId();
$this->user_restaurants[$key]["id"]=$uResto->getId();
$this->user_restaurants[$key]["corporate"]=[];
$this->user_restaurants[$key]["michelin"]=[];
$this->user_restaurants[$key]["user"]["name"]=$uResto->getUser()->getEmail();
$this->user_restaurants[$key]["user"]["ur_id"]=$uResto->getUser()->getUrId();
if(!is_null($uResto->getRestaurant())){
$this->user_restaurants[$key]["corporate"]["name"]=$uResto->getRestaurant()->getName();
$this->user_restaurants[$key]["corporate"]["prefix"]=$uResto->getRestaurant()->getShopCode();
$this->user_restaurants[$key]["corporate"]["vendor"]=$uResto->getRestaurant()->getShopifyVendorName();
$this->user_restaurants[$key]["corporate"]["id"]=$uResto->getRestaurant()->getId();
$this->user_restaurants[$key]["corporate"]["city"]=$uResto->getRestaurant()->getCity();
$this->user_restaurants[$key]["corporate"]["report"]=''; // que sur aifred_restaurant
}
if(!is_null($uResto->getAiRestaurant())){
$this->user_restaurants[$key]["michelin"]["name"]=$uResto->getAiRestaurant()->getName();
$this->user_restaurants[$key]["michelin"]["prefix"]=$uResto->getAiRestaurant()->getTrigram();
$this->user_restaurants[$key]["michelin"]["vendor"]=$uResto->getAiRestaurant()->getShopifyVendor();
$this->user_restaurants[$key]["michelin"]["id"]=$uResto->getAiRestaurant()->getId();
$this->user_restaurants[$key]["michelin"]["city"]=$uResto->getAiRestaurant()->getCity();
$this->user_restaurants[$key]["michelin"]["report"]=$uResto->getAiRestaurant()->getLookerStudioUrl();
$this->user_restaurants[$key]["michelin"]["typeform_password"]=$uResto->getAiRestaurant()->getTypeformPassword();
}
}
// dd($UserRestaurants,$this->user_restaurants);
if ($this->user == "NULL") {
return $this->redirectToRoute("app_login");
}
$UserRestaurants = $this->user_restaurants ;
$UserRestaurant = array_shift($this->user_restaurants) ;
$urid_selected = $UserRestaurant["id"]??null;
if(null !== $this->user->getUrId()){
$urid_selected = $this->user->getUrId();
$UserRestaurant = $UserRestaurants[$this->user->getUrId()] ;
}
/*
dd([
'userCurrent'=>$this->userCurrent->getUrId(),
'user'=>$this->user->getUrId(),
'$UserRestaurant'=>$UserRestaurant,
'UserRestaurants'=>$UserRestaurants
]);
*/
$this->user_restaurant = $UserRestaurant;
if(null !== $UserRestaurant ){
$vendor_name = !empty($UserRestaurant["michelin"])?$UserRestaurant["michelin"]["name"] :$UserRestaurant["corporate"]["name"];
$vendor_city = !empty($UserRestaurant["michelin"])?$UserRestaurant["michelin"]["city"] :$UserRestaurant["corporate"]["city"];
$vendor_prefix = $UserRestaurant["michelin"] ? $UserRestaurant["michelin"]['prefix']:$UserRestaurant["corporate"]['prefix'];
}else{
$vendor_name = $this->user->getUsername();
$vendor_city ="";
$vendor_prefix ="";
}
// $vendorsCurrent = $this->user->getShopifyVendorName();
//$resultStripe = $postgre->query("SELECT stripe_connect_account_id FROM restaurants WHERE shopify_vendor_name='".str_replace("'","''",$this->user_vendor)."'");
// $resultStripe =[];
$this->nav = [
'user_restaurants' => $UserRestaurants,
'user_restaurant' => $UserRestaurant,
'urid_selected' => $urid_selected,
'vendor_name' => $vendor_name,
'vendor_city' => $vendor_city,
'prefix' =>$vendor_prefix,
// 'stripe_id' => (!empty($resultStripe[0]) ?$resultStripe[0]["stripe_connect_account_id"]:""),
'user' => $this->user,
'userCurrent' => $this->userCurrent
];
}
$this->em = $em;
//instance
// $this->EventLog = new EventLog($em, $this->user );
}
public function renderHtml($view, $params=[]){
$params = array_merge($params,$this->nav);
return $this->render($view, $params);
}
/**
* @Route("/", name="home")
* @param UserRepository $userRepository
* @param Postgre $postgre
* @return Response
*/
public function index(UserRepository $userRepository)
{
$members=[];
if(in_array(User::ROLE_ADMIN,$this->user->getRoles())) {
// $members = $this->em->getRepository(User::class)->findAllByMemberUR();
// $members = $this->em->getRepository(User::class)->findUsersWithRestaurants();
$members = $this->em->getRepository(User::class)->findEmailsGroupedByRestaurant();
}
$vendors = $userRepository->getVendors();
return $this->renderHtml('page/index.html.twig', [
'members' => $members,
'vendors' => $vendors,
'user' => $this->user
]);
// }
//return $this->renderHtml('page/stats.html.twig');
}
/**
* @Route("/gestion-des-comptes", name="manage_users")
*/
public function manage_users(UserRepository $membresEntity):Response
{
if (!isset($this->user) || empty($this->user)) {
return $this->redirectToRoute("app_login");
}
if(!in_array(User::ROLE_DEV,$this->user->getRoles())){
return $this->redirectToRoute("home");
}
//recuperer les users
$membres = $membresEntity->findBy(array(), array('id' => 'DESC'));
return $this->renderHtml('page/members.html.twig', [
'members' => $membres,
'user' => $this->user
]);
}
/**
* @Route("/gestion-des-comptes/{action}/{id?}", name="manage_user")
*/
public function manage_user(string $action, User $membreEntity=null):Response
{
//edit , add, delete
if (!isset($this->user) || empty($this->user)) {
return $this->redirectToRoute("app_login");
}
if(!in_array(User::ROLE_DEV,$this->user->getRoles())){
return $this->redirectToRoute("home");
}
$url="";
$is_url=false;
if($membreEntity !==null && $membreEntity->getToken()!==null){
$url= $this->generateUrl('resetting', ['id' => $membreEntity->getId(), 'token' => $membreEntity->getToken()], UrlGeneratorInterface::ABSOLUTE_URL);
$is_url=ResettingController::isRequestInTime($membreEntity->getPasswordRequestedAt());
}
return $this->renderHtml('page/member.html.twig', [
'member' => $membreEntity,
'url'=>$url,
'is_url'=> $is_url ,
'action'=>$action,
'user' => $this->user
]);
}
/**
* @Route("/user/saving", name="update_user")
*/
public function update_user(Request $request):RedirectResponse{
if (!isset($this->user) || empty($this->user)) {
return $this->redirectToRoute("app_login");
}
$formDatas = $request->request->all();
$formDatas["vendor"] = join("|",$formDatas["vendors"]);
unset( $formDatas["vendors"]);
if( $formDatas["password"]===""){
unset( $formDatas["password"]);
}
$formDatas["save"]=true;
$rep = $this->controllerApiTiptoque('postRegister', [], json_encode(["user"=>$formDatas]));
// dd( json_encode(["user"=>$formDatas]),$rep);
if(isset($rep['user']['id'])){
return $this->redirectToRoute("manage_user",['action'=>'edit','id'=>$rep['user']['id']]);
}else{
return $this->redirectToRoute("manage_users");
}
}
/**
* @Route("/rapport", name="rapport_seo")
*/
public function rapport_seo(SessionInterface $session,Request $request):Response
{
if (!isset($this->user) || empty($this->user)) {
return $this->redirectToRoute("app_login");
}
$choices_date = $session->get("choices_date", 'last_30_days');
$mode_display = $session->get("mode_display", "STANDARD");
$formDatas = $request->request->all();
if(isset($formDatas["format_date"]) && $formDatas["format_date"]!==""){
$choices_date = $formDatas["format_date"];
}
if(isset($formDatas["mode_display"])){
$mode_display = $formDatas["mode_display"];
// ALL_GIFTCARD , STANDARD ou DEBUG
}
$session->set("choices_date", $choices_date);
$session->set("mode_display", $mode_display);
$now = new DateTime();
switch ($choices_date){
case "now":
$date_start = $now->format('Y-m-d 00:00:00');
$date_end = $now->format('Y-m-d 23:59:59');
break;
case "yesterday":
$yesterday = $now->modify('-1 day');
$date_start = $yesterday->format('Y-m-d 00:00:00');
$date_end = $yesterday->format('Y-m-d 23:59:59');
break;
case "last_30_days":
$date_end = $now->format('Y-m-d h:i:s'); // Revenir à aujourd'hui pour la fin
$date_start = $now->modify('-30 days')->format('Y-m-d 00:00:00');
break;
case "last_12_months":
$date_end = $now->format('Y-m-d h:i:s'); // Revenir à aujourd'hui pour la fin
$date_start = $now->modify('-12 months')->format('Y-m-d 00:00:00');
break;
case "last_24_months":
$date_end = $now->format('Y-m-d h:i:s'); // Revenir à aujourd'hui pour la fin
$date_start = $now->modify('-24 months')->format('Y-m-d 00:00:00');
break;
default:
// Valeurs par défaut si aucune correspondance
$date_start = $now->format('Y-m-d 00:00:00');
$date_end = $now->format('Y-m-d 23:59:59');
break;
}
$restaurant_id = isset( $this->user_restaurant["corporate"]['id']) ?$this->user_restaurant["corporate"]['id'] : null;
$airestaurant_id = isset( $this->user_restaurant["michelin"]['id']) ?$this->user_restaurant["michelin"]['id'] : null;
if(in_array(User::ROLE_ALL_GIFTCARD ,$this->user->getRoles() ) && !in_array(User::ROLE_ADMIN ,$this->user->getRoles() )){
$mode_display = "ALL_GIFTCARD";
}
// dd( $mode_display);
$giftCards = $this->em->getRepository(GiftCards::class)->getGiftCardTransactions(
$restaurant_id,$airestaurant_id,
$date_start,$date_end,$mode_display);
/*
$userRestaurant = $this->em->getRepository(UserRestaurant::class)->findBy(['user'=>$this->user]);
ancienne version avec le iframe par looker studioUrl
$lookerStudioUrl ="";
if(!empty($userRestaurant)){
$lookerStudioUrl = $this->user_restaurant["michelin"]["report"];
}
*/
//recuperer les giftcards avec 2 tables
// dd($this->userCurrent);
//ou trouver le rapport ....
return $this->renderHtml('page/rapport.html.twig', [
"giftCards"=>$giftCards,
"choices_date"=>$choices_date,
"mode_display"=>$mode_display
]);
}
/**
* @Route("/rapport/pdf/{order_id}", name="invoice_pdf")
*/
public function invoice_pdf(string $order_id):Response{
if (!isset($this->user) || empty($this->user)) {
return $this->redirectToRoute("app_login");
}
// verifier si l invoice est que pour ce user
// Exemple de données pour la facture
$invoiceData = [
'id' => $order_id,
'date' => (new \DateTime())->format('Y-m-d'),
'customer' => 'John Doe',
'items' => [
['description' => 'Produit A', 'quantity' => 2, 'price' => 50],
['description' => 'Produit B', 'quantity' => 1, 'price' => 100],
],
'total' => 200,
];
// Options de configuration pour Dompdf
$options = new Options();
$options->set('defaultFont', 'Arial');
$dompdf = new Dompdf($options);
// Génération du contenu HTML pour le PDF
$html = $this->render('pdf/invoice.html.twig', [
'invoice' => $invoiceData,
]);
// Charger le HTML dans Dompdf
$dompdf->loadHtml($html);
// (Optionnel) Définir la taille et l'orientation de la page
$dompdf->setPaper('A4', 'portrait');
// Générer le PDF
$dompdf->render();
// Créer une réponse HTTP avec le contenu du PDF
return new Response(
$dompdf->output(),
200,
[
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="invoice_' . $order_id . '.pdf"',
]
);
}
/**
* @Route("/rapport/csv", name="rapport_csv")
*/
public function rapport_csv(SessionInterface $session):Response{
if (!isset($this->user) || empty($this->user)) {
return $this->redirectToRoute("app_login");
}
$choices_date = $session->get("choices_date", 'last_12_days');
$mode_display = $session->get("mode_display", "STANDARD");
$now = new DateTime();
switch ($choices_date){
case "now":
$date_start = $now->format('Y-m-d 00:00:00');
$date_end = $now->format('Y-m-d 23:59:59');
$title_csv = $now->format('Y-m-d');
break;
case "yesterday":
$yesterday = $now->modify('-1 day');
$date_start = $yesterday->format('Y-m-d 00:00:00');
$date_end = $yesterday->format('Y-m-d 23:59:59');
$title_csv = $now->format('Y-m-d');
break;
case "last_30_days":
$date_end = $now->format('Y-m-d h:i:s'); // Revenir à aujourd'hui pour la fin
$title_csv = $now->format('Y-m-d');
$date_start = $now->modify('-30 days')->format('Y-m-d 00:00:00');
$title_csv .="_".$now->format('Y-m-d');
break;
case "last_12_months":
$date_end = $now->format('Y-m-d h:i:s'); // Revenir à aujourd'hui pour la fin
$title_csv = $now->format('Y-m-d');
$date_start = $now->modify('-12 months')->format('Y-m-d 00:00:00');
$title_csv .= "_".$now->format('Y-m-d');
break;
case "last_24_months":
$date_end = $now->format('Y-m-d h:i:s'); // Revenir à aujourd'hui pour la fin
$title_csv = $now->format('Y-m-d');
$date_start = $now->modify('-24 months')->format('Y-m-d 00:00:00');
$title_csv .= "_".$now->format('Y-m-d');
break;
default:
// Valeurs par défaut si aucune correspondance
$date_start = $now->format('Y-m-d 00:00:00');
$date_end = $now->format('Y-m-d 23:59:59');
break;
}
if(in_array(User::ROLE_ALL_GIFTCARD ,$this->user->getRoles() )){
$mode_display = "ALL_GIFTCARD";
}
$restaurant_id = isset( $this->user_restaurant["corporate"]['id']) ?$this->user_restaurant["corporate"]['id'] : null;
$airestaurant_id = isset( $this->user_restaurant["michelin"]['id']) ?$this->user_restaurant["michelin"]['id'] : null;
$giftCards = $this->em->getRepository(GiftCards::class)->getGiftCardTransactions(
$restaurant_id,$airestaurant_id,
$date_start,$date_end, $mode_display);
$data=[
["Date", "N° de commande", "Code de la carte", "Montant", "Date de règlement", "Statut du règlement"]
];
foreach ($giftCards as $giftCard){
$dateTransaction = new DateTime($giftCard['transaction_date']);
$dateCreation = new DateTime($giftCard['creation_date']);
array_push($data,[
$mode_display == "STANDARD" ?$dateTransaction->format('d/m/Y'):$dateCreation->format('d/m/Y')
,
$giftCard['orders_name'],
$giftCard['code'],
$giftCard['original_balance'],
$giftCard['transaction_id'] =='' ?"":$dateTransaction->format('d/m/Y'),
$giftCard['transaction_id'] =='' ?"non utilisé":"payé"
]);
}
// Génération du contenu CSV
$csvContent = $this->generateCsv($data);
// Création d'une réponse HTTP pour le téléchargement du fichier
$response = new Response($csvContent);
// Configuration des en-têtes pour le fichier CSV
$response->headers->set('Content-Type', 'text/csv; charset=UTF-8');
$response->headers->set('Content-Disposition', 'attachment; filename="rapport_' . $title_csv . '.csv"');
return $response;
}
/**
* Génère le contenu CSV à partir d'un tableau de données
*/
private function generateCsv(array $data): string
{
// Utilisation de la fonction PHP output buffering pour générer le CSV
ob_start();
$output = fopen('php://output', 'w');
foreach ($data as $row) {
fputcsv($output, $row);
}
fclose($output);
return ob_get_clean();
}
/**
* @Route("/carte_cadeau", name="gift_card")
*/
public function gift_card(Request $request):Response
{
if (empty($this->user)) {
return $this->redirectToRoute("app_login");
}
// $userCurrent = $this->em->getRepository(UserRestaurant::class)->findBy(["user"=>$this->user]);
$giftcard=[];
if($request->getMethod()=="POST"){
// cree l url du typeform dans qr_redirection
$code = $request->request->get("code");
$code = trim($code);
if($code !==''){
/** @var GiftCards[] $giftcards */
$giftcards = $this->em->getRepository(GiftCards::class)->findBy(['code'=>$code]);
$giftcard= $giftcards[0]??[];
if($giftcard!==[]){
$shopCode = $giftcard->getShopCode();
if($shopCode==="CCT"){
$shopCode = $shopCode.'_LOGGED';
}
$qrRedir = $this->em->getRepository(QrRedirection::class)->find('GCA'.$shopCode);
$gcaUrl = $qrRedir->getTarget();
/*
https://tiptoque.typeform.com/to/x9iRwMho#num_carte_cadeau=FAH_6148510482774_0
&solde_restant=362
&vendor=Chef Kelly Rangama
&restaurant=Faham
&expiration=Non
&date_expiration=04/07/2025
&prid=1670321471830
&nomcarte=Menu Insulaire (4 séquences) - accords mets et vins
erreur
https://tiptoque.typeform.com/to/ToCWEu4A#
num_carte_cadeau=LODASROUEN_11411244286336_0
&solde_restant=190
&vendor=Restaurant L Odas - Rouen
&restaurant=L'Odas&expiration=Non
&date_expiration=05/01/2026
&prid=14957864550784
&nomcarte=DE L’ODAS EN 5 SERVICES - 2 personnes
dans un autre script
$page_to='https://tiptoque.typeform.com/to/ToCWEu4A#
num_carte_cadeau='.$gift_card[0]['code'].
'&product_name='.$product_name.
'&solde_restant='.$gift_card[0]['balance'].
'&vendor='.$gift_card[0]['vendor'].
'&restaurant='.$password_restaurant[0]['name'].
'&date_expiration='.$formatted_date.
'&nomcarte='.$gift_card[0]['code'];
-->GCACCT_LOGGED
https://tiptoque.typeform.com/to/ToCWEu4A#num_carte_cadeau=__CARD_NUM__
&solde_restant=__BALANCE__
&vendor=__VENDOR__
&restaurant=__RESTAURANT__
&expiration=__EXPIRED__
&date_expiration=__EXPIRATION__
&prid=__PRID__
&product_name=__PNAME__
&nomcarte=__PNAME__
* */
$restaurantName =$this->user_restaurant["michelin"] ? $this->user_restaurant["michelin"]['name']:$this->user_restaurant["corporate"]['name'];
$dateNow = new \DateTime();
$isExpired = ($dateNow->getTimestamp()>$giftcard->getExpirationDate()->getTimestamp())?"Oui":"Non";
$gcaUrl=str_replace( "__CARD_NUM__",$giftcard->getCode(),$gcaUrl);
$gcaUrl=str_replace( "__BALANCE__",$giftcard->getBalance(),$gcaUrl);
$gcaUrl=str_replace( "__VENDOR__",$giftcard->getVendor(),$gcaUrl);
$gcaUrl=str_replace( "__RESTAURANT__",$restaurantName,$gcaUrl);
$gcaUrl=str_replace( "__EXPIRED__",$isExpired,$gcaUrl);
$gcaUrl=str_replace( "__EXPIRATION__",$giftcard->getExpirationDate()->format("d/m/Y"),$gcaUrl);
$gcaUrl=str_replace( "__PRID__",$giftcard->getProductsId(),$gcaUrl);
$gcaUrl=str_replace( "__PNAME__",$giftcard->getProductName(),$gcaUrl);
if(isset($this->user_restaurant["michelin"])){
$gcaUrl=str_replace( "__PASSWORD__",$this->user_restaurant["michelin"]['typeform_password'],$gcaUrl);
}
}
}
}
// dd($formDatas);
//ou trouver le rapport ....
return $this->renderHtml('page/giftcard.html.twig', [
'giftcard' =>$giftcard,
'gcaUrl' =>$gcaUrl ?? '',
'prefix' =>$this->user_restaurant["michelin"] ? $this->user_restaurant["michelin"]['prefix']:$this->user_restaurant["corporate"]['prefix']
]);
}
/**
* @Route("/user/deleted/{id}", name="delete_user")
*/
public function delete_user(int $id):RedirectResponse{
if (!isset($this->user) || empty($this->user)) {
return $this->redirectToRoute("app_login");
}
// dd( json_encode(["user"=>$formDatas]),$rep);
$entityManager = $this->getDoctrine()->getManager();
$member = $entityManager->getRepository(User::class)->find($id);
$entityManager->remove($member);
$entityManager->flush();
return $this->redirectToRoute("manage_users");
}
/**
* @Route("/mes-commandes", name="orders")
*/
public function orders():Response
{
$dateDujour = explode("/",date("Y/m/d/"));
$dateDemain = explode("/",date("Y/m/d/",strtotime("+1 DAY")));
return $this->renderHtml('tcd/index.html.twig', [
'annee_n'=>$dateDujour[0],
'mois_n'=>$dateDujour[1],
'jour_n'=>$dateDujour[2],
'annee_t'=>$dateDemain[0],
'mois_t'=>$dateDemain[1],
'jour_t'=>$dateDemain[2]
]);
}
/**
* @Route("/mes-commandes/{annee}/{mois}/{jour}", name="orders_date")
* @param $annee
* @param $mois
* @param $jour
* @return Response
*/
public function orders_date($annee, $mois, $jour):Response
{
return $this->renderHtml('tcd/date.html.twig', ['annee' => $annee, 'mois' => $mois, 'jour' => $jour]);
}
/**
* @Route("/change-vendor", name="change_vendor")
* @param Request $request
* @return RedirectResponse
*/
public function changeVendor(Request $request):RedirectResponse
{
if (!isset($this->user) || empty($this->user)) {
return $this->redirectToRoute("app_login");
}
$urSelected = $request->request->get("urid");
// dd($urSelected);
// exit($urSelected);
$this->user->setUrId($urSelected);
$this->em->persist($this->user);
$this->em->flush();
return $this->redirectToRoute("home");
}
/**
* @Route("/change-member", name="change_member")
* @param Request $request
* @return RedirectResponse
*/
public function changeMember(Request $request):RedirectResponse
{
if (!isset($this->user) || empty($this->user)) {
return $this->redirectToRoute("app_login");
}
if(!in_array(User::ROLE_ADMIN,$this->user->getRoles())){
return $this->redirectToRoute("home");
}
$userSelected = $request->request->get("user_id");
$this->user->setUrId(null);
$this->user->setUserId($userSelected);
$this->em->persist($this->user);
$this->em->flush();
return $this->redirectToRoute("home");
}
/**
* @Route("/cache/init", name="initCacheProduct")
* @param Request $request
* @return RedirectResponse
*/
public function initCacheProduct(Request $request):RedirectResponse
{
$dirCacheJson = '../var/cache/' . $_ENV['APP_ENV'] . '/products';
$fileCacheJson = $dirCacheJson . '/' . ApiController::strToHandle($this->user_vendor) . '.json';
if (\is_file($fileCacheJson)) {
unlink($fileCacheJson);
}
//recharge le json
$this->forward(ApiController::class . '::getProducts');
return $this->redirectToRoute("home");
}
/**
* @Route("/mes_menus_et_mes_cartes", name="products")
* @param UserRepository $userRepository
* @return Response
*/
public function products(UserRepository $userRepository):Response
{
if(in_array(User::ROLE_USER_OPS,$this->user->getRoles())){
return $this->redirectToRoute("home");
}
//prepare dossier temporaire pour les updload image
$directoryTmp = $this->getParameter("upload_tmp");
if (!is_dir($directoryTmp)) {
mkdir($directoryTmp);
}
$directoryTmpVendor = $directoryTmp . ApiController::strToHandle($this->user_vendor) . '/';
if (is_dir($directoryTmp)) {
$this->deleteDirectory($directoryTmpVendor);
}
$responseJson = $this->forward(ApiController::class . '::getSettings', ["type" => "allergens"]);
$allergens = json_decode($responseJson->getContent(), true);
$vendors = $userRepository->getVendors();
$daysWeek = ["Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"];
$daysWeekMin = ["Lu", "Ma", "Me", "Je", "Ve", "Sa", "Di"];
$timesSlot = ["10h - 12h", "12h - 14h", "14h - 16h", "16h - 18h", "18h - 20h"];
$intervalsSlot = [[10, 11], [12, 13], [14, 15], [16, 17], [18, 19]];
//recuperer les produits avec le json de apiController
$responseJson = $this->forward(ApiController::class . '::getProducts');
$datas = json_decode($responseJson->getContent(), true);
// $types = json_decode($this->forward(ApiController::class . '::getCategories')->getContent(), true);
$types = ApiController::getTypes();
// $gammes = ApiController::getTypes();
//supprimer les produits autres
$types = array_filter($types, function ($element) {
return ($element["code"] != "XX" && $element["code"] != "09");
});
if (!isset($datas["products"])) {
$datas["products"] = [];
}
$typesProductOrder = [
["show" => true, "title" => "Mes menus", "type_slug" => "menu", "type" => "Menu", "sort" => ["Menu"]],
["show" => false, "title" => "A la carte", "type_slug" => "a-la-carte", "type" => "A la carte", "sort" => ["Entrée", "Plat", "Dessert"]],
["show" => false, "title" => "A partager", "type_slug" => "a-partager", "type" => "A partager", "sort" => ["A partager"]],
["show" => false, "title" => "Autres articles", "type_slug" => "autre-article", "type" => "Autre article", "sort" => ["Autre article"]],
["show" => false, "title" => "Vins, sipiritueux et autres alcools", "type_slug" => "boissons-alcoolise", "type" => "Boissons alcoolisé" , "sort" => [ "Vin blanc","Vin rosé","Vin rouge","Bière","Champagne et bulle","Spiritueux","Autre boisson alcoolisée"]],
["show" => false, "title" => "Boissons non alcoolisees", "type_slug" => "boissons-non-alcoolise", "type" => "Boissons non alcoolisé", "sort" => ["Eau minérale","Soft"]],
];
$listeTypeProducts = [];
foreach ($typesProductOrder as $type_index => $typesorder) {
$cptProduct = 0;
$listeTypeProducts[$type_index]["types"] = $typesorder["sort"];
$listeTypeProducts[$type_index]["type"] = $typesorder["type"];
$listeTypeProducts[$type_index]["type_slug"] = $typesorder["type_slug"];
$listeTypeProducts[$type_index]["title"] = $typesorder["title"];
$listeTypeProducts[$type_index]["show"] = $typesorder["show"];
foreach ($typesorder["sort"] as $typeorder) {
if (isset($datas["types"][$typeorder]) && !empty($datas["types"][$typeorder])) {
foreach ($datas["types"][$typeorder] as $product_id) {
if (empty($datas["products"][$product_id]["tags"]) || in_array(ApiController::TAG_MENU_ITEM, $datas["products"][$product_id]["tags"])) {
continue;
}
// obliger d avoir l offre particulier
if(in_array(ApiController::TAG_OFFRE_PARTICULIER, $datas["products"][$product_id]["tags"])) {
$listeTypeProducts[$type_index]["products"][$product_id] = $datas["products"][$product_id];
$cptProduct++;
}
}
}
}
$listeTypeProducts[$type_index]["total"] = $cptProduct;
}
return $this->renderHtml('page/products.html.twig', [
'tag_particulier'=>ApiController::TAG_OFFRE_PARTICULIER,
'vendors' => $vendors,
'daysWeekMin' => $daysWeekMin,
'daysWeek' => $daysWeek,
'timesSlot' => $timesSlot,
'intervalsSlot' => $intervalsSlot,
'allergens' => $allergens,
'menuItems' => $datas["products"],
'types_products' => $listeTypeProducts
]);
}
/**
* @Route("/mes_jours_d_ouvertures", name="disponibility")
* @param UserRepository $userRepository
* @return Response
*/
public function disponibility(UserRepository $userRepository):Response
{
//prepare dossier temporaire pour les updload image
$directoryTmp = $this->getParameter("upload_tmp");
if (!is_dir($directoryTmp)) {
mkdir($directoryTmp);
}
$directoryTmpVendor = $directoryTmp . ApiController::strToHandle($this->user_vendor) . '/';
if (is_dir($directoryTmp)) {
$this->deleteDirectory($directoryTmpVendor);
}
$responseJson = $this->forward(ApiController::class . '::getSettings', ["type" => "allergens"]);
$vendors = $userRepository->getVendors();
$daysWeek = ["Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"];
$daysWeekMin = ["Lu", "Ma", "Me", "Je", "Ve", "Sa", "Di"];
//TODO reflechir a gerer les horaires par une base de donnée en postgre pour des configs special pour ic_configs (label,value)?
$timesSlot = ["10h - 12h", "12h - 14h", "14h - 16h", "16h - 18h", "18h - 20h"];//, "20h - 22h"
$intervalToString = [
"10-11" => "10h - 12h",
"12-13" => "12h - 14h",
"14-15" => "14h - 16h",
"16-17" => "16h - 18h",
"18-19" => "18h - 20h"
];
/*,"20-21" => "20h - 22h"*/
//INFO liste interval autoriser pour la page des disponiblités
$intervalsSlot = [[10, 11], [12, 13], [14, 15], [16, 17], [18, 19]];//, [20, 21]
//recuperer les produits avec le json de apiController
$responseJson = $this->forward(ApiController::class . '::getProducts');
$datas = json_decode($responseJson->getContent(), true);
// $types = json_decode($this->forward(ApiController::class . '::getCategories')->getContent(), true);
$types = ApiController::getTypes();
//supprimer les produits autres
$types = array_filter($types, function ($element) {
return ($element["code"] != "XX" && $element["code"] != "09");
});
if (!isset($datas["products"])) {
$datas["products"] = [];
}
//preparer de l arborescence pour generer un tableau pour le formulaire
$disponibility = [];
if (isset($datas["disponibilities"]) && !empty($datas["disponibilities"])) {
foreach ($datas["disponibilities"] as $type => $dispoDays) {
foreach ($intervalsSlot as $intervalSlot) {
foreach ($daysWeek as $day) {
$index_interval = join("-", $intervalSlot);
if (isset($dispoDays[$day]) && !empty($dispoDays[$day])) {
$dispoHours = $dispoDays[$day]["hours"];
if(isset( $dispoHours) && !empty( $dispoHours)){
foreach ($dispoHours as $hour) {
if (intVal($hour) >= $intervalSlot[0] && intVal($hour) < $intervalSlot[1] || intVal($hour) == $intervalSlot[1] ) {
// $disponibility[$type][$keyTimeSlot][$keyDay]["status"] = true;
$disponibility[$day][$index_interval][$type] = true;
} else {
if (!isset($disponibility[$day][$index_interval][$type])) {
// $disponibility[$type][$keyTimeSlot][$keyDay]["status"] = false;
$disponibility[$day][$index_interval][$type] = false;
}
}
}
}else{
$disponibility[$day][$index_interval][$type] = false;
}
} else {
$disponibility[$day][$index_interval][$type] = false;
}
}
}
}
}
return $this->renderHtml('page/disponibilities.html.twig', [
'vendors' => $vendors,
'daysWeekMin' => $daysWeekMin,
'daysWeek' => $daysWeek,
'timesSlot' => $timesSlot,
'intervalToString' => $intervalToString,
'disponibility' => $disponibility
]);
}
/**
* @Route("/mes_menus_et_mes_cartes/edit/{id?}", name="product_edit")
* @param null $id
* @param UserRepository $userRepository
* @return Response
*/
public function productForm($id = null, UserRepository $userRepository):Response
{
if(in_array(User::ROLE_USER_OPS,$this->user->getRoles())){
return $this->redirectToRoute("home");
}
$directoryTmp = $this->getParameter("upload_tmp");
if (!is_dir($directoryTmp)) {
mkdir($directoryTmp);
}
$directoryTmpVendor = $directoryTmp . ApiController::strToHandle($this->user_vendor) . '/';
if (is_dir($directoryTmp)) {
$this->deleteDirectory($directoryTmpVendor);
}
$title_page = "Ajouter un produit";
$theme = $_GET["t"] ?? "autre-article";
$typesProductOrder = [
"add" => "Ajouter un produit",
"menu" => "ajouter un menu",
"a-la-carte" => "ajouter un produit à la carte",
"entree" => "ajouter un produit à la carte",
"plat" => "ajouter un produit à la carte",
"dessert" => "ajouter un produit à la carte",
"a-partager" => "ajouter un produit à partager",
"autre-article" => "ajouter un produit",
"boissons-alcoolise" => "ajouter un vin, sipiritueux et autre alcool",
"boissons-non-alcoolise" => "ajouter une boisson non alcoolisée"
];
//recuperer les produits avec le json de apiController
$responseJson = $this->forward(ApiController::class . '::getProducts');
$datas = json_decode($responseJson->getContent(), true);
$types = ApiController::getTypes();
$menu_items = [];
if (is_null($id) || !isset($datas["products"][$id]) || empty($datas["products"][$id])) {
if ($theme != "a-la-carte") {
$types_selected = array_filter($types, function ($type) use ($theme) {
return $type["slug"] == $theme;
});
$types_selected = array_shift($types_selected);
}
$product = ["id" => "Add","title" => "","disponibility_dates" => "","max_per_day" => "","price" => "","type" => $types_selected["type"] ?? "","allergens" => "","pack" => [],"description" => ""];
$title_page = $typesProductOrder[$theme];
} else {
$product = $datas["products"][$id];
$product["allergens"] = array_unique($product["allergens"]);
$list_menu_items = isset($datas["menu_item"]) && !empty($datas["menu_item"]) ? $datas["menu_item"] : [];
$menu_items = array_filter(
$datas["products"],
function ($prod) use ($list_menu_items) {
return in_array($prod["id"], $list_menu_items);
}
);
$title_page = $typesProductOrder[$product["type_slug"]] ?? $title_page;
$theme = $product["type_slug"];
}
$types_theme = [];
switch ($theme){
case "a-la-carte":
$types_theme = array_filter($types, function ($type) {
return $type["slug"] == "a-la-carte";
});
break;
case "boissons-alcoolise":
$types_theme = array_filter($types, function ($type) {
return $type["slug"] == "boissons-alcoolise";
});
break;
case "boissons-non-alcoolise":
$types_theme = array_filter($types, function ($type) {
return $type["slug"] == "boissons-non-alcoolise";
});
break;
case "autre-article":
$types_theme = $types;
break;
}
$types_menuitem = ["Entrée","Plat","Dessert","A partager","Autre boisson alcoolisée","Bière","Champagne et bulle","Cocktail","Vin blanc","Vin rosé","Vin rouge","Spiritueux","Eau minérale","Soft"];
$types_title=["Menu"=>"Nos Menus","A partager"=> "A partager","Entrée"=>"Nos Entrées","Plat"=>"Nos Plats","Dessert"=>"Nos Desserts","Vin blanc"=>"Nos Vins Blancs","Vin rosé"=>"Nos Vins Rosés","Vin rouge"=>"Nos Vins Rouges","Soft"=>"Nos softs et eaux minérales","Eau minérale"=>"Nos softs et eaux minérales","Champagne et bulle"=>"Nos champagnes et bulles","Spiritueux"=>"Nos spiritueux et autres boissons","Bière"=>"Nos spiritueux et autres boissons","Autre boisson alcoolisée"=>"Nos spiritueux et autres boissons","Autre article"=>"Nos autres articles"];
// "Menu"=>"Nos autres articles"
return $this->renderHtml('page/product_form.html.twig', [
'user' => $this->user,
'types' => $types,
'types_theme' => $types_theme,
'types_menuitem' => $types_menuitem,
'product' => $product,
'theme' => $theme,
'title_page' => $title_page,
'types_title' => $types_title,
'menu_items' => $menu_items
]);
}
/**
* @Route("/mes_menus_et_mes_cartes/update", name="update_product")
* @param Request $request
* @return RedirectResponse
*/
public function updateProduct(Request $request):RedirectResponse
{
//Check l autorisation
if (!isset($this->user) || empty($this->user)) {
return $this->redirectToRoute("app_login");
}
if(in_array(User::ROLE_USER_OPS,$this->user->getRoles())){
return $this->redirectToRoute("home");
}
//recuperation des informations du formulaire
$formDatas = $request->request->all();
$formDatas["tags"] = explode("|", $formDatas["tags"]);
if (isset($formDatas["allergens"]) && !empty($formDatas["allergens"])) {
foreach ($formDatas["allergens"] as $allergen) {
$formDatas["tags"][] = ApiController::TAG_PREFIX_ALLERGEN . $allergen;
}
unset($formDatas["allergens"]);
}
// translate dataform shelfs to tags shopify
if (isset($formDatas["shelfs"]) && !empty($formDatas["shelfs"])) {
foreach ($formDatas["shelfs"] as $shelf) {
$formDatas["tags"][] = ApiController::TAG_PREFIX_SHELF . $shelf;
}
unset($formDatas["shelfs"]);
}
// Changer les virgule dans les titre en 2 underscores
if (isset($formDatas["title"]) && !empty($formDatas["title"]) && strpos($formDatas["title"],",")!==-1) {
$formDatas["title"]= str_replace(",","__",$formDatas["title"]);
}
//init variable
$reps = [];
//si pack existe
$pack_tags = [];
$packsDel=[];
$post_menu_item = [];
//si pack existe
if (isset($formDatas["pack"]) && !empty($formDatas["pack"])) {
$oldPack=[];
if(isset($formDatas["id"]) && !empty($formDatas["id"])){
$allTagsPackTmp = $this->controllerApiTiptoque('getTags', ["type" => "pack"]);
if(isset( $allTagsPackTmp[$formDatas["id"]]) && !empty(isset($allTagsPackTmp[$formDatas["id"]]))){
$oldPack= $allTagsPackTmp[$formDatas["id"]];
}
}
$newPack = array_keys($formDatas["pack"]);
$packsDel = array_diff($oldPack,$newPack);
foreach ($formDatas["pack"] as $menuItem) {
if(!isset($menuItem["title"])){
continue;
}
$menuItem["tags"][] = ApiController::TAG_MENU_ITEM;
$menuItem["tags"][] = ApiController::TAG_OFFRE_PARTICULIER;
if(isset($formDatas["id"]) && !empty($formDatas["id"])){
$menuItem["tags"][] = ApiController::TAG_PREFIX_MAIN.$formDatas["id"];
}
//si menu_item id ajout du produit dans shopify et mise en place de reps pour le json
if (isset($menuItem["id"]) && !empty($menuItem["id"])) {
$menuItem_id = $menuItem["id"];
$pack_tags[] = ApiController::TAG_PREFIX_PACK . $menuItem["index"] . "|" . $menuItem_id . "_" . $menuItem["handle"];
unset($menuItem["id"]);
$datasJson["product"] = $menuItem;
//TODO faut il verifier si le produit a ete modifier?
$reps[] = $this->controllerApiTiptoque('putProduct', ["id" => $menuItem_id], json_encode($datasJson));
} else {
$datasJson["product"] = $menuItem;
$resProduit = $this->controllerApiTiptoque('postProduct', [], json_encode($datasJson));
$pack_tags[] = ApiController::TAG_PREFIX_PACK . $menuItem["index"] . "|" . $resProduit["product"]["id"] . "_" . $resProduit["product"]["handle"];
$reps[] = $resProduit;
//variable pour preparer l update avec le tags MAIN|%id product%
$post_menu_item[]=$resProduit["product"];
}
}
$formDatas["tags"] = array_merge($formDatas["tags"], $pack_tags);
unset($formDatas["pack"]);
}
//preparation des valeur pour le produit principal
$formDatas["max_per_day"] = ($formDatas["max_per_day"] == "") ? "-1" : $formDatas["max_per_day"];
$formDatas["disponibility_dates"] = $formDatas["dispo_date"];
unset($formDatas["dispo_date_start"]);
unset($formDatas["dispo_date_end"]);
unset($formDatas["put_product"]);
if (isset($formDatas["id"]) && !empty($formDatas["id"])) {
$pId = $formDatas["id"];
unset($formDatas["id"]);
$datasJson["product"] = $formDatas;
$prodMain = $reps[] = $this->controllerApiTiptoque('putProduct', ["id" => $pId], json_encode($datasJson));
//info Suppression des menu_items qui sont supprimer
if(isset($packsDel) && !empty($packsDel)){
foreach ($packsDel as $packDel){
$this->controllerApiTiptoque('delProduct', ["id" => $packDel, "force" => true]);//
}
}
} else {
$datasJson["product"] = $formDatas;
$prodMain = $reps[] = $this->controllerApiTiptoque('postProduct', [], json_encode($datasJson));
//info update les pack avec le tag MAIN|%id%
if (isset($post_menu_item) && !empty($post_menu_item)) {
foreach ($post_menu_item as $menuItem) {
$menuItem["tags"][] = ApiController::TAG_PREFIX_MAIN.$prodMain["product"]["id"];
$datasJson["product"] = $menuItem;
$this->controllerApiTiptoque('putProduct', ["id" => $menuItem["id"]], json_encode($datasJson));
}
}
}
if((strpos( $prodMain["product"]["type"],"Dispo")===false)){
return $this->redirectToRoute("product_edit",["id"=>$prodMain["product"]["id"]]);
}else{
return $this->redirectToRoute("products");
}
}
/**
* @Route("/mes_menus_et_mes_cartes/delete", name="delete_product")
* @param Request $request
* @return RedirectResponse
*/
public function deleteProduct(Request $request):RedirectResponse
{
if (!isset($this->user) || empty($this->user)) {
return $this->redirectToRoute("app_login");
}
if(in_array(User::ROLE_USER_OPS,$this->user->getRoles())){
return $this->redirectToRoute("home");
}
$pId = $request->query->get("product_id", null);
//info récupérer le produit et verifier si il y a des menus_items pour les supprimer en cascade
$responseProduct = $this->controllerApiTiptoque('getProduct',["id"=>$pId]);
if(isset($responseProduct["product"]["pack"]) && !empty($responseProduct["product"]["pack"])){
foreach ($responseProduct["product"]["pack"] as $menu_item_id){
$this->controllerApiTiptoque("delProduct", ["id" => $menu_item_id, "force" => true]);
}
}
$this->controllerApiTiptoque('delProduct', ["id" => $pId, "force" => true]);
return $this->redirectToRoute("products");
}
/**
* @Route("/imageDelete", name="imageDelete")
* @param Request $request
* @return JsonResponse
*/
public function imageDelete(Request $request):JsonResponse
{
//supprimer image d'un produit
$image_id = $request->request->get("iid");
$produit_id = $request->request->get("pid");
if (is_numeric($image_id)) {
// var_dump("delete image shopify", $produit_id, $image_id);
$reponseDeleteImage = $this->controllerApiTiptoque('delImage', ["pid" => $produit_id, "id" => $image_id]);
if(is_null($reponseDeleteImage)){
return $this->json(["error"=> ["pid" => $produit_id, "id" => $image_id,"reponse"=>$reponseDeleteImage]], 404 );
}
return $this->json(["message"=>$reponseDeleteImage], 200);
// return $this->json(["message" => "suppression de image id:" . $image_id], 200);
} else {
$directoryTmp = $this->getParameter("upload_tmp");
$directoryTmpVendor = $directoryTmp . ApiController::strToHandle($this->user_vendor) . '/';
$directoryTmpVendorProduct = $directoryTmpVendor . $produit_id . '/';
unlink($directoryTmpVendorProduct . $image_id);
//si le dossier vide le supprimer ??
$countImg = count(scandir($directoryTmpVendorProduct ))-2;
if( $countImg === 0){
$this->deleteDirectory( $directoryTmpVendor);
}
return $this->json(["message" => "suppression de image " . $image_id . " dans le cache"], 200);
}
}
/**
* @Route("/file-upload", name="tmpUploadFile")
* @param Request $request
* @return JsonResponse
*/
public function tmpUploadFile(Request $request):JsonResponse
{
$produit_id = $request->request->get("pid", null);
$produit_id = ($produit_id == "_add" || $produit_id == "Add") ? "add" : $produit_id;
$directoryTmp = $this->getParameter("upload_tmp");
if (!is_dir($directoryTmp)) {
mkdir($directoryTmp);
}
$directoryTmpVendor = $directoryTmp . ApiController::strToHandle($this->user_vendor);
if (!is_dir($directoryTmpVendor)) {
mkdir($directoryTmpVendor);
}
$directoryTmpVendorProduct = $directoryTmpVendor . '/' . $produit_id;
if (!is_dir($directoryTmpVendorProduct)) {
mkdir($directoryTmpVendorProduct);
}
if (is_null($produit_id)) {
$produit_id = "add";
}
$file = $request->files->get("file");
$file->move($directoryTmpVendorProduct,$file->getClientOriginalName());
return $this->json(["dir"=> $directoryTmpVendor,"filename" => $file->getClientOriginalName() , "id" => $produit_id], 200);
}
/**
* suppression d'un dossier et ses fichiers
* @param $dir
* @return bool
*/
private function deleteDirectory($dir):bool
{
if (!file_exists($dir)) {return true;}
if (!is_dir($dir)) { return unlink($dir); }
foreach (scandir($dir) as $item) {
if ($item == '.' || $item == '..') {
continue;
}
if (!$this->deleteDirectory($dir . DIRECTORY_SEPARATOR . $item)) {
return false;
}
}
return rmdir($dir);
}
/**
* @param string $function
* @param array $path
* @param array $datasJson
* @return mixed
*/
private function controllerApiTiptoque($function = "getProducts",$path = [],$datasJson = [])
{
$request = new Request([], [], [], [], [], [], $datasJson);
$request->headers->set('content-type', "application/json");
$path['_controller'] = ApiController::class . '::' . $function;
$subRequest = $request->duplicate([], null, $path);
$response = $this->container->get('http_kernel')->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
// $response = $this->forward(ApiController::class . '::' . $function, $path);
// var_dump($response->getContent());exit();
return isset($response) && !empty($response) ? \json_decode($response->getContent(), true) : \json_decode('{"message":"Error not response"}', true);
}
/**
* @param string $entree
* @param string $plat
* @param string $dessert
* @return string
*/
public function menuToDescription(string $entree,string $plat,string $dessert): string
{
$description = "";
if ($entree != "") {
$description .= "<entree><span>Entrée :</span> <descr>" . $entree . "</descr></entree><br>";
}
if ($plat != "") {
$description .= "<plat><span>Plat :</span> <descr>" . $plat . "</descr></plat><br>";
}
if ($dessert != "") {
$description .= "<dessert><span>Dessert :</span> <descr>" . $dessert . "</descr></dessert>";
}
return $description;
}
}