<?php
namespace App\Controller;
use App\Entity\Product;
use App\Entity\PromoCode;
use App\Entity\Tax;
use App\Libs\Constantes;
use App\Libs\PromoDiscounter;
use App\Libs\Taxer;
use Doctrine\ORM\EntityManagerInterface;
use Stripe\StripeClient;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
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\Routing\Annotation\Route;
class CartController extends AbstractController
{
/**
* @var EntityManagerInterface
*/
private $em;
/**
* @var RequestStack
*/
private $stack;
public function __construct(EntityManagerInterface $em, RequestStack $stack)
{
$this->em = $em;
$this->stack = $stack->getSession();
}
/**
* @Route("/cart", name="app_cart")
*/
public function index(Request $request): Response
{
$promo_code = $this->stack->get('promo_code');
// if($promo_code) return $this->redirectToRoute('app_checkout_aplicado');
$em = $this->em;
$productos = $em->getRepository(Product::class)->findBy(['isPublico' => 1, 'isActivo' => 1]);
$rs = [];
$form = $this->createFormBuilder()->setAction($this->generateUrl('app_checkout'))
->add('ids', HiddenType::class)
->getForm();
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
$data = $form->getData();
if($data){
$subtotal = 0;
$ids = explode(',', $data['ids']);
if($ids)
$pcd = new PromoDiscounter($this->em);
$pcd->setCodeNombre($promo_code);
foreach ($ids as $id){
$p = $this->em->getRepository(Product::class)->find($id);
if(!$p) return $this->redirectToRoute('app_cart');
$amt = $pcd->getDiscountedAmt($p->getRatePrecio());
$rs[] = ['id' => $id, 'content' => $p->getProductName(), 'precio' => $amt];
$subtotal += $amt;
}
}else{
return $this->redirectToRoute('app_cart');
}
//dump($subtotal);exit;
$t = new Taxer();
$t->setAmt($subtotal)->setTaxRepository($this->em->getRepository(Tax::class))->build();
$tax = $t->getAddedTax();
$stripe = new StripeClient(Constantes::API_KEY);
$intent = $stripe->paymentIntents->create([
'automatic_payment_methods' => ['enabled' => true],
'amount' => ($subtotal + $tax)*100,
'currency' => 'usd',
'metadata' => ['items' => $data['ids'], 'promoCode' => $pcd->getCodeNombre()]
]);
$this->stack->set('intent', $intent->id);
$this->stack->set('secret', $intent->client_secret);
//dump($intent);exit();
$form2 = $this->createFormBuilder()->setAction($this->generateUrl('app_checkout'))
->add('ids', HiddenType::class, [
'data' => $data['ids']
])->add('promoCode', TextType::class, [
'data' => $promo_code,
'label' => false,
'attr' => ['class'=>'uk-input', 'placeholder' => 'Código de Promoción']
])->add('secret', HiddenType::class, [
'data' => $intent->client_secret
])->add('intent', HiddenType::class, [
'data' => $intent->id
])->getForm();
$payForm = $this->createFormBuilder()
->add('secret', HiddenType::class, [
'data' => $this->stack->get('secret')
])->add('intent', HiddenType::class, [
'data' => $this->stack->get('intent')
])->getForm();
return $this->render('home/checkout.html.twig', [
'controller_name' => 'HomeController',
'prods' => $rs,
'subtotal' => $subtotal,
'payForm' => $payForm->createView(),
'listForm' => $form2->createView(),
'tax' => $tax,
'ids' => $data['ids'],
'codigoStatus' => $pcd->getStatus(),
'codigoMessage' => $pcd->getMessage(),
'code' => $promo_code,
'client_secret' => $intent->client_secret,
'intent' => $intent->id,
'api' => Constantes::API_KEY_PK,
'promo_code' => strtoupper($promo_code)
]);
}
return $this->render('home/cart.html.twig', [
'controller_name' => 'HomeController',
'prods' => $productos,
'form' => $form->createView(),
'promo_code' => strtoupper($promo_code)
]);
}
/**
* @Route("/cart/checkout", name="app_checkout")
*/
public function checkout(Request $request)
{
$promo_code = $this->stack->get('promo_code');
if(!$this->stack->get('secret')) return $this->redirectToRoute('app_cart');
// if(!$this->stack->get('promo_code')) $promo_code = $this->stack->getSession()->get('promo_code');
$rs = []; $codigoAplicado = 0; $subtotal = 0;$tax = 0;
$stripe = new StripeClient(Constantes::API_KEY);
$form2 = $this->createFormBuilder()->setAction($this->generateUrl('app_checkout'))
->add('ids', HiddenType::class, [
])->add('promoCode', TextType::class, [
'data' => $promo_code,
'label' => false,
'attr' => ['class'=>'uk-input', 'placeholder' => 'Código de Promoción']
])->add('secret', HiddenType::class, [
])->add('intent', HiddenType::class, [
])
->getForm();
$form2->handleRequest($request);
if($form2->isSubmitted() && $form2->isValid()){
$data = $form2->getData();
if($data){
$subtotal = 0;
$ids = explode(',', $data['ids']);
$pcd = new PromoDiscounter($this->em);
$pcd->setCodeNombre($data['promoCode']);
foreach ($ids as $id){
$p = $this->em->getRepository(Product::class)->find($id);
$amt = $pcd->getDiscountedAmt($p->getRatePrecio());
$rs[] = ['id' => $id, 'content' => $p->getProductName(), 'precio' => $amt, 'idPromo' => $pcd->getCodeId()];
$subtotal += $amt;
}
$t = new Taxer();
$t->setAmt($subtotal)->setTaxRepository($this->em->getRepository(Tax::class))->build();
$tax = $t->getAddedTax();
$form = $this->createFormBuilder()
->add('ids', HiddenType::class, [
'data' => $data['ids']
])
->add('promoCode', TextType::class, [
'label' => false,
'attr' => ['class'=>'uk-input'],
'disabled' => false
])
->getForm();
$intent = $stripe->paymentIntents->update($data['intent'],[
'amount' => ($subtotal + $tax)*100,
'currency' => 'usd',
'metadata' => ['items' => $data['ids'], 'promoCode' => $pcd->getCodeNombre()]
]);
}
}
//dump($pcd);exit();
$payForm = $this->createFormBuilder()
->add('secret', HiddenType::class, [
'data' => $this->stack->get('secret')
])->add('intent', HiddenType::class, [
'data' => $this->stack->get('intent')
])
->getForm();
$payForm->handleRequest($request);
if($payForm->isSubmitted() && $payForm->isValid()){
$data = $payForm->getData();
$confirm = $stripe->paymentIntents->confirm($data['intent'],
['payment_method' => 'pm_card_visa']
);
}
return $this->render('home/checkout.html.twig', [
'controller_name' => 'HomeController',
'prods' => $rs,
'subtotal' => $subtotal,
'tax' => $tax,
'form' => $form2->createView(),
'listForm' => $form2->createView(),
'payForm' => $payForm->createView(),
'codigoStatus' => $pcd->getStatus(),
'codigoMessage' => $pcd->getMessage(),
'code' => strtoupper($pcd->getCodeNombre()),
'promo_code' => null,
'api' => Constantes::API_KEY_PK,
'client_secret' => $this->stack->get('secret')
]);
}
}