src/Controller/HomeController.php line 176

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 $managerSecurity $securityUserPasswordHasherInterface $hasherRequestStack $stackRegistry $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($slugRequest $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($slugRequest $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($slugRequest $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(100000999999);
  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($numRequest $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(100000999999);
  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::SENDERConstantes::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. }