<?php
namespace App\Controller;
use App\Entity\Donation;
use App\Entity\Project;
use App\Entity\Member;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Stripe\Stripe;
use Stripe\Checkout\Session;
class DonationController extends AbstractController
{
private $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
/**
* @Route("/dons", name="app_dons")
*/
public function dons(): Response
{
$projects = $this->em->getRepository(Project::class)->findAll();
return $this->render('donation/dons.html.twig', [
'projects' => $projects
]);
}
/**
* @Route("/checkout/don", name="app_checkout", methods={"POST"})
*/
public function checkout(Request $request): Response
{
$amount = $request->request->get('amount');
$type = $request->request->get('donation_type');
$firstname = $request->request->get('firstname');
$lastname = $request->request->get('lastname');
$email = $request->request->get('email');
$isAnonymous = $request->request->get('anonymous') ? true : false;
$projectId = $request->request->get('project_id');
$donation = new Donation();
$donation->setName($firstname . ' ' . $lastname);
$donation->setEmail($email);
$donation->setAmount((float)$amount);
$donation->setIsAnonymous($isAnonymous);
$donation->setCreatedAt(new \DateTime());
if ($projectId) {
$project = $this->em->getRepository(Project::class)->find($projectId);
if ($project) {
$donation->setProject($project);
}
}
// Try to link to a member
$memberId = $request->getSession()->get('member_id');
if ($memberId) {
$member = $this->em->getRepository(Member::class)->find($memberId);
if ($member) {
$donation->setMember($member);
}
} else {
// Try by email
$member = $this->em->getRepository(Member::class)->findOneBy(['email' => $email]);
if ($member) {
$donation->setMember($member);
}
}
$this->em->persist($donation);
$this->em->flush();
Stripe::setApiKey($_ENV['STRIPE_SECRET_KEY']);
$mode = $type === 'mensuel' ? 'subscription' : 'payment';
$priceData = [
'currency' => 'eur',
'unit_amount' => $amount * 100,
'product_data' => [
'name' => 'Don WA BENIN' . ($projectId ? ' (Projet Spécifique)' : ''),
],
];
if ($type === 'mensuel') {
$priceData['recurring'] = ['interval' => 'month'];
}
$paymentMethodTypes = ['card', 'sepa_debit'];
$session = Session::create([
'payment_method_types' => $paymentMethodTypes,
'line_items' => [[
'price_data' => $priceData,
'quantity' => 1,
]],
'mode' => $mode,
'success_url' => $this->generateUrl('app_checkout_success', [], UrlGeneratorInterface::ABSOLUTE_URL),
'cancel_url' => $this->generateUrl('app_checkout_cancel', [], UrlGeneratorInterface::ABSOLUTE_URL),
'metadata' => [
'type' => 'donation',
'donation_id' => $donation->getId()
]
]);
return $this->redirect($session->url, 303);
}
/**
* @Route("/checkout/success", name="app_checkout_success")
*/
public function checkoutSuccess(): Response
{
return $this->render('donation/checkout_success.html.twig');
}
/**
* @Route("/checkout/cancel", name="app_checkout_cancel")
*/
public function checkoutCancel(): Response
{
return $this->render('donation/checkout_cancel.html.twig');
}
}