<?php
namespace Bidcoz\Bundle\FrontendBundle\Controller\Account;
use Bidcoz\Bundle\CoreBundle\Controller\CoreController;
use Bidcoz\Bundle\CoreBundle\Entity\Campaign;
use Bidcoz\Bundle\CoreBundle\Entity\Organization;
use Bidcoz\Bundle\CoreBundle\Entity\PaymentGateway\Account\Account;
use Bidcoz\Bundle\CoreBundle\Entity\Proxy\StripeCreditCardProxy;
use Bidcoz\Bundle\CoreBundle\Entity\Purchase\Purchase;
use Bidcoz\Bundle\CoreBundle\Entity\User;
use Bidcoz\Bundle\CoreBundle\Exception\InvalidPurchaseException;
use Bidcoz\Bundle\CoreBundle\Exception\ItemUnavailableException;
use Bidcoz\Bundle\CoreBundle\Form\Type\PurchaseQuestionType;
use Bidcoz\Bundle\CoreBundle\Form\Type\StripeCreditCardType;
use Bidcoz\Bundle\FrontendBundle\Form\Type\Donation\CashType;
use Bidcoz\Bundle\FrontendBundle\Form\Type\UserFeeType;
use Bidcoz\Bundle\FrontendBundle\Form\Type\UserPreferredPaymentGatewayType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/account/purchases/{orgSlug}/{campaignSlug}")
* @IsGranted("VIEW", subject="organization")
* @IsGranted("FRONT_END", subject="campaign")
*/
class CampaignPurchaseController extends CoreController
{
/**
* @Route("", name="account_campaign_purchases")
*/
public function campaignPurchasesAction(Organization $organization, Campaign $campaign)
{
$user = $this->getUser();
$purchases = $this->getPurchaseManager()->getUserPendingPurchasesForCampaign($user, $campaign);
$proxy = $this->getTransactionManager()->createTransactionProxy($campaign, $user, $purchases);
try {
$this->getPurchaseManager()->ensurePurchasesValid($proxy);
} catch (InvalidPurchaseException $e) {
if ($e instanceof ItemUnavailableException) {
$item = $e->getItem();
$message = sprintf(
'Item %s removed: %s',
$item->getName(),
$e->getMessage()
);
} else {
$purchase = $e->getPurchase();
$message = sprintf(
'%s is being removed from your purchases: %s',
$purchase->getDescription(),
$e->getMessage()
);
}
$this->addFlash('danger', $message);
$this->getEntityManager()->flush();
return $this->redirectToRoute('account_campaign_purchases', [
'orgSlug' => $organization->getSlug(),
'campaignSlug' => $campaign->getSlug(),
]);
}
$result = $this->getTransactionManager()->createTransactionResult($proxy);
$feeForm = $this->getFeeForm($user);
$cashDonationForm = $this->getCashDonationForm();
$showPayPal = !$organization->isStripeAllowed() && $organization->hasPaymentGatewayAccountType(Account::PAYPAL);
$showStripe = $organization->isStripeAllowed() && $organization->hasPaymentGatewayAccountType(Account::STRIPE);
$payByCheck = $campaign->isPayByCheck();
$showExternal = $campaign->isExternalPaymentAllowed();
$customPayment = $campaign->showCustomPaymentInstructions();
$flightSimulatorPayment = $this->getFlightSimulatorManager()->isHiddenOrGlobal($campaign);
$cc = $showStripe ? $this->getCcManager()->getCC($campaign, $user) : null;
if ($showStripe && !$cc && $campaign->hasAuction() && $campaign->hasTickets() && $campaign->getCollectCcInfo()) {
$ccProxy = new StripeCreditCardProxy();
$ccForm = $this->getCCForm($ccProxy)->createView();
} else {
$ccForm = null;
}
if ($payByCheck) {
$payByCheckPurchases = array_filter($purchases, function (Purchase $purchase) {
return $purchase->isPurchasePayableOffline();
});
if (0 === count($payByCheckPurchases)) {
$payByCheck = false;
}
}
$purchaseForms = [];
foreach ($purchases as $purchase) {
if ($purchase->hasQuestion()) {
$purchaseForms[$purchase->getId()] = $this->getPurchaseQuestionForm($purchase)->createView();
}
}
$session = $this->getSession();
$session->set('stripe:charge:org', $organization->getSlug());
$session->set('stripe:charge:campaign', $campaign->getSlug());
$proxy = $this->getTransactionManager()->createTransactionProxy($campaign, $user);
$result = $this->getTransactionManager()->createTransactionResult($proxy);
$this->getTransactionManager()->logTransactionResult($result);
$params = [
'organization' => $organization,
'campaign' => $campaign,
'result' => $result,
'feeForm' => $feeForm->createView(),
'cashDonationForm' => $cashDonationForm->createView(),
'showPayPal' => $showPayPal,
'showStripe' => $showStripe,
'showExternal' => $showExternal,
'payByCheck' => $payByCheck,
'tomorrow' => new \DateTime('tomorrow'),
'customPayment' => $customPayment,
'flightSimulatorPayment' => $flightSimulatorPayment,
'cc' => $cc,
'ccForm' => $ccForm,
'purchaseForms' => $purchaseForms,
];
return $this->render('@BidcozFrontend/Account/Purchases/campaign.html.twig', $params);
}
/**
* @Route("/zero-dollar", name="account_zero_dollar_purchase", methods={"POST"})
*/
public function zeroDollarPurchaseAction(Request $request, Organization $organization, Campaign $campaign)
{
$user = $this->getUser();
$purchases = $this->getPurchaseManager()->getUserPendingPurchasesForCampaign($user, $campaign);
$proxy = $this->getTransactionManager()->createTransactionProxy($campaign, $user, $purchases);
$result = $this->getTransactionManager()->createTransactionResult($proxy);
if ($result->getTotal() > 0) {
$this->addFlash('danger', 'Only zero dollar purchases can be completed by this method');
return $this->redirectToRoute('account_campaign_purchases', [
'orgSlug' => $organization->getSlug(),
'campaignSlug' => $campaign->getSlug(),
]);
}
$proxy->setType('cash');
$this->getTransactionManager()->createTransaction($proxy);
$this->getEntityManager()->flush();
return $this->redirectToRoute('account_campaign_purchase_zero_dollar_success', [
'orgSlug' => $organization->getSlug(),
'campaignSlug' => $campaign->getSlug(),
]);
}
/**
* @Route("/flight-simulator", name="account_flight_simulator_purchase", methods={"POST"})
*/
public function flightSimulatorPurchaseAction(Request $request, Organization $organization, Campaign $campaign)
{
$user = $this->getUser();
$purchases = $this->getPurchaseManager()->getUserPendingPurchasesForCampaign($user, $campaign);
$proxy = $this->getTransactionManager()->createTransactionProxy($campaign, $user, $purchases);
$result = $this->getTransactionManager()->createTransactionResult($proxy);
if (!$this->getFlightSimulatorManager()->isHiddenOrGlobal($campaign)) {
$this->addFlash('danger', 'Only [Flight Simulator] purchases can be completed by this method');
return $this->redirectToRoute('account_campaign_purchases', [
'orgSlug' => $organization->getSlug(),
'campaignSlug' => $campaign->getSlug(),
]);
}
$proxy->setType('flight_simulator');
$this->getTransactionManager()->createTransaction($proxy, [], true, true);
$this->getEntityManager()->flush();
return $this->redirectToRoute('account_campaign_purchase_flight_simulator_success', [
'orgSlug' => $organization->getSlug(),
'campaignSlug' => $campaign->getSlug(),
]);
}
protected function getCCForm(StripeCreditCardProxy $proxy)
{
return $this->createForm(StripeCreditCardType::class, $proxy);
}
protected function getPurchaseQuestionForm(Purchase $purchase)
{
return $this->createForm(PurchaseQuestionType::class, $purchase);
}
/**
* @Route("/update-user-fee-type", name="account_fee_type", methods={"POST"})
*/
public function userFeeAction(Request $request, Organization $organization, Campaign $campaign)
{
$feeForm = $this->getFeeForm($this->getUser());
$feeForm->handleRequest($request);
if ($feeForm->isValid()) {
$this->getEntityManager()->flush();
}
return $this->redirectToRoute('account_campaign_purchases', [
'orgSlug' => $organization->getSlug(),
'campaignSlug' => $campaign->getSlug(),
]);
}
/**
* @Route("/update-preferred-payment-gateway", name="account_preferred_payment_gateway", methods={"POST"})
*/
public function preferredPaymentGatewayAction(Request $request, Organization $organization, Campaign $campaign)
{
$preferredPaymentGatewayForm = $this->getPreferredPaymentGatewayForm($this->getUser(), $organization);
$preferredPaymentGatewayForm->handleRequest($request);
if ($preferredPaymentGatewayForm->isValid()) {
$this->getEntityManager()->flush();
}
return $this->redirectToRoute('account_campaign_purchases', [
'orgSlug' => $organization->getSlug(),
'campaignSlug' => $campaign->getSlug(),
]);
}
/**
* @Route("/paypal/success", name="account_campaign_purchase_paypal_success")
*/
public function paypalSuccessAction(Organization $organization, Campaign $campaign)
{
return $this->render('@BidcozFrontend/Account/Purchases/PayPal/success.html.twig', [
'organization' => $organization,
'campaign' => $campaign,
]);
}
/**
* @Route("/stripe/success", name="account_campaign_purchase_stripe_success")
*/
public function stripeSuccessAction(Organization $organization, Campaign $campaign)
{
return $this->render('@BidcozFrontend/Account/Purchases/Stripe/success.html.twig', [
'organization' => $organization,
'campaign' => $campaign,
]);
}
/**
* @Route("/check/success", name="account_campaign_purchase_check_success")
*/
public function checkSuccessAction(Organization $organization, Campaign $campaign)
{
return $this->render('@BidcozFrontend/Account/Purchases/Check/success.html.twig', [
'organization' => $organization,
'campaign' => $campaign,
]);
}
/**
* @Route("/external/success", name="account_campaign_purchase_external_success")
*/
public function externalSuccessAction(Organization $organization, Campaign $campaign)
{
return $this->render('@BidcozFrontend/Account/Purchases/External/success.html.twig', [
'organization' => $organization,
'campaign' => $campaign,
]);
}
/**
* @Route("/zero-dollar/success", name="account_campaign_purchase_zero_dollar_success")
*/
public function zeroDollarSuccessAction(Organization $organization, Campaign $campaign)
{
return $this->render('@BidcozFrontend/Account/Purchases/ZeroDollar/success.html.twig', [
'organization' => $organization,
'campaign' => $campaign,
]);
}
/**
* @Route("/flight-simulator/success", name="account_campaign_purchase_flight_simulator_success")
*/
public function flightSimulatorSuccessAction(Organization $organization, Campaign $campaign)
{
return $this->render('@BidcozFrontend/Account/Purchases/FlightSimulator/success.html.twig', [
'organization' => $organization,
'campaign' => $campaign,
]);
}
protected function getPreferredPaymentGatewayForm(User $user, Organization $organization)
{
return $this->createForm(UserPreferredPaymentGatewayType::class, $user, [
'organization' => $organization,
]);
}
protected function getFeeForm(User $user)
{
return $this->createForm(UserFeeType::class, $user);
}
protected function getCashDonationForm()
{
return $this->createForm(CashType::class);
}
}