<?php
namespace App\Controller;
use App\Entity\Code;
use App\Entity\Contact;
use App\Entity\Notification;
use App\Entity\Payment\Payplug;
use App\Entity\Token;
use App\Entity\Service;
use App\Form\ContactPaymentType;
use App\Form\ContactTunnelType;
use App\Repository\LogRepository;
use App\Service\Formater;
use App\Entity\Reservation;
use App\Form\CarteCadeauType;
use App\Service\CodeService;
use App\Service\MetaConversionsApiService;
use App\Service\PaymentService;
use App\Service\TokenService;
use App\Service\PayplugService;
use App\Service\CarteCadeauService;
use App\Repository\ServiceRepository;
use Doctrine\ORM\EntityManagerInterface;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use App\Service\ExtraReservationService;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class CarteCadeauController extends AbstractController
{
public function __construct(
private ServiceRepository $serviceRepository,
private CarteCadeauService $carteCadeauService,
private string $payplugSecretKey,
private TokenService $tokenService,
private PayplugService $payplugService,
private PaymentService $paymentService,
private EntityManagerInterface $entityManager,
private ExtraReservationService $extraReservationService,
)
{}
/**
* @deprecated message="Gardé pour les utilisateurs ayant des anciens liens, et est remplacé par la route create_card"
*/
#[Route(path: '/offrir/carte', name: 'create-card')]
public function oldDisplayCard(Request $request, TokenService $tokenService)
{
$token = $tokenService->findOneByValue(['value' => $request->query->get('token')]);
if (!$token) {
return new JsonResponse("Carte non disponible", 404);
} else {
return $this->redirectToRoute('carte_cadeau_pdf', ['value' => $token->getValue()]);
}
}
#[Route(path: '/offrir', name: 'carte_cadeau_tunnel')]
public function tunnel(ExtraReservationService $extraReservationService)
{
$token = new Token();
$extraReservationService->generateExtraReservations($token, true);
$form = $this->createForm(CarteCadeauType::class, $token);
return $this->renderForm('carteCadeau/tunnel.html.twig', [
'templates' => $this->carteCadeauService->getAllTemplate(),
'form' => $form,
]);
}
#[Route(path: '/carte-cadeau/paiement', name: 'carte_cadeau_paiement')]
public function createPayment(
Request $request,
TokenService $tokenService,
PayplugService $payplugService,
MetaConversionsApiService $metaConversionsApi
) {
$token = new Token;
$this->extraReservationService->generateExtraReservations($token, true);
$form = $this->createForm(CarteCadeauType::class, $token);
$form->handleRequest($request);
$deliveryAddress = $token->getDeliveryAddress();
if ($deliveryAddress && $deliveryAddress->getUseAdresseFacturation()) {
$contact = $token->getContact();
$deliveryAddress->setPrenom($contact->getPrenom());
$deliveryAddress->setNom($contact->getNom());
$deliveryAddress->setAdresse($contact->getAdresse());
$deliveryAddress->setVille($contact->getVille());
$deliveryAddress->setCodePostal($contact->getCodePostal());
$deliveryAddress->setPays('FRANCE');
}
$tokenService->save($token);
// Send InitiateCheckout event to Meta Conversions API (server-side)
if ($metaConversionsApi->isConfigured()) {
$contact = $token->getContact();
$totalPrice = $tokenService->computePrice($token);
$externalId = 'contact_' . $contact->getId();
$contentId = 'gift_card_' . $token->getId();
$eventId = $metaConversionsApi->generateEventId();
$metaConversionsApi->sendInitiateCheckoutEvent(
eventId: $eventId,
value: $totalPrice,
email: $contact->getEmail(),
phone: $contact->getTelephone(),
firstName: $contact->getPrenom(),
lastName: $contact->getNom(),
clientIpAddress: $request->getClientIp(),
clientUserAgent: $request->headers->get('User-Agent'),
fbc: $request->cookies->get('_fbc'),
fbp: $request->cookies->get('_fbp'),
eventSourceUrl: $request->headers->get('referer'),
externalId: $externalId,
contentId: $contentId,
city: $contact->getVille(),
zipCode: $contact->getCodePostal()
);
}
$payment = $payplugService->generatePayment($token, 'carteCadeau');
return new JsonResponse($payment->hosted_payment->payment_url);
}
#[Route(path: ['/carte-cadeau/{value}', '/offrir/carte/{value}'], name: 'carte_cadeau_pdf')]
public function createCard(Token $token, CarteCadeauService $carteCadeauService, CodeService $codeService, TokenService $tokenService)
{
$code = $codeService->findOneByValue($token->getCodePromo()->getValue());
if (!$code) {
return new JsonResponse("Carte non disponible", 404);
}
if( $tokenService->isAlreadyPaid($token) || $token->getContact()->getAdresse() == "admin" ) {
$pdf = $carteCadeauService->generatePdfCarteCadeau($code, $token);
$pdfContent = $pdf->Output('S', 'generated.pdf'); // 'S' returns the PDF as a string
return new Response($pdfContent, 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="generated.pdf"',
]);
} else {
return new JsonResponse("Cette carte cadeau n a pas ete completement regle, veuillez contacter notre equipe en indiquant le code suivant : TID". $token->getId() , 403);
}
}
#[Route(path: '/carte-cadeau/extend-validity/{id}', name: 'carte_cadeau_extend_validity')]
public function askCode($id, Request $request): Response
{
$token = $this->carteCadeauService->findById($id);
$code = $token->getCodePromo();
$error = "";
if (!$token || !$code) {
return $this->render('reservation/tunnel/ask-code.html.twig', [
"error" => "Erreur lors de la récupération de votre code"
]);
}
if (!$code->isExpired()) {
return $this->redirect($this->generateUrl('reservation_carte_cadeau_tunnel', [], UrlGeneratorInterface::ABSOLUTE_URL). "?code=".$code->getValue());
}
$payment = $this->paymentService->find($request->query->get('payment'));
$months = $request->query->get('months');
$notification = $request->query->get('notification');
if ($payment && $months && !$payment->getDatePayment()) {
if (!$this->payplugService->isPaid($payment)) {
$error = "Le paiement n'a pas été validé, veuillez réessayer";
} else {
$payment->setDatePayment(new \DateTime());
$newValidity = clone $code->getValidity();
$code->setValidity($newValidity->modify('+'.$months.' months'));
if ($notification == "true") {
$payplugNotification = new Notification();
$payplugNotification->setToken($token->getId());
$payplugNotification->setType('Prolongation carte cadeau');
$payplugNotification->setIsPaid(true);
$payplugNotification->setInfo('Carte cadeau prolongé via notification');
$payplugNotification->setError(false);
$this->entityManager->persist($payplugNotification);
}
$this->entityManager->persist($payment);
$this->entityManager->persist($code);
$this->entityManager->flush();
$this->addFlash('success', "Carte cadeau prolongée jusqu'au ". $code->getValidityFormated());
return $this->redirect($this->generateUrl('reservation_carte_cadeau_tunnel', [], UrlGeneratorInterface::ABSOLUTE_URL). "?code=".$code->getValue());
}
}
$form = $this->createFormBuilder()
->add('months', ChoiceType::class, [
'block_prefix' => 'custom_choice',
'label' => 'Mois',
'expanded' => true,
'multiple' => false,
'required' => true,
'attr' => [
'render_mode' => 'widget-only'
],
'choices' => [
'3 mois' => 3,
'6 mois' => 6,
],
'choice_attr' => [
'3 mois' => [
'label' => "3 mois",
'description' => "Expire le ". $code->getValidityFormated("+3 month"),
'price' => $this->carteCadeauService->computeExtendValidityPrice(
$this->tokenService->computePrice($token),
3
). "€"
],
'6 mois' => [
'label' => "6 mois",
'description' => "Expire le ". $code->getValidityFormated("+6 month"),
'price' => $this->carteCadeauService->computeExtendValidityPrice(
$this->tokenService->computePrice($token),
6
). "€"
]
],
])
->add('contact', ContactPaymentType::class, [
'block_prefix' => 'contact',
'block_name' => 'contact',
'label' => false,
])
->setAction($this->generateUrl('carte_cadeau_extend_validity', ['id' => $token->getId()]))
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$months = $form->get('months')->getData();
$contact = $form->get('contact')->getData();
$price = $this->carteCadeauService->computeExtendValidityPrice($this->tokenService->computePrice($token), $months);
$payplugPayment = new Payplug();
$payplugPayment->setToken($token);
$payplugPayment->setcontact($contact);
$payplugPayment->setAmount($price);
$this->paymentService->save($payplugPayment);
$returnUrl = $this->generateUrl('carte_cadeau_extend_validity', ['id' => $token->getId()], UrlGeneratorInterface::ABSOLUTE_URL).
"?payment=". $payplugPayment->getId().
"&months=". $months;
$notificationUrl = $returnUrl . "¬ification=true";
$payment = $this->payplugService->generateCustomPayment($payplugPayment, $contact, $returnUrl, $notificationUrl, $price);
return $this->render('reservation/tunnel/extend-code.html.twig', [
'paymentUrl' => $payment->hosted_payment->payment_url,
'description' => 'Celle-ci est expiré depuis le '. $code->getValidityFormated(),
'form' => $form->createView(),
]);
}
return $this->render('reservation/tunnel/extend-code.html.twig', [
'error' => $error,
'description' => 'Celle-ci est expiré depuis le '. $code->getValidityFormated(),
'form' => $form->createView(),
]);
}
}