<?php
namespace App\Controller;
use App\Entity\Company;
use App\Entity\User;
use App\Entity\UserSetting;
use App\Form\CompanyType;
use App\Form\UserSearchType;
use App\Form\UserType;
use App\Repository\CompanyRepository;
use App\Repository\SettingRepository;
use App\Repository\ShopRepository;
use App\Repository\UserRepository;
use App\Repository\UserSettingRepository;
use Knp\Component\Pager\PaginatorInterface;
use mysql_xdevapi\Exception;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasher;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\String\Slugger\SluggerInterface;
// @dth: to encode the pass
/**
* @Route("/{_locale<%app.supported_locales%>}/user")
*/
class UserController extends AbstractController
{
private $passwordEncoder;
private $settings;
public function __construct(UserPasswordEncoderInterface $passwordEncoder)
{
$this->passwordEncoder = $passwordEncoder;
}
/**
* @Route("/", name="app_user_index", methods={"GET"})
*/
public function index(UserRepository $userRepository, PaginatorInterface $paginator, Request $request): Response
{
if (!$activeUser = $userRepository->findOneBy(['active' => 1])) {
foreach ($userRepository->findAll() as $k => $user) {
$user->setActive(1);
$userRepository->add($user);
}
}
//temp
/*
foreach($userRepository->findAll() as $k=>$user) {
if($shop=$user->getShop()) {
$user->addShop($shop);
$userRepository->add($user);
$orders=$user->getOrders();
foreach($orders as $a=>$order) {
$order->setShop($shop);
}
//echo $user->getId()." - ".$user->getShop()->getId()."<br/>";
}
}*/
if ($this->isGranted('ROLE_SUPER_ADMIN')) {
//$users = $userRepository->findAll();
$query = $userRepository->findAll([]);
$users = $paginator->paginate(
$query, /* query NOT result */
$request->query->getInt('page', 1)/*limit per page*/,
30
);
} else {
$user = $this->getUser();
$shop = $user->getShop();
//$users = $userRepository->findByDql(array('shop'=>$shop));
$query = $userRepository->findByDql(array('shop' => $shop));
$users = $paginator->paginate(
$query, /* query NOT result */
$request->query->getInt('page', 1), /*page number*/
30 /*limit per page*/
);
}
$searchForm = $this->createForm(UserSearchType::class, new User, ['method' => 'GET']);
$searchForm->handleRequest($request);
return $this->renderForm('user/index.html.twig', [
'users' => $users,
'form' => $searchForm
]);
}
/**
* @Route("/new", name="app_user_new", methods={"GET", "POST"})
*/
public function new(Request $request, UserRepository $userRepository, UserPasswordHasherInterface $userPasswordHasher, ShopRepository $shopRepository, MailerInterface $mailer, ParameterBagInterface $params): Response
{
$user = new User();
$shop = null;
if (!$this->isGranted('ROLE_SUPER_ADMIN')) {
$shop = $this->get('security.token_storage')->getToken()->getUser()->getShop();
}
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($shop) {
//$user->setShop($shop);
$user->addShop($shop);
}
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
'random'//$form->get('plainPassword')->getData()
)
);
if (!$this->isGranted('ROLE_SUPER_ADMIN') && $this->isGranted('ROLE_ADMIN')) {
$parentUser = $this->getUser();
$user->setParent($parentUser);
}
if (!$this->isGranted('ROLE_SUPER_ADMIN')) {
$shop = $this->getUser()->getShop();
$user->addShop($shop);
$user->setShop($shop);
}
$user->setActive(1);
$userRepository->add($user);
$mailer_sender = $params->get('app.mailer_sender');
$bcc = array($mailer_sender, 'eric@caravanemedia.com');
if ($mailCopy = $user->getShop()->getMailCopy()) {
$bcc = array_merge($bcc, explode(',', $mailCopy));
}
$subject = "Création d'un compte Bak2";
$template = 'emails/order/welcome.html.twig';
if (file_exists($params->get('kernel.project_dir') . "/private/shops/" . $user->getShop()->getId() . "/templates/mail/welcome.html.twig")) {
$template = "shops/" . $user->getShop()->getId() . "/templates/mail/welcome.html.twig";
}
$email = (new TemplatedEmail())
->from($mailer_sender)
->to($user->getEmail())
->bcc(...$bcc)
->subject($subject)
// path of the Twig template to render
->htmlTemplate($template)
// pass variables (name => value) to the template
->context([
'user' => $user
]);
try {
$mailer->send($email);
} catch (TransportExceptionInterface $e) {
// some error prevented the email sending; display an
// error message or try to resend the message
echo "<pre>";
var_dump($e);
echo "</pre>";
}
if ($request->query->get('from') && $request->query->get('type')) {
return $this->redirect($request->request->get('referer'));
}
return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('user/new.html.twig', [
'user' => $user,
'form' => $form,
]);
}
/**
* @Route("/me/orders", name="app_user_orders", methods={"GET"})
*/
public function orders(): Response
{
$user = $this->getUser();
return $this->render('user/orders.html.twig', [
'user' => $user,
]);
}
/**
* @Route("/me/address", name="app_user_addresses", methods={"GET"})
*/
public function addresses(): Response
{
$user = $this->getUser();
return $this->render('user/address.html.twig', [
'user' => $user,
]);
}
/**
* @Route("/me/sav", name="app_user_sav", methods={"GET"})
*/
public function sav(): Response
{
$user = $this->getUser();
$savs = $user->getSavs();
return $this->render('user/sav.html.twig', [
'user' => $user,
'savs' => $savs
]);
}
/**
* @Route("/me/information", name="app_user_me_infos", methods={"GET"})
*/
public function infos(): Response
{
$user = $this->getUser();
return $this->render('user/infos.html.twig', [
'user' => $user,
]);
}
/**
* @Route("/me/company", name="app_user_company", methods={"GET","POST"})
*/
public function company(CompanyRepository $companyRepository, UserRepository $userRepository, SluggerInterface $slugger, Request $request): Response
{
$user = $this->getUser();
$shop = $user->getShop();
$shopConfig = $shop->getConfig();
$isB2b = $shopConfig['type'] == 'b2b' ? true : false;
if (!$company = $user->getCompany()) {
$company = new Company();
}
$form = $this->createForm(CompanyType::class, $company, ['isB2b' => $isB2b]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$company->addUser($user);
$shopDirectory = $this->getParameter('kernel.project_dir') . '/private/shops/' . $shop->getId() . "/documents";
$kbisFile = $form->get('kbis')->getData();
if ($kbisFile) {
$originalFilename = pathinfo($kbisFile->getClientOriginalName(), PATHINFO_FILENAME);
// this is needed to safely include the file name as part of the URL
$safeFilename = $slugger->slug($originalFilename);
$newFilename = $safeFilename . '-' . uniqid() . '.' . $kbisFile->guessExtension();
// Move the file to the directory where brochures are stored
try {
$kbisFile->move($shopDirectory, $newFilename);
} catch (FileException $e) {
// ... handle exception if something happens during file upload
}
// updates the 'brochureFilename' property to store the PDF file name
// instead of its contents
$company->setKbisFilename($newFilename);
}
$companyRepository->add($company);
$user->setCompany($company);
$userRepository->add($user);
return $this->redirectToRoute('app_user_me');
}
return $this->renderForm('user/company.html.twig', [
'user' => $user,
'company' => $company,
'form' => $form,
]);
}
/**
* @Route("/me", name="app_user_me", methods={"GET"})
*/
public function me(): Response
{
$user = $this->getUser();
return $this->render('user/me.html.twig', [
'user' => $user,
]);
}
/**
* @Route("/{id}", name="app_user_show", methods={"GET"})
*/
public function show(User $user): Response
{
return $this->render('user/show.html.twig', [
'user' => $user,
]);
}
/**
* @Route("/{id}/edit", name="app_user_edit", methods={"GET", "POST"})
*/
public function edit(Request $request, User $user, UserRepository $userRepository, SettingRepository $settingRepository, UserSettingRepository $userSettingRepository, UserPasswordHasherInterface $userPasswordHasher): Response
{
$settings = $settingRepository->findByTarget('User');
foreach ($settings as $setting) {
if (!$userSetting = $userSettingRepository->findOneBy(array('user' => $user, 'setting' => $setting))) {
$userSetting = new UserSetting();
$userSetting->setUser($user);
$userSetting->setSetting($setting);
$userSetting->setValue($setting->getDefaultValue());
$userSettingRepository->add($userSetting);
}
}
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($this->isGranted('ROLE_ADMIN') && $form->get('plainPassword')->getData() != '') {
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$form->get('plainPassword')->getData()
)
);
}
$userRepository->add($user);
if ($request->query->get('from') && $request->query->get('type')) {
switch ($request->query->get('type')) {
case 'company':
return $this->redirectToRoute('app_company_edit', ['id' => $request->query->get('company')], Response::HTTP_SEE_OTHER);
break;
}
}
return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('user/edit.html.twig', [
'user' => $user,
'form' => $form,
]);
}
/**
* @Route("/{id}", name="app_user_delete", methods={"POST"})
*/
public function delete(Request $request, User $user, UserRepository $userRepository): Response
{
if ($this->isCsrfTokenValid('delete' . $user->getId(), $request->request->get('_token'))) {
//$userRepository->remove($user);
$user->setActive(0);
$userRepository->add($user);
}
return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER);
}
private function getDefaultSettings()
{
$settings = array(
'seePublicPrice' => array('label' => 'See public prices', 'value' => false),
'seeBuyingPrice' => array('label' => 'See reseller prices', 'value' => false),
'seeSellingPrice' => array('label' => 'See seller prices', 'value' => false)
);
}
/**
* @Route("/{id}/mailme", name="app_user_mailme", methods={"GET"})
*/
public function mailMe(Request $request, User $user, MailerInterface $mailer): Response
{
// $user = $this->getUser();
$email = (new TemplatedEmail())
->from('sales@bak2.com')
->to($user->getEmail())
->cc('test-yyfqvmjc5@srv1.mail-tester.com')
->subject("Test email subject")
->text('Text test email')
->html('<p>Html test email</p>');;
try {
$success = $mailer->send($email);
//var_dump($success);
} catch (TransportExceptionInterface $e) {
// some error prevented the email sending; display an
// error message or try to resend the message
echo "<pre>cc-";
var_dump($e);
echo "</pre>";
}
//$success = mail('sales@bak2.com', 'test mail mail only', "mail only");
//var_dump($success);
return $this->render('user/show.html.twig', [
'user' => $user,
]);
}
}