src/Controller/PrestataireController.php line 81

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Controller\AbstractController;
  4. use App\Entity\CreditPack;
  5. use App\Entity\Demande;
  6. use App\Entity\Departement;
  7. use App\Entity\Prestataire;
  8. use App\Entity\RefundRequest;
  9. use App\Entity\Transaction;
  10. use App\Entity\User;
  11. use App\Form\AnnuaireType;
  12. use App\Form\RefundType;
  13. use App\Form\ResetRequestType;
  14. use App\Misc\EntityUrlGenerator;
  15. use App\Misc\EntityWatcher;
  16. use App\Misc\Flashes;
  17. use App\Misc\Geoloc;
  18. use App\Misc\StringUtils;
  19. use DateTime;
  20. use Doctrine\ORM\EntityManagerInterface;
  21. use Knp\Component\Pager\PaginatorInterface;
  22. use Spipu\Html2Pdf\Html2Pdf;
  23. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  24. use Symfony\Component\HttpFoundation\Request;
  25. use Symfony\Component\HttpFoundation\RequestStack;
  26. use Symfony\Component\HttpFoundation\Response;
  27. use Symfony\Component\HttpFoundation\Session\Flash\FlashBag;
  28. use Symfony\Component\HttpFoundation\Session\Session;
  29. use Symfony\Component\Mailer\MailerInterface;
  30. use Symfony\Component\Mime\Address;
  31. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  32. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  33. use Symfony\Component\Routing\RouterInterface;
  34. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  35. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  36. use Symfony\Component\String\Slugger\SluggerInterface;
  37. class PrestataireController extends AbstractController
  38. {
  39. public function __construct(
  40. private TokenStorageInterface $tokenStorage,
  41. protected MailerInterface $mailer,
  42. private EntityUrlGenerator $entityUrlGenerator,
  43. private RouterInterface $router,
  44. private RequestStack $requestStack,
  45. private EntityManagerInterface $entityManager
  46. ) {
  47. parent::__construct($mailer, $entityUrlGenerator, $router, $requestStack, $entityManager);
  48. }
  49. public function prestataires(Request $request, PaginatorInterface $paginator)
  50. {
  51. $annuaireForm = $this->createForm(AnnuaireType::class, null, array(
  52. 'action' => $this->generateUrl('public_prestataires'),
  53. 'method' => 'GET'
  54. ));
  55. $annuaireForm->handleRequest($request);
  56. $repo = $this->getPrestataireRepository();
  57. $diagnosticsGroupId = $this->getParameter('group_diagnostics');
  58. $builder = $repo->getSearchQuery($annuaireForm->getData(), $diagnosticsGroupId);
  59. $data = $paginator->paginate(
  60. $builder,
  61. $request->get('page', 1),
  62. $this->getParameter('presta_page_size')
  63. );
  64. $categories = $repo->getCategoriesForAll($data);
  65. return $this->render('Public/annuaire.html.twig', array(
  66. 'form' => $annuaireForm->createView(),
  67. 'data' => $data,
  68. 'categories' => $categories,
  69. ));
  70. }
  71. public function prestataire(int $id, string $entreprise)
  72. {
  73. $repo = $this->getPrestataireRepository();
  74. /** @var Prestataire $prestataire */
  75. $prestataire = $repo->find($id);
  76. if (!$prestataire || $prestataire->isDeleted()) {
  77. return $this->throw404();
  78. }
  79. // 301 redirect if $title is different from the actual sanitized title
  80. $sanitized = StringUtils::sanitizeString($prestataire->getEntreprise());
  81. if ($sanitized != $entreprise) {
  82. return $this->redirectToRoute('public_prestataire', array(
  83. 'id' => $id,
  84. 'entreprise' => $sanitized
  85. ), Response::HTTP_MOVED_PERMANENTLY);
  86. }
  87. $categories = $repo->getCategoriesForOne($prestataire->getId());
  88. return $this->render('Public/prestataire.html.twig', array(
  89. 'prestataire' => $prestataire,
  90. 'categories' => $categories
  91. ));
  92. }
  93. public function index()
  94. {
  95. $prestataire = $this->getPrestataire();
  96. $repo = $this->getPrestataireRepository();
  97. $categories = $repo->getCategoriesForOne($prestataire->getId());
  98. return $this->render('Presta/index.html.twig', array(
  99. 'prestataire' => $prestataire,
  100. 'categories' => $categories
  101. ));
  102. }
  103. public function access(Session $session, Request $request, UserPasswordHasherInterface $passwordHasher, MailerInterface $mailer, SluggerInterface $slugger, Geoloc $geoloc)
  104. {
  105. if ($request->server->get('HTTP_REFERER') !== $this->generateUrl('presta_access', [], UrlGeneratorInterface::ABSOLUTE_URL)):
  106. $session->set('last_url', $request->server->get('HTTP_REFERER'));
  107. endif;
  108. if ($request->getMethod() === 'POST') {
  109. if ($request->get('login_submit')):
  110. $user = $this->getEm()->getRepository(User::class)->findOneBy(['email' => strtolower($request->get('email'))]);
  111. if ($user):
  112. $password_validation = $passwordHasher->isPasswordValid($user, $request->get('password'));
  113. if ($password_validation):
  114. if ($user->isEmailValid()):
  115. if ($user->getPrestataire()->getStatus() === 'valid'):
  116. $token = new UsernamePasswordToken($user, null, $user->isAdmin() ? 'admin' : 'presta', $user->getRoles());
  117. $this->tokenStorage->setToken($token);
  118. $this->getSession()->set('_security_main', serialize($token));
  119. if ($session->get('last_url')):
  120. return $this->redirect($session->get('last_url'));
  121. else:
  122. return $this->redirectToRoute('presta_index');
  123. endif;
  124. else:
  125. $this->addFlash(Flashes::ERROR, "Vous devez attendre que votre compte soit validé par l'administrateur.");
  126. endif;
  127. else:
  128. $this->addFlash(Flashes::ERROR, "Vous devez valider votre email avant de pouvoir utiliser votre compte.");
  129. endif;
  130. else:
  131. $this->addFlash(Flashes::ERROR, 'Mauvais identifiant.');
  132. endif;
  133. else:
  134. $this->addFlash(Flashes::ERROR, 'Mauvais identifiant.');
  135. endif;
  136. elseif ($request->get('register_submit')):
  137. $emailDuplicate = $this->getEm()->getRepository(User::class)->findOneBy(['email' => $email = strtolower($request->get('email'))]);
  138. if ($emailDuplicate):
  139. $this->addFlash(Flashes::ERROR, 'Cet email est déjà utilisé.');
  140. return $this->redirectToRoute('presta_access');
  141. endif;
  142. $user = new User();
  143. $user->setEmail($email);
  144. $user->setPassword($passwordHasher->hashPassword($user, $request->get('password')));
  145. $prestataire = new Prestataire();
  146. $prestataire->setEntreprise($request->get('entreprise'));
  147. if (!$this->isValidSiretChecksum((int) $request->get('siret'))) {
  148. $this->addFlash(Flashes::ERROR, 'Numéro SIRET invalide.');
  149. return $this->redirectToRoute('presta_access');
  150. }
  151. $prestataire->setSiret((int) $request->get('siret'));
  152. $prestataire->setNom($request->get('responsable'));
  153. $prestataire->setWebsite($request->get('website'));
  154. $prestataire->setAdresse($request->get('address'));
  155. $prestataire->setCodePostal($request->get('zipcode'));
  156. $prestataire->setVille($request->get('city'));
  157. $geoloc = $geoloc->getCoordinates($prestataire->getAdresse(), $prestataire->getCodePostal(), $prestataire->getVille());
  158. if ($geoloc === false) {
  159. $this->addFlash(Flashes::ERROR, 'Impossible de récupérer les coordonnées de l\'adresse.');
  160. return $this->redirectToRoute('presta_access');
  161. }
  162. $prestataire->setCoordinates(json_encode(['lat' => $geoloc['lat'], 'lng' => $geoloc['lng']]));
  163. $prestataire->setTelephone($request->get('phone'));
  164. $prestataire->setFax($request->get('fax'));
  165. foreach ($request->get('departements') ?? [] as $departement):
  166. $prestataire->addDepartement($this->getEm()->getRepository(Departement::class)->find($departement));
  167. endforeach;
  168. foreach ($request->get('categories') ?? [] as $categorie):
  169. $prestataire->addCategorie($this->getCategorieRepository()->find($categorie));
  170. endforeach;
  171. // Logo upload
  172. if ($logo = $request->files->get('logo')):
  173. $filename = $slugger->slug('logo-' . $prestataire->getEntreprise() . '-' . uniqid()) . '.' . $logo->guessExtension();
  174. $logo->move($this->getParameter('kernel.project_dir') . '/public/' . $this->getParameter('prestataire_files_path'), $filename);
  175. $prestataire->setLogo($filename);
  176. $prestataire->setLogoPath($filename);
  177. endif;
  178. // generate a signed url and email it to the user
  179. $user->setEmailValidationCode($token = bin2hex(random_bytes(10)));
  180. $email = (new TemplatedEmail())
  181. ->from(new Address($this->getParameter('email_from'), $this->getParameter('name_from')))
  182. ->to(new Address($user->getEmail()))
  183. ->subject($this->getOption('email_validation_message_subject'))
  184. ->htmlTemplate('Email/email_validation.html.twig')
  185. ->context([
  186. 'token' => $token,
  187. ])
  188. ;
  189. $mailer->send($email);
  190. $prestataire->setUser($user);
  191. $this->getEm()->persist($prestataire);
  192. $this->getEm()->flush();
  193. // Authentification
  194. // $token = new UsernamePasswordToken($user, null, $user->isAdmin() ? 'admin' : 'presta', $user->getRoles());
  195. // $this->tokenStorage->setToken($token);
  196. // $this->getSession()->set('_security_main', serialize($token));
  197. // $this->addFlash(Flashes::SUCCESS, $this->getOption('register_confirmation'));
  198. // return $this->redirectToRoute('presta_index');
  199. $this->addFlash(Flashes::SUCCESS, $this->getOption('register_confirmation'));
  200. return $this->redirectToRoute('presta_access');
  201. endif;
  202. }
  203. $categories = [
  204. // 'diagnotics' => $this->getCategorieRepository()->getChildren(72),
  205. 'expertises' => $this->getCategorieRepository()->getChildren(73),
  206. 'etudes' => $this->getCategorieRepository()->getChildren(74),
  207. 'solutions' => $this->getCategorieRepository()->getChildren(75),
  208. 'energies' => $this->getCategorieRepository()->getChildren(76),
  209. ];
  210. return $this->render('Presta/access.html.twig', [
  211. 'departements' => $this->getEm()->getRepository(Departement::class)->findAll(),
  212. 'categories' => $categories,
  213. 'error' => $error ?? null
  214. ]);
  215. }
  216. public function edit(Request $request, MailerInterface $mailer, UserPasswordHasherInterface $passwordHasher, SluggerInterface $slugger, Geoloc $geoloc)
  217. {
  218. $prestataire = $this->getPrestataire();
  219. if ($request->getMethod() === 'POST'):
  220. $watcher = new EntityWatcher($prestataire, $this->getParameter('presta_watched_properties'));
  221. $email = strtolower($request->get('email'));
  222. if ($email !== strtolower($prestataire->getUser()->getEmail())):
  223. $emailDuplicate = $this->getEm()->getRepository(User::class)->findOneBy(['email' => $email]);
  224. if ($emailDuplicate):
  225. $this->addFlash(Flashes::ERROR, 'Cet email est déjà utilisé.');
  226. return $this->redirectToRoute('presta_edit');
  227. endif;
  228. $prestataire->getUser()->setEmail($request->get('email'));
  229. endif;
  230. if ($request->get('password') && $request->get('password') === $request->get('password_verification')):
  231. $prestataire->getUser()->setPassword($passwordHasher->hashPassword($prestataire->getUser(), $request->get('password')));
  232. endif;
  233. $prestataire->setEntreprise($request->get('entreprise'));
  234. if (!$this->isValidSiretChecksum((int) $request->get('siret'))) {
  235. $this->addFlash(Flashes::ERROR, 'Numéro SIRET invalide.');
  236. return $this->redirectToRoute('presta_edit');
  237. }
  238. $prestataire->setSiret((string) $request->get('siret'));
  239. $prestataire->setNom($request->get('responsable'));
  240. $prestataire->setWebsite($request->get('website'));
  241. $address_updated = false;
  242. if ($request->get('address') !== $prestataire->getAdresse()):
  243. $prestataire->setAdresse($request->get('address'));
  244. $address_updated = true;
  245. endif;
  246. if ($request->get('zipcode') !== $prestataire->getCodePostal()):
  247. $prestataire->setCodePostal($request->get('zipcode'));
  248. $address_updated = true;
  249. endif;
  250. if ($request->get('city') !== $prestataire->getVille()):
  251. $prestataire->setVille($request->get('city'));
  252. $address_updated = true;
  253. endif;
  254. if ($address_updated):
  255. $geoloc = $geoloc->getCoordinates($prestataire->getAdresse(), $prestataire->getCodePostal(), $prestataire->getVille());
  256. if ($geoloc === false) {
  257. $this->addFlash(Flashes::ERROR, 'Impossible de récupérer les coordonnées de l\'adresse.');
  258. return $this->redirectToRoute('presta_edit');
  259. }
  260. $prestataire->setCoordinates(json_encode(['lat' => $geoloc['lat'], 'lng' => $geoloc['lng']]));
  261. endif;
  262. $prestataire->setTelephone($request->get('phone'));
  263. $prestataire->setFax($request->get('fax'));
  264. $prestataire->getDepartements()->clear();
  265. foreach ($request->get('departements') ?? [] as $departement):
  266. $prestataire->addDepartement($this->getEm()->getRepository(Departement::class)->find($departement));
  267. endforeach;
  268. $prestataire->getCategories()->clear();
  269. foreach ($request->get('categories') ?? [] as $categorie):
  270. $prestataire->addCategorie($this->getCategorieRepository()->find($categorie));
  271. endforeach;
  272. // Logo upload
  273. if ($logo = $request->files->get('logo')):
  274. $filename = $slugger->slug('logo-' . $prestataire->getEntreprise() . '-' . uniqid()) . '.' . $logo->guessExtension();
  275. $logo->move($this->getParameter('kernel.project_dir') . '/public/' . $this->getParameter('prestataire_files_path'), $filename);
  276. $prestataire->setLogo($filename);
  277. $prestataire->setLogoPath($filename);
  278. endif;
  279. if ($updated = $watcher->compute()) {
  280. $prestataire->setModifiedDate(new DateTime());
  281. }
  282. $this->getEm()->persist($prestataire);
  283. $this->getEm()->flush();
  284. if ($updated) {
  285. // $mail = new Mail();
  286. // $mail
  287. // ->setFromEmail($this->getParameter('email_from'))
  288. // ->setFromName($this->getParameter('name_from'))
  289. // ->setToEmail($this->getParameter('admin_email'))
  290. // ->setSubject('Un prestataire a modifié ses informations')
  291. // ->setContent($this->render('Email/prestataire_modified.html.twig', [
  292. // 'prestataire' => $prestataire,
  293. // 'watcher' => $watcher
  294. // ]))
  295. // ->setStatus('new');
  296. // $this->getEM()->persist($mail);
  297. // $this->getEM()->flush();
  298. $email = (new TemplatedEmail())
  299. ->from(new Address($this->getParameter('email_from'), $this->getParameter('name_from')))
  300. ->to($this->getParameter('admin_email'))
  301. ->subject('Un prestataire a modifié ses informations')
  302. ->htmlTemplate('Email/prestataire_modified.html.twig')
  303. ->context([
  304. 'prestataire' => $prestataire,
  305. 'watcher' => $watcher
  306. ]);
  307. $mailer->send($email);
  308. }
  309. $this->addFlash(Flashes::SUCCESS, 'Vos modifications ont bien été prises en compte.');
  310. return $this->redirectToRoute('presta_index');
  311. endif;
  312. $categories = [
  313. 'diagnostics' => $this->getCategorieRepository()->getChildren(72),
  314. 'expertises' => $this->getCategorieRepository()->getChildren(73),
  315. 'etudes' => $this->getCategorieRepository()->getChildren(74),
  316. 'solutions' => $this->getCategorieRepository()->getChildren(75),
  317. 'energies' => $this->getCategorieRepository()->getChildren(76),
  318. ];
  319. return $this->render('Presta/edit.html.twig', array(
  320. 'prestataire' => $prestataire,
  321. 'departements' => $this->getEm()->getRepository(Departement::class)->findAll(),
  322. 'categories' => $categories,
  323. ));
  324. }
  325. public function buyCredits()
  326. {
  327. $repo = $this->getEM()->getRepository(CreditPack::class);
  328. $packs = $repo->findBy(array(), array('prix' => 'ASC'));
  329. $tarifs = $this->getCategorieRepository()->getTarifs();
  330. return $this->render('Presta/buy_credits.html.twig', array(
  331. 'packs' => $packs,
  332. 'tarifs' => $tarifs,
  333. ));
  334. }
  335. public function transactions(Request $request, PaginatorInterface $paginator)
  336. {
  337. $prestataire = $this->getPrestataire();
  338. /** @var TransactionRepository $repo */
  339. $repo = $this->getEM()->getRepository(Transaction::class);
  340. $transactions = $paginator->paginate(
  341. $repo->getForPrestataireQueryBuilder($prestataire->getId()),
  342. $request->query->getInt('page', 1),
  343. 20,
  344. ['wrap_queries' => true]
  345. );
  346. $totalCredits = $repo->getPrestataireTotalBoughtCredits($prestataire->getId());
  347. $spentCredits = $repo->getPrestataireTotalSpentCredits($prestataire->getId());
  348. /** @var Demande[] $demandes */
  349. $demandes = $this->getPrestataireRepository()->getActiveDemandes($prestataire->getId());
  350. return $this->render('Presta/transactions.html.twig', array(
  351. 'prestataire' => $prestataire,
  352. 'transactions' => $transactions,
  353. 'totalCredits' => $totalCredits,
  354. 'spentCredits' => $spentCredits,
  355. 'demandes' => $demandes
  356. ));
  357. }
  358. /**
  359. * @param Demande $demande
  360. * @param Prestataire $prestataire
  361. *
  362. * @return RedirectResponse
  363. */
  364. private function actionAddToCart($demande, $prestataire)
  365. {
  366. $em = $this->getEM();
  367. // try to get a previous cart
  368. /** @var TransactionRepository $repo */
  369. $repo = $em->getRepository(Transaction::class);
  370. $cart = $repo->getCart($prestataire->getId());
  371. if (!$cart) {
  372. $cart = new Transaction();
  373. $cart->setDate(new DateTime());
  374. $cart->setCart(true);
  375. $cart->setConfirmed(false);
  376. $cart->setPrestataire($prestataire);
  377. $em->persist($cart);
  378. }
  379. $cart->addDemande($demande);
  380. $em->flush();
  381. $this->addflash(Flashes::SUCCESS, 'La demande a bien été ajoutée à votre panier.');
  382. return $this->redirectToRoute('presta_cart');
  383. }
  384. public function denied(Request $request, FlashBag $flashBag)
  385. {
  386. $this->addFlash('error', 'Mauvais identifiants.');
  387. return $this->redirect($this->generateUrl('presta_access'));
  388. }
  389. public function failure()
  390. {
  391. return new Response('Login failure');
  392. }
  393. public function removeLogo(Request $request)
  394. {
  395. $prestataire = $this->getPrestataire();
  396. $logoPath = $this->getParameter('kernel.project_dir') . '/public/'.
  397. $this->getParameter('prestataire_files_path').'/'.
  398. $prestataire->getLogoPath();
  399. $prestataire->setLogoPath(null);
  400. $this->getEM()->flush();
  401. if (file_exists($logoPath) && is_file($logoPath)) {
  402. unlink($logoPath);
  403. }
  404. $this->addFlash(Flashes::SUCCESS, 'Le logo a bien été supprimé.');
  405. return $this->redirectToRoute('presta_index');
  406. }
  407. public function buyDemande(Request $request, $id)
  408. {
  409. /** @var Demande $demande */
  410. $demande = $this->getDemandeRepository()->find($id);
  411. if (!$demande) {
  412. $this->addFlash(Flashes::ERROR, 'La demande de devis n°'. $id .' a expiré.');
  413. return $this->throw404();
  414. }
  415. $prestataire = $this->getPrestataire();
  416. if ($this->getDemandeRepository()->isBoughtBy($demande, $prestataire)) {
  417. // bought already, redirect
  418. return $this->getUrlGenerator()->redirectTo($demande);
  419. }
  420. if ($request->getMethod() === 'POST') {
  421. switch ($request->get('action')) {
  422. case 'stripe':
  423. return $this->redirectToRoute('stripe_demande', ['id' => $demande->getId()]);
  424. case 'cart':
  425. return $this->actionAddToCart($demande, $prestataire);
  426. case 'use_credits':
  427. return $this->actionBuyWithCredits($demande, $prestataire);
  428. case 'achat_credits':
  429. $this->getSession()->set('achat_credits_redirect', $this->generateUrl('presta_buy_demande', array('id' => $demande->getId())));
  430. return $this->redirectToRoute('presta_buy_credits');
  431. }
  432. }
  433. /** @var CreditPackRepository $packRepo */
  434. $packRepo = $this->getEM()->getRepository(CreditPack::class);
  435. $minPricePack = $packRepo->getMinPricePack();
  436. /** @var TransactionRepository $transactionRepo */
  437. $transactionRepo = $this->getEM()->getRepository(Transaction::class);
  438. $isInCart = $transactionRepo->isInCart($demande->getId(), $prestataire->getId());
  439. return $this->render('Presta/buy_demande.html.twig', array(
  440. 'demande' => $demande,
  441. 'prestataire' => $prestataire,
  442. 'minPricePack' => $minPricePack,
  443. 'isInCart' => $isInCart,
  444. ));
  445. }
  446. /**
  447. * @param Demande $demande
  448. * @param Prestataire $prestataire
  449. *
  450. * @return RedirectResponse
  451. */
  452. private function actionBuyWithCredits(Demande $demande, Prestataire $prestataire)
  453. {
  454. if ($prestataire->getCredits() < $demande->getCredits()) {
  455. $this->addFlash(Flashes::ERROR, "Vous n'avez pas suffisamment de crédits pour acheter ce contact.");
  456. return $this->redirectToRoute('presta_buy_demande', array('id' => $demande->getId()));
  457. }
  458. $em = $this->getEM();
  459. $em->beginTransaction();
  460. $transaction = new Transaction();
  461. $transaction->setDate(new DateTime());
  462. $transaction->setPrestataire($prestataire);
  463. $transaction->setPrix(null);
  464. $transaction->setCredits($demande->getCredits());
  465. $transaction->setConfirmed(true);
  466. $transaction->addDemande($demande);
  467. $prestataire->removeCredits($demande->getCredits());
  468. $em->persist($transaction);
  469. $em->flush();
  470. $this->removeFromPrestaCart($demande, $prestataire);
  471. $em->commit();
  472. $this->addFlash(Flashes::SUCCESS, 'Vous avez maintenant accès aux coordonnées du contact.');
  473. return $this->getUrlGenerator()->redirectTo($demande);
  474. }
  475. public function refund(Request $request)
  476. {
  477. $prestataire = $this->getPrestataire();
  478. $refundRequest = new RefundRequest();
  479. $refundRequest->setPrestataire($prestataire);
  480. if ($request->get('id')) {
  481. /** @var Demande $demande */
  482. $demande = $this->getDemandeRepository()->find($request->get('id'));
  483. if ($demande) {
  484. if ($demande->getRefundRequest($prestataire->getId())) {
  485. $this->addFlash(Flashes::WARNING, 'Vous avez déjà demandé une recréditation pour cette demande.');
  486. return $this->redirectToRoute('presta_transactions');
  487. }
  488. $refundRequest->setDemande($demande);
  489. }
  490. }
  491. $refundForm = $this->createForm(RefundType::class, $refundRequest);
  492. if ($request->getMethod() === 'POST') {
  493. $refundForm->handleRequest($request);
  494. if ($refundForm->isSubmitted() && $refundForm->isValid()) {
  495. $refundRequest = $refundForm->getData();
  496. $em = $this->getEM();
  497. $em->beginTransaction();
  498. $em->persist($refundRequest);
  499. $em->flush();
  500. // notify admin with request and link to presta page
  501. // $mail = new Mail();
  502. // $mail
  503. // ->setFromEmail($this->getParameter('email_from'))
  504. // ->setFromName($this->getParameter('name_from'))
  505. // ->setToEmail($this->getParameter('admin_email'))
  506. // ->setSubject('Nouvelle demande de recréditation')
  507. // ->setContent($this->render('Email/refund_request.html.twig', ['request' => $refundRequest]))
  508. // ->setStatus('new');
  509. // $this->getEM()->persist($mail);
  510. // $this->getEM()->flush();
  511. $email = (new TemplatedEmail())
  512. ->from(new Address($this->getParameter('email_from'), $this->getParameter('name_from')))
  513. ->to(new Address($this->getParameter('admin_email')))
  514. ->subject('Nouvelle demande de recréditation')
  515. ->htmlTemplate('Email/refund_request.html.twig')
  516. ->context(
  517. [
  518. 'request' => $refundRequest,
  519. ]
  520. );
  521. $this->getMailer()->send($email);
  522. $em->commit();
  523. $this->addFlash(Flashes::SUCCESS, 'Votre demande de recréditation a bien été envoyée.');
  524. return $this->redirectToRoute('presta_transactions');
  525. }
  526. }
  527. return $this->render('Presta/refund.html.twig', array(
  528. 'refund_form' => $refundForm->createView()
  529. ));
  530. }
  531. public function cart(Request $request)
  532. {
  533. $prestataire = $this->getPrestataire();
  534. /** @var TransactionRepository $repo */
  535. $repo = $this->getEM()->getRepository(Transaction::class);
  536. $cart = $repo->getCart($prestataire->getId());
  537. // Request for remove cart
  538. if ($request->getMethod() === 'POST') {
  539. if ($request->request->has('remove')) {
  540. $demande = $this->getDemandeRepository()->find($request->get('remove')['id']);
  541. if ($demande) {
  542. $cart->removeDemande($demande);
  543. $this->getEM()->flush();
  544. return $this->redirectToRoute('presta_cart');
  545. }
  546. }
  547. }
  548. return $this->render('Presta/cart.html.twig', array(
  549. 'cart' => $cart,
  550. 'prix' => $this->getCartPrix($cart),
  551. 'minPricePack' => $this->getMinPricePack()
  552. ));
  553. }
  554. private function getMinPricePack()
  555. {
  556. /** @var CreditPackRepository $packRepo */
  557. $packRepo = $this->getEM()->getRepository(CreditPack::class);
  558. return $packRepo->getMinPricePack();
  559. }
  560. public function buyCart(Request $request)
  561. {
  562. $prestataire = $this->getPrestataire();
  563. /** @var TransactionRepository $repo */
  564. $repo = $this->getEM()->getRepository(Transaction::class);
  565. $cart = $repo->getCart($prestataire->getId());
  566. if (!$cart || !$cart->getDemandes()) {
  567. return $this->redirectToRoute('presta_cart');
  568. }
  569. if ($request->getMethod() === 'POST') {
  570. switch ($request->get('action')) {
  571. case 'stripe':
  572. return $this->redirectToRoute('stripe_cart');
  573. case 'use_credits':
  574. return $this->actionBuyCartWithCredits($cart);
  575. case 'achat_credits':
  576. $this->getSession()->set('achat_credits_redirect', $this->generateUrl('presta_buy_cart'));
  577. return $this->redirectToRoute('presta_buy_credits');
  578. }
  579. }
  580. return $this->render('Presta/buy_cart.html.twig', array(
  581. 'cart' => $cart,
  582. 'prix' => $this->getCartPrix($cart),
  583. 'credits' => $this->getCartCredits($cart),
  584. 'minPricePack' => $this->getMinPricePack(),
  585. 'prestataire' => $prestataire
  586. ));
  587. }
  588. /**
  589. * @param Transaction $cart
  590. */
  591. private function actionBuyCartWithCredits($cart)
  592. {
  593. $cart->setCredits($this->getCartCredits($cart));
  594. if ($cart->getPrestataire()->getCredits() < $cart->getCredits()) {
  595. $this->addFlash(Flashes::ERROR, "Vous n'avez pas suffisamment de crédits pour acheter ce panier.");
  596. return $this->redirectToRoute('presta_buy_cart');
  597. }
  598. $cart->setDate(new DateTime());
  599. $cart->setPrix(null);
  600. $cart->setConfirmed(true);
  601. $cart->setCart(false);
  602. $cart->getPrestataire()->removeCredits($cart->getCredits());
  603. $this->getEM()->flush();
  604. $this->addFlash(Flashes::SUCCESS, 'Vous avez maintenant accès aux coordonnées des contacts achetés.');
  605. return $this->redirectToRoute('presta_transactions');
  606. }
  607. public function requestReset(Request $request)
  608. {
  609. $form = $this->createForm(ResetRequestType::class, new User());
  610. if ($request->getMethod() === 'POST') {
  611. $form->handleRequest($request);
  612. $email = $form->getData()->getEmail();
  613. /** @var User $user */
  614. $user = $this->getEM()->getRepository(User::class)->findOneBy(array(
  615. 'email' => strtolower($email)
  616. ));
  617. if ($user) {
  618. $user->setResetCode($token = substr("abcdefghijklmnopqrstuvwxyz", mt_rand(0, 25), 1).substr(md5(time()), 1));
  619. $this->getEM()->flush();
  620. // send email
  621. // $mail = new Mail();
  622. // $mail
  623. // ->setFromEmail($this->getParameter('email_from'))
  624. // ->setFromName($this->getParameter('name_from'))
  625. // ->setToEmail($user->getEmail())
  626. // ->setToName($user->getPrestataire() ? $user->getPrestataire()->getNom() : '')
  627. // ->setSubject($this->getOption('request_reset_message_subject'))
  628. // ->setContent($this->render('Email/request_reset.html.twig', ['token' => $token]))
  629. // ->setStatus('new');
  630. // $this->getEM()->persist($mail);
  631. // $this->getEM()->flush();
  632. if ($user->getPrestataire() && $user->getPrestataire()->getNom()):
  633. $name = $user->getPrestataire()->getNom();
  634. endif;
  635. $email = (new TemplatedEmail())
  636. ->from(new Address($this->getParameter('email_from'), $this->getParameter('name_from')))
  637. ->to(new Address($user->getEmail(), $name ?? ""))
  638. ->subject($this->getOption('request_reset_message_subject'))
  639. ->htmlTemplate('Email/request_reset.html.twig')
  640. ->context([
  641. 'token' => $token,
  642. ])
  643. ;
  644. $this->getMailer()->send($email);
  645. }
  646. $this->addFlash(Flashes::SUCCESS, 'Si votre adresse email a été trouvée, un message contenant un lien de réinitialisation vous a été envoyé.');
  647. return $this->redirectToRoute('presta_access');
  648. }
  649. return $this->render('User/request_reset.html.twig', array(
  650. 'request_form' => $form->createView()
  651. ));
  652. }
  653. public function reset(Request $request, $token, UserPasswordHasherInterface $passwordHasher)
  654. {
  655. $user = $this->getUserRepository()->findOneBy(['resetCode' => $token]);
  656. if (!$user) {
  657. $this->addFlash(Flashes::ERROR, "Le code fourni n'est pas valide.");
  658. return $this->redirectToRoute('presta_access');
  659. }
  660. if ($request->getMethod() === 'POST') {
  661. $user->setPassword($passwordHasher->hashPassword($user, $request->get('password')));
  662. $user->setResetCode(null);
  663. $this->getEM()->flush();
  664. if ($user->isEnabled()) {
  665. // authenticate
  666. $token = new UsernamePasswordToken($user, null, $user->isAdmin() ? 'admin' : 'presta', $user->getRoles());
  667. $this->tokenStorage->setToken($token);
  668. $this->getSession()->set('_security_main', serialize($token));
  669. }
  670. $this->addFlash(Flashes::SUCCESS, 'Votre mot de passe a bien été modifié.');
  671. $route = $user->isAdmin() ? 'admin_index' : 'presta_index';
  672. return $this->redirectToRoute($route);
  673. }
  674. // if invalid code, redirect on request_reset with flash
  675. return $this->render('User/reset.html.twig', array(
  676. 'user' => $user
  677. ));
  678. }
  679. public function invoice($number)
  680. {
  681. /** @var Transaction $transaction */
  682. $transaction = $this->getTransactionRepository()->findOneBy(array(
  683. 'invoiceNumber' => $number
  684. ));
  685. if (!$transaction) {
  686. return $this->throw404();
  687. }
  688. $output = $this->getInvoicePdfContent($transaction);
  689. $name = $transaction->getInvoiceFilename();
  690. $response = new Response($output);
  691. $response->headers->set('Cache-Control', 'private');
  692. $response->headers->set('Content-Type', 'application/pdf');
  693. $response->headers->set('Content-Disposition', 'attachment; filename="'. $name .'";');
  694. $response->headers->set('Content-Length', strlen($output));
  695. return $response;
  696. }
  697. private function getInvoicePdfContent(Transaction $transaction)
  698. {
  699. $content = $this->renderView('Protected/invoice.html.twig', array(
  700. 'from' => $this->getOption('invoice_from'),
  701. 'to' => $transaction->getPrestataire(),
  702. 'transaction' => $transaction,
  703. 'footer' => $this->getOption('invoice_footer')
  704. ));
  705. /** @var HTML2PDF $pdf */
  706. $pdf = new Html2Pdf();
  707. $pdf->pdf->SetDisplayMode('fullpage');
  708. $pdf->writeHTML($content);
  709. return $pdf->Output($transaction->getInvoiceFilename(), 'S');
  710. }
  711. }