src/Controller/HomeController.php line 423

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Color;
  4. use App\Entity\Discount;
  5. use App\Entity\MailingList;
  6. use App\Entity\Orden;
  7. use App\Entity\OrdenItem;
  8. use App\Entity\OrdenOrigen;
  9. use App\Entity\PaymentIntent;
  10. use App\Entity\PaymentMethod;
  11. use App\Entity\Product;
  12. use App\Entity\Programa;
  13. use App\Entity\ProgramaType;
  14. use App\Entity\PromoCode;
  15. use App\Entity\PromoCodeUsage;
  16. use App\Entity\Provider;
  17. use App\Entity\Restriction;
  18. use App\Entity\Solicitud;
  19. use App\Entity\SolicitudLog;
  20. use App\Entity\Subscription;
  21. use App\Entity\Tax;
  22. use App\Entity\TaxRecord;
  23. use App\Entity\Transaction;
  24. use App\Entity\User;
  25. use App\Form\ProductType;
  26. use App\Form\SolicitudNoSocioType;
  27. use App\Form\SolicitudSocioType;
  28. use App\Libs\Constantes;
  29. use App\Libs\Emailer;
  30. use App\Libs\OrdenCreator;
  31. use App\Libs\PlatformFeeRecorder;
  32. use App\Libs\PromoCodeUsager;
  33. use App\Libs\PromoCodeUsageRecorder;
  34. use App\Libs\PromoDiscounter;
  35. use App\Libs\RandomCoder;
  36. use App\Libs\Sendgrider;
  37. use App\Libs\StripeCustomers;
  38. use App\Libs\SubscriptionCreator;
  39. use App\Libs\Taxer;
  40. use App\Libs\TaxRecorder;
  41. use Doctrine\DBAL\Driver\Exception;
  42. use Doctrine\ORM\EntityManagerInterface;
  43. use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
  44. use Knp\Snappy\Pdf;
  45. use SendGrid\Mail\Mail;
  46. use Stripe\Checkout\Session;
  47. use Stripe\Stripe;
  48. use Stripe\StripeClient;
  49. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  50. use Symfony\Component\Form\Extension\Core\Type\DateType;
  51. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  52. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  53. use Symfony\Component\Form\Extension\Core\Type\IntegerType;
  54. use Symfony\Component\Form\Extension\Core\Type\TelType;
  55. use Symfony\Component\Form\Extension\Core\Type\TextType;
  56. use Symfony\Component\HttpFoundation\Request;
  57. use Symfony\Component\HttpFoundation\RequestStack;
  58. use Symfony\Component\HttpFoundation\Response;
  59. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  60. use Symfony\Component\Routing\Annotation\Route;
  61. use Symfony\Component\Security\Core\Security;
  62. use Symfony\Component\Validator\Constraints\Date;
  63. use Symfony\Component\Workflow\Registry;
  64. use Twilio\Options;
  65. use Twilio\Rest\Client;
  66. use function Symfony\Component\String\s;
  67. class HomeController extends AbstractController
  68. {
  69. protected $em;
  70. protected $security;
  71. protected $hasher;
  72. /**
  73. * @var RequestStack
  74. */
  75. private $stack;
  76. /**
  77. * @var Registry
  78. */
  79. private $registry;
  80. public function __construct(EntityManagerInterface $manager, Security $security, UserPasswordHasherInterface $hasher, RequestStack $stack, Registry $registry)
  81. {
  82. $this->hasher = $hasher;
  83. $this->security = $security;
  84. $this->em = $manager;
  85. $this->stack = $stack->getSession();
  86. $this->registry = $registry;
  87. }
  88. /**
  89. * @Route("/", name="app_home")
  90. */
  91. public function index(Request $request): Response
  92. {
  93. $promo_code = $this->stack->get('promo_code');
  94. if($this->security->isGranted('ROLE_USER')) return $this->redirectToRoute('app_account');
  95. $f = $this->getForm();
  96. return $this->render('home/index.html.twig', [
  97. 'controller_name' => 'HomeController',
  98. 'form' => $f->createView(),
  99. 'promo_code' => $promo_code
  100. ]);
  101. }
  102. /**
  103. * @Route("/promo/clear", name="app_homepromoclear")
  104. */
  105. public function clear(Request $request, $promo_code = null) : Response
  106. {
  107. $this->stack->clear();
  108. return $this->redirectToRoute('app_home');
  109. }
  110. /**
  111. * @Route("/promo/{promo_code}", name="app_homepromo")
  112. */
  113. public function promo(Request $request, $promo_code = null) : Response
  114. {
  115. $this->stack->start();
  116. $this->stack->clear();
  117. $pc = $this->em->getRepository(PromoCode::class)->findOneBy(['content'=>$promo_code]);
  118. if($pc){
  119. $this->stack->set('promo_code', strtoupper($promo_code));
  120. }
  121. return $this->redirectToRoute('app_home');
  122. }
  123. protected function getForm()
  124. {
  125. return $this->createFormBuilder()
  126. ->setAction('/mailing/subscribe')
  127. ->add('email', EmailType::class, [
  128. 'label' => false
  129. ])
  130. ->add('nombre', TextType::class, [
  131. 'label' => false
  132. ])
  133. ->getForm();
  134. }
  135. /**
  136. * @Route("/membresias/{tipo}", name="app_membresias")
  137. */
  138. public function membresias($tipo): Response
  139. {
  140. $promo_code = $this->stack->get('promo_code');
  141. $r = [];$count = 0;
  142. $pt = $this->em->getRepository(ProgramaType::class)->findOneBy(['slug'=>$tipo]);
  143. if($pt){
  144. $progs = $pt->getProgramas()->filter(function (Programa $programa){
  145. return $programa->getIsActivo() == true;
  146. });
  147. $count = count($progs);
  148. if($progs){
  149. foreach ($progs as $prog){
  150. if($prog->getIsActivo()){
  151. $r[] = $prog;
  152. }
  153. }
  154. }
  155. }
  156. $f = $this->getForm();
  157. return $this->render('home/membresias.html.twig', [
  158. 'controller_name' => 'HomeController',
  159. 'rs' => $r,
  160. 'count' => $count,
  161. 'type' => $pt->getContent(),
  162. 'form' => $f->createView(),
  163. 'promo_code' => $promo_code
  164. ]);
  165. }
  166. /**
  167. * @Route("/programa/{slug}", name="app_programa")
  168. */
  169. public function programa($slug): Response
  170. {
  171. $promo_code = $this->stack->get('promo_code');
  172. $r = [];
  173. $p = $this->em->getRepository(Programa::class)->findOneBy(['slug' => $slug]);
  174. $intern = $this->em->getRepository(Provider::class)->find(101);
  175. $provs = $p->getProvider();
  176. if($provs){
  177. foreach ($provs as $pr){
  178. $prov = $this->em->getRepository(Provider::class)->find($pr);
  179. // $prov = new Provider();
  180. if($prov->getIsActivo()){
  181. $discs = $prov->getDiscounts();
  182. if($discs){
  183. $di = [];
  184. foreach ($discs as $disc){
  185. if($disc->getIsActivo()){
  186. $restr = $disc->getFeatures();
  187. $di[$disc->getNombreParcial()] = $restr->toArray();
  188. }
  189. }
  190. $r[$prov->getProviderType()->getContent()][$prov->getSlug()] = [
  191. 'nombre' => $prov->getNombre(1),
  192. 'slug' => $prov->getSlug(),
  193. 'discounts' => $di,
  194. 'idType' => $prov->getProviderType()->getId()
  195. ];
  196. // dd($r);
  197. }
  198. }
  199. }
  200. }
  201. // dd($this->getUser());
  202. return $this->render('home/programa.html.twig', [
  203. 'controller_name' => 'HomeController',
  204. 'rs' => $r,
  205. 'programa' => $p,
  206. 'slug' => $slug,
  207. 'promo_code' => $promo_code,
  208. 'intern' => $intern
  209. ]);
  210. }
  211. /**
  212. * @Route("/proveedor/{slug}", name="app_proveedor")
  213. */
  214. public function proveedor($slug, Request $request): Response
  215. // public function proveedor(Provider $provider, Request $request): Response
  216. {
  217. $promo_code = $this->stack->get('promo_code'); $view = '';
  218. $r = [];
  219. // $p = $provider;
  220. $p = $this->em->getRepository(Provider::class)->findOneBy(['slug' => $slug, 'isActivo' => 1]);
  221. // dd($p, $slug);
  222. $discs = $p->getDiscounts();
  223. if($discs){
  224. foreach ($discs as $disc){
  225. if($disc->getIsActivo()){
  226. $nombre = join(' ', [$disc->getContent(), $disc->getDiscountName(), $disc->getPostContent()]);
  227. $restricts = $disc->getRestrictions();
  228. if($restricts){
  229. $res = [];
  230. foreach ($restricts as $rest){
  231. $restri = $this->em->getRepository(Restriction::class)->findOneBy(['id' => $rest]);
  232. $color = $this->em->getRepository(Color::class)->findOneBy(['id' => $restri->getColor()->getId()]);
  233. $res[$nombre][$restri->getContent()] = $color->getContent();
  234. }
  235. }
  236. $r[$disc->getDiscountType()->getContent()][] = $res;
  237. }
  238. }
  239. }
  240. // dd($p->getProviderType()->getContent());
  241. $form = $this->createFormBuilder()->setAttribute('class', 'uk-form-horizontal uk-margin-large')
  242. ->add('fechaDesde', DateType::class, [
  243. 'widget' => 'single_text',
  244. 'attr' => ['class' => 'uk-input'],
  245. 'label' => 'Fecha Inicial',
  246. 'label_attr' => ['class' => 'uk-form-label']
  247. ])
  248. ->add('fechaHasta', DateType::class, [
  249. 'widget' => 'single_text',
  250. 'attr' => ['class' => 'uk-input'],
  251. 'label' => 'Fecha Final',
  252. 'label_attr' => ['class' => 'uk-form-label']
  253. ])
  254. ->add('adultos', IntegerType::class, [
  255. 'attr' => ['class' => 'uk-input'],
  256. 'data' => 1,
  257. 'label_attr' => ['class' => 'uk-form-label']
  258. ])
  259. ->add('menores', IntegerType::class, [
  260. 'attr' => ['class' => 'uk-input'],
  261. 'data' => 0,
  262. 'label_attr' => ['class' => 'uk-form-label']
  263. ]);
  264. if($p->getId() === 101){
  265. $form->add('destino', TextType::class,[
  266. 'attr' => ['class' => 'uk-input',
  267. 'placeholder' => 'Escriba dónde quisiera su estadía'],
  268. 'label' => 'Destino',
  269. 'label_attr' => ['class' => 'uk-form-label']])
  270. ->add('cadena', TextType::class,[
  271. 'attr' => ['class' => 'uk-input',
  272. 'placeholder' => 'Escriba su preferencia de Hotel/Cadena'],
  273. 'label' => 'Cadena',
  274. 'label_attr' => ['class' => 'uk-form-label']])
  275. ;
  276. }
  277. $f = $form->getForm();
  278. $f->handleRequest($request);
  279. // if($f->isSubmitted() && $f->isValid()){
  280. if($f->isSubmitted() && $f->isValid() && $this->getUser()){
  281. $data = $f->getData();
  282. $u = null;
  283. if($this->getUser()) $u = $this->em->getRepository(User::class)->find($this->getUser()->getUserIdentifier());
  284. $s = new Solicitud();
  285. $s->setFechaDesde($data['fechaDesde'])
  286. ->setFechaHasta($data['fechaHasta'])
  287. ->setAdultos($data['adultos'])
  288. ->setMenores($data['menores'])
  289. ->setProvider($p)
  290. ->setCreatedAt(new \DateTimeImmutable())
  291. ->setAbierta(1)
  292. ->setUser($u);
  293. $sl = new SolicitudLog();
  294. $sl->setContent('Solicitud creada por Cliente.')
  295. ->setCreatedAt(new \DateTimeImmutable())->setUser($this->getUser())->setSolicitud($s);
  296. try{
  297. if(!$this->getUser()->getEmail()) $this->addFlash('danger', 'Falta su Email.');
  298. // dd($this->getUser()->getEmail());
  299. $this->em->persist($s);
  300. $this->em->persist($sl);
  301. $this->em->flush();
  302. $this->addFlash('success', 'Solicitud completada con éxito');
  303. }catch (\Exception $exception){
  304. $this->addFlash('danger', $exception->getMessage());
  305. }
  306. }
  307. $view = $f->createView();
  308. return $this->render('home/provider.html.twig', [
  309. 'controller_name' => 'HomeController',
  310. 'rs' => $r,
  311. 'p' => $p,
  312. 'promo_code' => $promo_code,
  313. 'form' => $view
  314. ]);
  315. }
  316. /**
  317. * @Route("/solicitar/{slug}", name="app_solicitar")
  318. */
  319. public function solicitar($slug, Request $request)
  320. // public function solicitar(Provider $provider, Request $request)
  321. {
  322. $p = $this->em->getRepository(Provider::class)->findOneBy(['slug'=>$slug]);
  323. // $p = $provider;
  324. $user = $this->getUser() ?? null;
  325. $form = $this->createForm(SolicitudNoSocioType::class, null, ['proveedor'=>$p]);
  326. $form->handleRequest($request);
  327. if($form->isSubmitted() && $form->isValid()) {
  328. $d = $form->getData();
  329. $d->setProveedor($p);
  330. $this->em->persist($d);
  331. $this->em->flush();
  332. return $this->render('home/solicitar-success.html.twig', [
  333. 'p' => $p,
  334. 'd' => $d
  335. ]);
  336. }
  337. return $this->render('home/solicitar.html.twig', [
  338. 'controller_name' => 'HomeController',
  339. // 'rs' => $r,
  340. 'p' => $p,
  341. // 'promo_code' => $promo_code,
  342. 'form' => $form->createView()
  343. ]);
  344. }
  345. /**
  346. * @Route("/solicitarSocio/{slug}", name="app_solicitar_socio")
  347. */
  348. public function solicitarSocio($slug, Request $request)
  349. // public function solicitar(Provider $provider, Request $request)
  350. {
  351. $p = $this->em->getRepository(Provider::class)->findOneBy(['slug'=>$slug]);
  352. // $p = $provider;
  353. $form = $this->createForm(SolicitudSocioType::class, null, ['proveedor'=>$p, 'socio' => $this->getUser()]);
  354. $form->handleRequest($request);
  355. if($form->isSubmitted() && $form->isValid()) {
  356. $d = $form->getData();
  357. $d->setSocio($this->getUser());
  358. // dd($d);
  359. $d->setProveedor($p);
  360. $this->em->persist($d);
  361. $this->em->flush();
  362. return $this->render('home/solicitar-success-socio.html.twig', [
  363. 'p' => $p,
  364. 'd' => $d
  365. ]);
  366. }
  367. return $this->render('home/solicitar-socio.html.twig', [
  368. 'controller_name' => 'HomeController',
  369. // 'rs' => $r,
  370. 'p' => $p,
  371. // 'promo_code' => $promo_code,
  372. 'form' => $form->createView()
  373. ]);
  374. }
  375. /**
  376. * @Route("/terminos", name="app_terminos")
  377. */
  378. public function terminos(): Response
  379. {
  380. return $this->render('home/terminos.html.twig', [
  381. 'controller_name' => 'HomeController',
  382. 'promo_code' => null
  383. ]);
  384. }
  385. /**
  386. * @Route("/contacto", name="app_contacto")
  387. */
  388. public function contacto(): Response
  389. {
  390. return $this->render('home/contacto.html.twig', [
  391. 'controller_name' => 'HomeController',
  392. 'promo_code' => null
  393. ]);
  394. }
  395. /**
  396. * @Route("/privacidad", name="app_privacidad")
  397. */
  398. public function privacidad(): Response
  399. {
  400. return $this->render('home/privacidad.html.twig', [
  401. 'controller_name' => 'HomeController',
  402. 'promo_code' => null
  403. ]);
  404. }
  405. /**
  406. * @Route("/forgot", name="app_forgot")
  407. */
  408. public function forgot(Request $request): Response
  409. {
  410. }
  411. /**
  412. * @Route("/forgot2", name="app_forgotemail")
  413. */
  414. public function forgotEmail(Request $request): Response
  415. {
  416. $tel = '';
  417. $exists = 1;
  418. $f = $this->createFormBuilder()
  419. ->add('email', EmailType::class)
  420. ->getForm();
  421. $f->handleRequest($request);
  422. if($f->isSubmitted() && $f->isValid()) {
  423. $data = $f->getData();
  424. $email = $data['email'];
  425. $user = $this->em->getRepository(User::class)->findOneBy(['email' => $email, 'isActivo' => 1]);
  426. if($user){
  427. $exists = 2;
  428. $rand = new RandomCoder();
  429. $txt = 'Su nueva contraseña es: '. $rand->generate(6);
  430. if($user->getEmail()){
  431. $from_email = new \SendGrid\Mail\From(Constantes::SENDER); // Sender's email address
  432. $to_email = new \SendGrid\Mail\To($user->getEmail()); // Recipient's email address
  433. $subject = 'Nueva Contraseña'; // Email subject
  434. $content = new \SendGrid\Mail\PlainTextContent('Su nueva contraseña es: '.$code); // Email content
  435. $email = new \SendGrid\Mail\Mail($from_email, $to_email, $subject, $content); // Create email object
  436. $sendgrid = new \SendGrid(Constantes::SENDGRID_API_KEY); // Create Sendgrid object
  437. try {
  438. $response = $sendgrid->send($email); // Send email
  439. echo "Email sent successfully. Response: " . $response->statusCode(); // Print success message and response status code
  440. } catch (Exception $e) {
  441. echo "Error sending email: " . $e->getMessage(); // Print error message
  442. }
  443. }
  444. $this->stack->set('passReset', 1);
  445. $user
  446. ->setResetPin(1)
  447. ->setUpdatedAt(new \DateTimeImmutable())
  448. ->setPassword($this->hasher->hashPassword($user, $code));
  449. try {
  450. $this->em->persist($user);
  451. $this->em->flush();
  452. // $this->addFlash('success', 'Código enviado con éxito.');
  453. }catch (\Exception $e){
  454. dump($e->getMessage());exit();
  455. }
  456. }else{
  457. $exists = 0;
  458. $tel = substr($tel, -4);
  459. }
  460. $this->addFlash('success', 'Si el email existe, debe haber recibido su contraseña.');
  461. return $this->redirectToRoute('app_login', ['last_username'=>$tel]);
  462. }
  463. return $this->render('home/forgot2.html.twig', [
  464. 'controller_name' => 'HomeController',
  465. 'form' => $f->createView(),
  466. 'tel' => $tel,
  467. 'exists' => $exists,
  468. 'promo_code' => null
  469. ]);
  470. }
  471. /**
  472. * @Route("/forgot3", name="app_forgot3")
  473. */
  474. public function forgot3(Request $request): Response
  475. {
  476. $tel = '';
  477. $exists = 1;
  478. $f = $this->createFormBuilder()
  479. ->add('tel1', TelType::class)
  480. ->getForm();
  481. $f->handleRequest($request);
  482. if($f->isSubmitted() && $f->isValid()) {
  483. $data = $f->getData();
  484. $tel = $data['tel1'];
  485. $user = $this->em->getRepository(User::class)->findOneBy(['tel1' => $tel, 'isActivo' => 1]);
  486. if($user){
  487. $exists = 2;
  488. $num = random_int(100000, 999999);
  489. // $num = 123456;
  490. // dump($num);exit();
  491. // $t = new Client(Constantes::TWILIO_SID, Constantes::TWILIO_AUTH);
  492. // $t->messages->create($data['tel1'],[
  493. // 'from' => Constantes::TWILIO_NUM,
  494. // 'body' => 'Su pin provisional es: ' . $num
  495. // ]);
  496. // $t = new Client(self::TWILIO_SID, self::TWILIO_AUTH);
  497. // $verif = $t->verify->v2->services('VA6cc178569f992d96dc0285ad152e5140')
  498. // ->verifications->create('+1'.$tel, 'sms' );
  499. $user
  500. ->setResetPin(1)
  501. ->setUpdatedAt(new \DateTimeImmutable())
  502. ->setPassword($this->hasher->hashPassword($user, $num));
  503. try {
  504. $this->em->persist($user);
  505. $this->em->flush();
  506. $this->addFlash('success', 'Código enviado con éxito.');
  507. return $this->redirectToRoute('app_login', ['last_username'=>$tel]);
  508. }catch (\Exception $e){
  509. dump($e->getMessage());exit();
  510. }
  511. }else{
  512. $exists = 0;
  513. $tel = substr($tel, -4);
  514. }
  515. }
  516. return $this->render('home/forgot.html.twig', [
  517. 'controller_name' => 'HomeController',
  518. 'form' => $f->createView(),
  519. 'tel' => $tel,
  520. 'exists' => $exists,
  521. 'promo_code' => null
  522. ]);
  523. }
  524. /**
  525. * @Route("/reset_code/{num}", name="app_resetcode")
  526. */
  527. public function resetCode($num, Request $request): Response
  528. {
  529. $f = $this->createFormBuilder()
  530. ->add('tel')
  531. ->getForm();
  532. $f->handleRequest($request);
  533. if($f->isSubmitted() && $f->isValid()) {
  534. $data = $f->getData();
  535. $num = random_int(100000, 999999);
  536. // $t = new Client(Constantes::TWILIO_SID, Constantes::TWILIO_AUTH);
  537. // $t->messages->create($data,[
  538. // 'from' => Constantes::TWILIO_NUM,
  539. // 'body' => 'Su código para cambiar su contraseña es: ' . $num
  540. // ]);
  541. }
  542. return $this->render('home/forgot.html.twig', [
  543. 'controller_name' => 'HomeController',
  544. 'promo_code' => null
  545. ]);
  546. }
  547. /**
  548. * @Route("/success", name="app_success")
  549. */
  550. public function success(Request $request): Response
  551. {
  552. $promo_code = $this->stack->get('promo_code');
  553. $this->stack->set('promo_code', '');
  554. $cliente = null;
  555. $pc = '';
  556. $oc = null;
  557. $items = null;
  558. if ($_GET['redirect_status'] && $_GET['redirect_status'] == 'succeeded') {
  559. $intentId = $_GET['payment_intent'];
  560. $s = new StripeClient(Constantes::API_KEY);
  561. $intent = $s->paymentIntents->retrieve($intentId);
  562. $email = $intent->charges->data[0]->receipt_email;
  563. $nombre = $intent->charges->data[0]->shipping->name;
  564. $tel = $intent->charges->data[0]->shipping->phone;
  565. $pc = $intent->metadata['promoCode'];
  566. $items = $intent->metadata['items'];
  567. $amt = $intent->charges->data[0]->amount / 100;
  568. if ($tel) {
  569. $cliente = $this->em->getRepository(User::class)->findOneBy(['tel1' => $tel]);
  570. } elseif ($email) {
  571. $cliente = $this->em->getRepository(User::class)->findOneBy(['email' => $email]);
  572. }
  573. if (!$cliente) {
  574. $cliente = new User();
  575. $cliente->setNombreCompleto($nombre)->setIsActivo(1)->setTel1($tel)->setEmail($email)
  576. ->setResetPin(1)->setRoles(['ROLE_USER']);
  577. $this->em->persist($cliente);
  578. $this->em->flush();
  579. }
  580. if ($cliente) {
  581. $pd = new PromoDiscounter($this->em);
  582. $pd->setCodeNombre($pc);
  583. $cliente->setSubscriptionStatus('Activo')->setUsedPromoCode($pd->getPromoCode());
  584. $o = new Orden();
  585. $o->setUser($cliente)
  586. ->setOrdenOrigen($this->em->getRepository(OrdenOrigen::class)->find(2))
  587. ->setHasSubsCreated(0)->setIsCompleted(1)->setOrdenTotal(0)
  588. ->setCreatedAt(new \DateTimeImmutable())->setPromoCode($pd->getPromoCode())
  589. ->setPaymentIntent($intentId)->setReceiptUrl($intent->charges->data[0]->receipt_url);
  590. $worden = $this->registry->get($o);
  591. $worden->apply($o, 'completar');
  592. $subtotal = 0;
  593. foreach (explode(',', $items) as $id) {
  594. $p = $this->em->getRepository(Product::class)->find($id);
  595. $oi = new OrdenItem();
  596. $amt = $pd->getDiscountedAmt($p->getRatePrecio());
  597. $oi->setProducto($p)->setAmt($amt)->setQty(1)->setPromoCode($pd->getPromoCode());
  598. $subtotal += $amt;
  599. $o->addOrdenItem($oi);
  600. }
  601. $o->setSubTotal($subtotal)->calcOrdenTotal()->setBalance(0);
  602. $tx = new Taxer();
  603. $tx->setAmt($subtotal)->setTaxRepository($this->em->getRepository(Tax::class))->build();
  604. $o->setTaxes($tx->getAddedTax());
  605. $o->calcOrdenTotal();
  606. $t = new Transaction();
  607. $t->setCreatedAt(new \DateTimeImmutable())->setOrden($o)
  608. ->setPaymentMethod($this->em->getRepository(PaymentMethod::class)->find(5))
  609. ->setAmt($o->getOrdenTotal());
  610. foreach ($tx->getAddedTaxDetailed() as $tax) {
  611. $tr = new TaxRecord();
  612. $tr->setAmt($tax[0])->setTax($tax[1])->setCreatedAt(new \DateTimeImmutable());
  613. $this->em->persist($tr);
  614. $t->addTaxRecord($tr);
  615. }
  616. $this->em->persist($o);
  617. $this->em->persist($t);
  618. $this->em->flush();
  619. // $pfr = new PlatformFeeRecorder();
  620. $sc = new SubscriptionCreator($cliente);
  621. foreach ($o->getOrdenItems() as $item) {
  622. // $item = new OrdenItem();
  623. $usager = new PromoCodeUsager($item);
  624. $usager->build();
  625. $sc1 = $sc->build($item);
  626. // if($item->getProducto()->getAcceptsPromoCode()){
  627. // if($item->getPromoCode()){
  628. // $pcu = new PromoCodeUsage();
  629. // $pcu->setSubscription($sc->getSubscription())->setPromoCode($item->getPromoCode())
  630. // ->setCurrentPlace('Unpaid')->setFechaDeUso(new \DateTimeImmutable());
  631. // $this->em->persist($pcu);
  632. // }
  633. }
  634. $ml = $this->em->getRepository(MailingList::class)->find(1);
  635. $cliente->setLastSubscriptionDate($sc->getSubscription()->getExpiresAt())
  636. ->setMailingList($ml);
  637. $sc->archivePreviousSubs($this->em);
  638. $grider = new Sendgrider();
  639. $grider->setLista('todos');
  640. $grider->addUserToSendgrid($cliente);
  641. $grider->send();
  642. if ($usager->getPromoCodeUsage()) $this->em->persist($usager->getPromoCodeUsage());
  643. if ($usager->getPlatformFee()) $this->em->persist($usager->getPlatformFee());
  644. $this->em->persist($cliente);
  645. // $pfr1 = $pfr->build($item);
  646. if ($sc1) $this->em->persist($sc1);
  647. // if($pfr1) $this->em->persist($pfr1);
  648. }
  649. $this->em->flush();
  650. $mail = new Mail();
  651. $mail->addDynamicTemplateData('User_name', $cliente->getNombre());
  652. $mail->setFrom(Constantes::SENDER, Constantes::SENDER_NAME);
  653. $email_1 = Constantes::ENV == 'prod' ? $cliente->getEmail() : 'vmena01@gmail.com';
  654. $mail->addTo($email_1, $cliente->getNombreCompleto());
  655. $mail->setSubject('DreamVacation Puerto Rico le da la Bienvenida');
  656. $mail->setTemplateId('d-cf70055e07c142b5bfb933c9b986b6cf');
  657. $sg = $grider->getSg();
  658. $response = $sg->client->mail()->send()->post($mail);
  659. if (Constantes::ENV == 'prod') {
  660. $body = 'Bienvenido a DreamVacation: https://dreamvacationpr.com/account';
  661. // $sms = new Client(Constantes::TWILIO_SID, Constantes::TWILIO_AUTH);
  662. // $sms->messages->create($cliente->getTel1(),
  663. // [
  664. // 'from' => "+17873392151",
  665. // 'body' => $body
  666. // ]);
  667. }
  668. $form = $this->createFormBuilder()
  669. ->setAction('loginlink')
  670. ->add('tel1', HiddenType::class, [
  671. 'data' => $cliente->getTel1()
  672. ])
  673. ->getForm();
  674. $r = $form->createView();
  675. return $this->render('home/success.html.twig', [
  676. 'controller_name' => 'HomeController',
  677. 'form' => $r,
  678. 'promo_code' => $promo_code
  679. ]);
  680. }else{
  681. return $this->render('home/index.html.twig', [
  682. 'controller_name' => 'HomeController',
  683. 'promo_code' => $promo_code
  684. ]);
  685. }
  686. }
  687. public function emailLogin(Request $request)
  688. {
  689. if(isset($_GET['clienteTel'])){
  690. $cliente = $this->em->getRepository(User::class)->findOneBy(['tel1'=>$_GET['clienteTel']]);
  691. if($cliente){
  692. $form = $this->createFormBuilder()
  693. ->setAction('loginlink')
  694. ->add('tel1', HiddenType::class, [
  695. 'data' => $cliente->getTel1()
  696. ])
  697. ->getForm();
  698. $r = $form->createView();
  699. return $this->render('home/success.html.twig', [
  700. 'controller_name' => 'HomeController',
  701. 'form' => $r,
  702. 'promo_code' => ''
  703. ]);
  704. }
  705. }
  706. return $this->redirectToRoute('app_home');
  707. //todo - encrypt url
  708. }
  709. /**
  710. * @Route("/pdf/{slug}", name="app_pdf")
  711. */
  712. public function pdf($slug): Response
  713. {
  714. $promo_code = $this->stack->get('promo_code');
  715. $r = []; $di = [];
  716. $p = $this->em->getRepository(Programa::class)->findOneBy(['slug' => $slug]);
  717. $provs = $p->getProvider();
  718. $slug = $p->getSlug();
  719. if($provs){
  720. foreach ($provs as $pr){
  721. $prov = $this->em->getRepository(Provider::class)->find($pr);
  722. if($prov->getIsActivo()){
  723. $discs = $prov->getDiscounts();
  724. if($discs){
  725. $di = [];
  726. foreach ($discs as $disc){
  727. if($disc->getIsActivo()){
  728. $restr = $disc->getFeatures();
  729. $di[$disc->getNombreParcial()] = join(', ', $disc->getRestrictions()->toArray());
  730. }
  731. }
  732. }
  733. $r[$prov->getProviderType()->getPlural()][] =[
  734. 'nombre' => $prov->getNombre(0),
  735. 'location' => $prov->getLocation(),
  736. 'slug' => $prov->getSlug(),
  737. 'discounts' => $di
  738. ];
  739. }
  740. }
  741. }
  742. $pdf = new Pdf('/usr/local/bin/wkhtmltopdf');
  743. $pdf->setTemporaryFolder('/var/www/html/computechapps.com/var/cache/prod');
  744. $pdf->setOptions(['title' => 'DreamVacation Puerto Rico']);
  745. $html = $this->render('home/pdf_programa.html.twig',[
  746. 'rs' => $r,
  747. 'programa' => $p
  748. ]);
  749. return new PdfResponse($pdf->getOutputFromHtml($html), $p.'.pdf');
  750. }
  751. }