<?php
namespace App\Controller;
use App\Entity\Color;
use App\Entity\Discount;
use App\Entity\MailingList;
use App\Entity\Orden;
use App\Entity\OrdenItem;
use App\Entity\OrdenOrigen;
use App\Entity\PaymentIntent;
use App\Entity\PaymentMethod;
use App\Entity\Product;
use App\Entity\Programa;
use App\Entity\ProgramaType;
use App\Entity\PromoCode;
use App\Entity\PromoCodeUsage;
use App\Entity\Provider;
use App\Entity\Restriction;
use App\Entity\Solicitud;
use App\Entity\SolicitudLog;
use App\Entity\Subscription;
use App\Entity\Tax;
use App\Entity\TaxRecord;
use App\Entity\Transaction;
use App\Entity\User;
use App\Form\ProductType;
use App\Form\SolicitudNoSocioType;
use App\Form\SolicitudSocioType;
use App\Libs\Constantes;
use App\Libs\Emailer;
use App\Libs\OrdenCreator;
use App\Libs\PlatformFeeRecorder;
use App\Libs\PromoCodeUsager;
use App\Libs\PromoCodeUsageRecorder;
use App\Libs\PromoDiscounter;
use App\Libs\RandomCoder;
use App\Libs\Sendgrider;
use App\Libs\StripeCustomers;
use App\Libs\SubscriptionCreator;
use App\Libs\Taxer;
use App\Libs\TaxRecorder;
use Doctrine\DBAL\Driver\Exception;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Knp\Snappy\Pdf;
use SendGrid\Mail\Mail;
use Stripe\Checkout\Session;
use Stripe\Stripe;
use Stripe\StripeClient;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\TelType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Validator\Constraints\Date;
use Symfony\Component\Workflow\Registry;
use Twilio\Options;
use Twilio\Rest\Client;
use function Symfony\Component\String\s;
class HomeController extends AbstractController
{
protected $em;
protected $security;
protected $hasher;
/**
* @var RequestStack
*/
private $stack;
/**
* @var Registry
*/
private $registry;
public function __construct(EntityManagerInterface $manager, Security $security, UserPasswordHasherInterface $hasher, RequestStack $stack, Registry $registry)
{
$this->hasher = $hasher;
$this->security = $security;
$this->em = $manager;
$this->stack = $stack->getSession();
$this->registry = $registry;
}
/**
* @Route("/", name="app_home")
*/
public function index(Request $request): Response
{
$promo_code = $this->stack->get('promo_code');
if($this->security->isGranted('ROLE_USER')) return $this->redirectToRoute('app_account');
$f = $this->getForm();
return $this->render('home/index.html.twig', [
'controller_name' => 'HomeController',
'form' => $f->createView(),
'promo_code' => $promo_code
]);
}
/**
* @Route("/promo/clear", name="app_homepromoclear")
*/
public function clear(Request $request, $promo_code = null) : Response
{
$this->stack->clear();
return $this->redirectToRoute('app_home');
}
/**
* @Route("/promo/{promo_code}", name="app_homepromo")
*/
public function promo(Request $request, $promo_code = null) : Response
{
$this->stack->start();
$this->stack->clear();
$pc = $this->em->getRepository(PromoCode::class)->findOneBy(['content'=>$promo_code]);
if($pc){
$this->stack->set('promo_code', strtoupper($promo_code));
}
return $this->redirectToRoute('app_home');
}
protected function getForm()
{
return $this->createFormBuilder()
->setAction('/mailing/subscribe')
->add('email', EmailType::class, [
'label' => false
])
->add('nombre', TextType::class, [
'label' => false
])
->getForm();
}
/**
* @Route("/membresias/{tipo}", name="app_membresias")
*/
public function membresias($tipo): Response
{
$promo_code = $this->stack->get('promo_code');
$r = [];$count = 0;
$pt = $this->em->getRepository(ProgramaType::class)->findOneBy(['slug'=>$tipo]);
if($pt){
$progs = $pt->getProgramas()->filter(function (Programa $programa){
return $programa->getIsActivo() == true;
});
$count = count($progs);
if($progs){
foreach ($progs as $prog){
if($prog->getIsActivo()){
$r[] = $prog;
}
}
}
}
$f = $this->getForm();
return $this->render('home/membresias.html.twig', [
'controller_name' => 'HomeController',
'rs' => $r,
'count' => $count,
'type' => $pt->getContent(),
'form' => $f->createView(),
'promo_code' => $promo_code
]);
}
/**
* @Route("/programa/{slug}", name="app_programa")
*/
public function programa($slug): Response
{
$promo_code = $this->stack->get('promo_code');
$r = [];
$p = $this->em->getRepository(Programa::class)->findOneBy(['slug' => $slug]);
$intern = $this->em->getRepository(Provider::class)->find(101);
$provs = $p->getProvider();
if($provs){
foreach ($provs as $pr){
$prov = $this->em->getRepository(Provider::class)->find($pr);
// $prov = new Provider();
if($prov->getIsActivo()){
$discs = $prov->getDiscounts();
if($discs){
$di = [];
foreach ($discs as $disc){
if($disc->getIsActivo()){
$restr = $disc->getFeatures();
$di[$disc->getNombreParcial()] = $restr->toArray();
}
}
$r[$prov->getProviderType()->getContent()][$prov->getSlug()] = [
'nombre' => $prov->getNombre(1),
'slug' => $prov->getSlug(),
'discounts' => $di,
'idType' => $prov->getProviderType()->getId()
];
// dd($r);
}
}
}
}
// dd($this->getUser());
return $this->render('home/programa.html.twig', [
'controller_name' => 'HomeController',
'rs' => $r,
'programa' => $p,
'slug' => $slug,
'promo_code' => $promo_code,
'intern' => $intern
]);
}
/**
* @Route("/proveedor/{slug}", name="app_proveedor")
*/
public function proveedor($slug, Request $request): Response
// public function proveedor(Provider $provider, Request $request): Response
{
$promo_code = $this->stack->get('promo_code'); $view = '';
$r = [];
// $p = $provider;
$p = $this->em->getRepository(Provider::class)->findOneBy(['slug' => $slug, 'isActivo' => 1]);
// dd($p, $slug);
$discs = $p->getDiscounts();
if($discs){
foreach ($discs as $disc){
if($disc->getIsActivo()){
$nombre = join(' ', [$disc->getContent(), $disc->getDiscountName(), $disc->getPostContent()]);
$restricts = $disc->getRestrictions();
if($restricts){
$res = [];
foreach ($restricts as $rest){
$restri = $this->em->getRepository(Restriction::class)->findOneBy(['id' => $rest]);
$color = $this->em->getRepository(Color::class)->findOneBy(['id' => $restri->getColor()->getId()]);
$res[$nombre][$restri->getContent()] = $color->getContent();
}
}
$r[$disc->getDiscountType()->getContent()][] = $res;
}
}
}
// dd($p->getProviderType()->getContent());
$form = $this->createFormBuilder()->setAttribute('class', 'uk-form-horizontal uk-margin-large')
->add('fechaDesde', DateType::class, [
'widget' => 'single_text',
'attr' => ['class' => 'uk-input'],
'label' => 'Fecha Inicial',
'label_attr' => ['class' => 'uk-form-label']
])
->add('fechaHasta', DateType::class, [
'widget' => 'single_text',
'attr' => ['class' => 'uk-input'],
'label' => 'Fecha Final',
'label_attr' => ['class' => 'uk-form-label']
])
->add('adultos', IntegerType::class, [
'attr' => ['class' => 'uk-input'],
'data' => 1,
'label_attr' => ['class' => 'uk-form-label']
])
->add('menores', IntegerType::class, [
'attr' => ['class' => 'uk-input'],
'data' => 0,
'label_attr' => ['class' => 'uk-form-label']
]);
if($p->getId() === 101){
$form->add('destino', TextType::class,[
'attr' => ['class' => 'uk-input',
'placeholder' => 'Escriba dónde quisiera su estadÃa'],
'label' => 'Destino',
'label_attr' => ['class' => 'uk-form-label']])
->add('cadena', TextType::class,[
'attr' => ['class' => 'uk-input',
'placeholder' => 'Escriba su preferencia de Hotel/Cadena'],
'label' => 'Cadena',
'label_attr' => ['class' => 'uk-form-label']])
;
}
$f = $form->getForm();
$f->handleRequest($request);
// if($f->isSubmitted() && $f->isValid()){
if($f->isSubmitted() && $f->isValid() && $this->getUser()){
$data = $f->getData();
$u = null;
if($this->getUser()) $u = $this->em->getRepository(User::class)->find($this->getUser()->getUserIdentifier());
$s = new Solicitud();
$s->setFechaDesde($data['fechaDesde'])
->setFechaHasta($data['fechaHasta'])
->setAdultos($data['adultos'])
->setMenores($data['menores'])
->setProvider($p)
->setCreatedAt(new \DateTimeImmutable())
->setAbierta(1)
->setUser($u);
$sl = new SolicitudLog();
$sl->setContent('Solicitud creada por Cliente.')
->setCreatedAt(new \DateTimeImmutable())->setUser($this->getUser())->setSolicitud($s);
try{
if(!$this->getUser()->getEmail()) $this->addFlash('danger', 'Falta su Email.');
// dd($this->getUser()->getEmail());
$this->em->persist($s);
$this->em->persist($sl);
$this->em->flush();
$this->addFlash('success', 'Solicitud completada con éxito');
}catch (\Exception $exception){
$this->addFlash('danger', $exception->getMessage());
}
}
$view = $f->createView();
return $this->render('home/provider.html.twig', [
'controller_name' => 'HomeController',
'rs' => $r,
'p' => $p,
'promo_code' => $promo_code,
'form' => $view
]);
}
/**
* @Route("/solicitar/{slug}", name="app_solicitar")
*/
public function solicitar($slug, Request $request)
// public function solicitar(Provider $provider, Request $request)
{
$p = $this->em->getRepository(Provider::class)->findOneBy(['slug'=>$slug]);
// $p = $provider;
$user = $this->getUser() ?? null;
$form = $this->createForm(SolicitudNoSocioType::class, null, ['proveedor'=>$p]);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$d = $form->getData();
$d->setProveedor($p);
$this->em->persist($d);
$this->em->flush();
return $this->render('home/solicitar-success.html.twig', [
'p' => $p,
'd' => $d
]);
}
return $this->render('home/solicitar.html.twig', [
'controller_name' => 'HomeController',
// 'rs' => $r,
'p' => $p,
// 'promo_code' => $promo_code,
'form' => $form->createView()
]);
}
/**
* @Route("/solicitarSocio/{slug}", name="app_solicitar_socio")
*/
public function solicitarSocio($slug, Request $request)
// public function solicitar(Provider $provider, Request $request)
{
$p = $this->em->getRepository(Provider::class)->findOneBy(['slug'=>$slug]);
// $p = $provider;
$form = $this->createForm(SolicitudSocioType::class, null, ['proveedor'=>$p, 'socio' => $this->getUser()]);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$d = $form->getData();
$d->setSocio($this->getUser());
// dd($d);
$d->setProveedor($p);
$this->em->persist($d);
$this->em->flush();
return $this->render('home/solicitar-success-socio.html.twig', [
'p' => $p,
'd' => $d
]);
}
return $this->render('home/solicitar-socio.html.twig', [
'controller_name' => 'HomeController',
// 'rs' => $r,
'p' => $p,
// 'promo_code' => $promo_code,
'form' => $form->createView()
]);
}
/**
* @Route("/terminos", name="app_terminos")
*/
public function terminos(): Response
{
return $this->render('home/terminos.html.twig', [
'controller_name' => 'HomeController',
'promo_code' => null
]);
}
/**
* @Route("/contacto", name="app_contacto")
*/
public function contacto(): Response
{
return $this->render('home/contacto.html.twig', [
'controller_name' => 'HomeController',
'promo_code' => null
]);
}
/**
* @Route("/privacidad", name="app_privacidad")
*/
public function privacidad(): Response
{
return $this->render('home/privacidad.html.twig', [
'controller_name' => 'HomeController',
'promo_code' => null
]);
}
/**
* @Route("/forgot", name="app_forgot")
*/
public function forgot(Request $request): Response
{
}
/**
* @Route("/forgot2", name="app_forgotemail")
*/
public function forgotEmail(Request $request): Response
{
$tel = '';
$exists = 1;
$f = $this->createFormBuilder()
->add('email', EmailType::class)
->getForm();
$f->handleRequest($request);
if($f->isSubmitted() && $f->isValid()) {
$data = $f->getData();
$email = $data['email'];
$user = $this->em->getRepository(User::class)->findOneBy(['email' => $email, 'isActivo' => 1]);
if($user){
$exists = 2;
$rand = new RandomCoder();
$txt = 'Su nueva contraseña es: '. $rand->generate(6);
if($user->getEmail()){
$from_email = new \SendGrid\Mail\From(Constantes::SENDER); // Sender's email address
$to_email = new \SendGrid\Mail\To($user->getEmail()); // Recipient's email address
$subject = 'Nueva Contraseña'; // Email subject
$content = new \SendGrid\Mail\PlainTextContent('Su nueva contraseña es: '.$code); // Email content
$email = new \SendGrid\Mail\Mail($from_email, $to_email, $subject, $content); // Create email object
$sendgrid = new \SendGrid(Constantes::SENDGRID_API_KEY); // Create Sendgrid object
try {
$response = $sendgrid->send($email); // Send email
echo "Email sent successfully. Response: " . $response->statusCode(); // Print success message and response status code
} catch (Exception $e) {
echo "Error sending email: " . $e->getMessage(); // Print error message
}
}
$this->stack->set('passReset', 1);
$user
->setResetPin(1)
->setUpdatedAt(new \DateTimeImmutable())
->setPassword($this->hasher->hashPassword($user, $code));
try {
$this->em->persist($user);
$this->em->flush();
// $this->addFlash('success', 'Código enviado con éxito.');
}catch (\Exception $e){
dump($e->getMessage());exit();
}
}else{
$exists = 0;
$tel = substr($tel, -4);
}
$this->addFlash('success', 'Si el email existe, debe haber recibido su contraseña.');
return $this->redirectToRoute('app_login', ['last_username'=>$tel]);
}
return $this->render('home/forgot2.html.twig', [
'controller_name' => 'HomeController',
'form' => $f->createView(),
'tel' => $tel,
'exists' => $exists,
'promo_code' => null
]);
}
/**
* @Route("/forgot3", name="app_forgot3")
*/
public function forgot3(Request $request): Response
{
$tel = '';
$exists = 1;
$f = $this->createFormBuilder()
->add('tel1', TelType::class)
->getForm();
$f->handleRequest($request);
if($f->isSubmitted() && $f->isValid()) {
$data = $f->getData();
$tel = $data['tel1'];
$user = $this->em->getRepository(User::class)->findOneBy(['tel1' => $tel, 'isActivo' => 1]);
if($user){
$exists = 2;
$num = random_int(100000, 999999);
// $num = 123456;
// dump($num);exit();
// $t = new Client(Constantes::TWILIO_SID, Constantes::TWILIO_AUTH);
// $t->messages->create($data['tel1'],[
// 'from' => Constantes::TWILIO_NUM,
// 'body' => 'Su pin provisional es: ' . $num
// ]);
// $t = new Client(self::TWILIO_SID, self::TWILIO_AUTH);
// $verif = $t->verify->v2->services('VA6cc178569f992d96dc0285ad152e5140')
// ->verifications->create('+1'.$tel, 'sms' );
$user
->setResetPin(1)
->setUpdatedAt(new \DateTimeImmutable())
->setPassword($this->hasher->hashPassword($user, $num));
try {
$this->em->persist($user);
$this->em->flush();
$this->addFlash('success', 'Código enviado con éxito.');
return $this->redirectToRoute('app_login', ['last_username'=>$tel]);
}catch (\Exception $e){
dump($e->getMessage());exit();
}
}else{
$exists = 0;
$tel = substr($tel, -4);
}
}
return $this->render('home/forgot.html.twig', [
'controller_name' => 'HomeController',
'form' => $f->createView(),
'tel' => $tel,
'exists' => $exists,
'promo_code' => null
]);
}
/**
* @Route("/reset_code/{num}", name="app_resetcode")
*/
public function resetCode($num, Request $request): Response
{
$f = $this->createFormBuilder()
->add('tel')
->getForm();
$f->handleRequest($request);
if($f->isSubmitted() && $f->isValid()) {
$data = $f->getData();
$num = random_int(100000, 999999);
// $t = new Client(Constantes::TWILIO_SID, Constantes::TWILIO_AUTH);
// $t->messages->create($data,[
// 'from' => Constantes::TWILIO_NUM,
// 'body' => 'Su código para cambiar su contraseña es: ' . $num
// ]);
}
return $this->render('home/forgot.html.twig', [
'controller_name' => 'HomeController',
'promo_code' => null
]);
}
/**
* @Route("/success", name="app_success")
*/
public function success(Request $request): Response
{
$promo_code = $this->stack->get('promo_code');
$this->stack->set('promo_code', '');
$cliente = null;
$pc = '';
$oc = null;
$items = null;
if ($_GET['redirect_status'] && $_GET['redirect_status'] == 'succeeded') {
$intentId = $_GET['payment_intent'];
$s = new StripeClient(Constantes::API_KEY);
$intent = $s->paymentIntents->retrieve($intentId);
$email = $intent->charges->data[0]->receipt_email;
$nombre = $intent->charges->data[0]->shipping->name;
$tel = $intent->charges->data[0]->shipping->phone;
$pc = $intent->metadata['promoCode'];
$items = $intent->metadata['items'];
$amt = $intent->charges->data[0]->amount / 100;
if ($tel) {
$cliente = $this->em->getRepository(User::class)->findOneBy(['tel1' => $tel]);
} elseif ($email) {
$cliente = $this->em->getRepository(User::class)->findOneBy(['email' => $email]);
}
if (!$cliente) {
$cliente = new User();
$cliente->setNombreCompleto($nombre)->setIsActivo(1)->setTel1($tel)->setEmail($email)
->setResetPin(1)->setRoles(['ROLE_USER']);
$this->em->persist($cliente);
$this->em->flush();
}
if ($cliente) {
$pd = new PromoDiscounter($this->em);
$pd->setCodeNombre($pc);
$cliente->setSubscriptionStatus('Activo')->setUsedPromoCode($pd->getPromoCode());
$o = new Orden();
$o->setUser($cliente)
->setOrdenOrigen($this->em->getRepository(OrdenOrigen::class)->find(2))
->setHasSubsCreated(0)->setIsCompleted(1)->setOrdenTotal(0)
->setCreatedAt(new \DateTimeImmutable())->setPromoCode($pd->getPromoCode())
->setPaymentIntent($intentId)->setReceiptUrl($intent->charges->data[0]->receipt_url);
$worden = $this->registry->get($o);
$worden->apply($o, 'completar');
$subtotal = 0;
foreach (explode(',', $items) as $id) {
$p = $this->em->getRepository(Product::class)->find($id);
$oi = new OrdenItem();
$amt = $pd->getDiscountedAmt($p->getRatePrecio());
$oi->setProducto($p)->setAmt($amt)->setQty(1)->setPromoCode($pd->getPromoCode());
$subtotal += $amt;
$o->addOrdenItem($oi);
}
$o->setSubTotal($subtotal)->calcOrdenTotal()->setBalance(0);
$tx = new Taxer();
$tx->setAmt($subtotal)->setTaxRepository($this->em->getRepository(Tax::class))->build();
$o->setTaxes($tx->getAddedTax());
$o->calcOrdenTotal();
$t = new Transaction();
$t->setCreatedAt(new \DateTimeImmutable())->setOrden($o)
->setPaymentMethod($this->em->getRepository(PaymentMethod::class)->find(5))
->setAmt($o->getOrdenTotal());
foreach ($tx->getAddedTaxDetailed() as $tax) {
$tr = new TaxRecord();
$tr->setAmt($tax[0])->setTax($tax[1])->setCreatedAt(new \DateTimeImmutable());
$this->em->persist($tr);
$t->addTaxRecord($tr);
}
$this->em->persist($o);
$this->em->persist($t);
$this->em->flush();
// $pfr = new PlatformFeeRecorder();
$sc = new SubscriptionCreator($cliente);
foreach ($o->getOrdenItems() as $item) {
// $item = new OrdenItem();
$usager = new PromoCodeUsager($item);
$usager->build();
$sc1 = $sc->build($item);
// if($item->getProducto()->getAcceptsPromoCode()){
// if($item->getPromoCode()){
// $pcu = new PromoCodeUsage();
// $pcu->setSubscription($sc->getSubscription())->setPromoCode($item->getPromoCode())
// ->setCurrentPlace('Unpaid')->setFechaDeUso(new \DateTimeImmutable());
// $this->em->persist($pcu);
// }
}
$ml = $this->em->getRepository(MailingList::class)->find(1);
$cliente->setLastSubscriptionDate($sc->getSubscription()->getExpiresAt())
->setMailingList($ml);
$sc->archivePreviousSubs($this->em);
$grider = new Sendgrider();
$grider->setLista('todos');
$grider->addUserToSendgrid($cliente);
$grider->send();
if ($usager->getPromoCodeUsage()) $this->em->persist($usager->getPromoCodeUsage());
if ($usager->getPlatformFee()) $this->em->persist($usager->getPlatformFee());
$this->em->persist($cliente);
// $pfr1 = $pfr->build($item);
if ($sc1) $this->em->persist($sc1);
// if($pfr1) $this->em->persist($pfr1);
}
$this->em->flush();
$mail = new Mail();
$mail->addDynamicTemplateData('User_name', $cliente->getNombre());
$mail->setFrom(Constantes::SENDER, Constantes::SENDER_NAME);
$email_1 = Constantes::ENV == 'prod' ? $cliente->getEmail() : 'vmena01@gmail.com';
$mail->addTo($email_1, $cliente->getNombreCompleto());
$mail->setSubject('DreamVacation Puerto Rico le da la Bienvenida');
$mail->setTemplateId('d-cf70055e07c142b5bfb933c9b986b6cf');
$sg = $grider->getSg();
$response = $sg->client->mail()->send()->post($mail);
if (Constantes::ENV == 'prod') {
$body = 'Bienvenido a DreamVacation: https://dreamvacationpr.com/account';
// $sms = new Client(Constantes::TWILIO_SID, Constantes::TWILIO_AUTH);
// $sms->messages->create($cliente->getTel1(),
// [
// 'from' => "+17873392151",
// 'body' => $body
// ]);
}
$form = $this->createFormBuilder()
->setAction('loginlink')
->add('tel1', HiddenType::class, [
'data' => $cliente->getTel1()
])
->getForm();
$r = $form->createView();
return $this->render('home/success.html.twig', [
'controller_name' => 'HomeController',
'form' => $r,
'promo_code' => $promo_code
]);
}else{
return $this->render('home/index.html.twig', [
'controller_name' => 'HomeController',
'promo_code' => $promo_code
]);
}
}
public function emailLogin(Request $request)
{
if(isset($_GET['clienteTel'])){
$cliente = $this->em->getRepository(User::class)->findOneBy(['tel1'=>$_GET['clienteTel']]);
if($cliente){
$form = $this->createFormBuilder()
->setAction('loginlink')
->add('tel1', HiddenType::class, [
'data' => $cliente->getTel1()
])
->getForm();
$r = $form->createView();
return $this->render('home/success.html.twig', [
'controller_name' => 'HomeController',
'form' => $r,
'promo_code' => ''
]);
}
}
return $this->redirectToRoute('app_home');
//todo - encrypt url
}
/**
* @Route("/pdf/{slug}", name="app_pdf")
*/
public function pdf($slug): Response
{
$promo_code = $this->stack->get('promo_code');
$r = []; $di = [];
$p = $this->em->getRepository(Programa::class)->findOneBy(['slug' => $slug]);
$provs = $p->getProvider();
$slug = $p->getSlug();
if($provs){
foreach ($provs as $pr){
$prov = $this->em->getRepository(Provider::class)->find($pr);
if($prov->getIsActivo()){
$discs = $prov->getDiscounts();
if($discs){
$di = [];
foreach ($discs as $disc){
if($disc->getIsActivo()){
$restr = $disc->getFeatures();
$di[$disc->getNombreParcial()] = join(', ', $disc->getRestrictions()->toArray());
}
}
}
$r[$prov->getProviderType()->getPlural()][] =[
'nombre' => $prov->getNombre(0),
'location' => $prov->getLocation(),
'slug' => $prov->getSlug(),
'discounts' => $di
];
}
}
}
$pdf = new Pdf('/usr/local/bin/wkhtmltopdf');
$pdf->setTemporaryFolder('/var/www/html/computechapps.com/var/cache/prod');
$pdf->setOptions(['title' => 'DreamVacation Puerto Rico']);
$html = $this->render('home/pdf_programa.html.twig',[
'rs' => $r,
'programa' => $p
]);
return new PdfResponse($pdf->getOutputFromHtml($html), $p.'.pdf');
}
}