src/Bidcoz/Bundle/FrontendBundle/Controller/Auction/ItemController.php line 53

Open in your IDE?
  1. <?php
  2. namespace Bidcoz\Bundle\FrontendBundle\Controller\Auction;
  3. use Bidcoz\Bundle\CoreBundle\Controller\CoreController;
  4. use Bidcoz\Bundle\CoreBundle\Entity\Auction\Auction;
  5. use Bidcoz\Bundle\CoreBundle\Entity\Auction\FundANeed;
  6. use Bidcoz\Bundle\CoreBundle\Entity\Auction\Item;
  7. use Bidcoz\Bundle\CoreBundle\Entity\Auction\Shop;
  8. use Bidcoz\Bundle\CoreBundle\Entity\Campaign;
  9. use Bidcoz\Bundle\CoreBundle\Entity\Organization;
  10. use Bidcoz\Bundle\CoreBundle\Entity\Proxy\ItemPurchaseProxy;
  11. use Bidcoz\Bundle\FrontendBundle\Form\Type\ItemBidType;
  12. use Bidcoz\Bundle\FrontendBundle\Form\Type\ItemBuyType;
  13. use Bidcoz\Bundle\FrontendBundle\Form\Type\ItemDonationType;
  14. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity;
  16. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. /**
  20.  * @Route("/{orgSlug}/{campaignSlug}")
  21.  *
  22.  * @IsGranted("VIEW", subject="organization")
  23.  * @IsGranted("FRONT_END", subject="campaign")
  24.  */
  25. class ItemController extends CoreController
  26. {
  27.     /**
  28.      * @Route("/auction/item/{itemId}", name="auction_item", methods={"GET"})
  29.      *
  30.      * @Cache(maxage="0", smaxage="0", expires="now", public="false")
  31.      *
  32.      * @Entity("item", class="Bidcoz\Bundle\CoreBundle\Entity\Auction\Item", options={"id" = "itemId"}, expr="repository.findHydrated(itemId)")
  33.      *
  34.      * @IsGranted("VIEW", subject="item")
  35.      */
  36.     public function viewAuctionItemAction(Organization $organizationCampaign $campaignAuction $auctionItem $item)
  37.     {
  38.         return $this->viewItem($organization$campaign$auction$item);
  39.     }
  40.     /**
  41.      * @Route("/shop/item/{itemId}", name="shop_item", methods={"GET"})
  42.      *
  43.      * @Cache(maxage="0", smaxage="0", expires="now", public="false")
  44.      *
  45.      * @Entity("item", class="Bidcoz\Bundle\CoreBundle\Entity\Auction\Item", options={"id" = "itemId"}, expr="repository.findHydrated(itemId)")
  46.      *
  47.      * @IsGranted("VIEW", subject="item")
  48.      */
  49.     public function viewShopItemAction(Organization $organizationCampaign $campaignShop $shopItem $item)
  50.     {
  51.         return $this->viewItem($organization$campaign$shop$item);
  52.     }
  53.     /**
  54.      * @Route("/fund-a-need/item/{itemId}", name="fund_a_need_item", methods={"GET"})
  55.      *
  56.      * @Cache(maxage="0", smaxage="0", expires="now", public="false")
  57.      *
  58.      * @Entity("item", class="Bidcoz\Bundle\CoreBundle\Entity\Auction\Item", options={"id" = "itemId"}, expr="repository.findHydrated(itemId)")
  59.      *
  60.      * @IsGranted("VIEW", subject="item")
  61.      */
  62.     public function viewFundANeedItemAction(Organization $organizationCampaign $campaignFundANeed $fundANeedItem $item)
  63.     {
  64.         return $this->viewItem($organization$campaign$fundANeed$item);
  65.     }
  66.     private function viewItem(Organization $organizationCampaign $campaignAuction $auctionItem $item)
  67.     {
  68.         [$proxy$bidForm$buyForm$donationForm$showBidForm$showBuyForm$showDonationForm] = $this->getItemVars($item);
  69.         $internalUsers null;
  70.         if ($auction instanceof Shop) {
  71.             $type          'shop';
  72.             $internalUsers $this->getRepository('InternalUser')->findByOrganization($organization);
  73.         } elseif ($auction instanceof FundANeed) {
  74.             $type 'fund-a-need';
  75.         } else {
  76.             $type 'auction';
  77.         }
  78.         $auctionItems $this->getPagination($this->getRepository('Auction\Item')->getAuctionQueryBuilder($auctiontruefalse));
  79.         $params = [
  80.             'organization'      => $organization,
  81.             'campaign'          => $campaign,
  82.             'auction'           => $auction,
  83.             'item'              => $item,
  84.             'bidForm'           => $bidForm->createView(),
  85.             'buyForm'           => $buyForm->createView(),
  86.             'donationForm'      => $donationForm->createView(),
  87.             'showBidForm'       => $showBidForm,
  88.             'showBuyForm'       => $showBuyForm,
  89.             'showDonationForm'  => $showDonationForm,
  90.             'requireCC'         => !$this->isGranted('WITH_CC'$campaign),
  91.             'type'              => $type,
  92.             'auctionItems'      => $auctionItems,
  93.             'internalUsers'     => $internalUsers,
  94.         ];
  95.         return $this->render('@BidcozFrontend/Auction/item.html.twig'$params);
  96.     }
  97.     /**
  98.      * @Route("/auction/item/{itemId}/bid", name="item_bid")
  99.      *
  100.      * @Entity("item", class="Bidcoz\Bundle\CoreBundle\Entity\Auction\Item", options={"id" = "itemId"}, expr="repository.findHydrated(itemId)")
  101.      *
  102.      * @IsGranted("VIEW", subject="item")
  103.      */
  104.     public function bidItemAction(Request $requestOrganization $organizationCampaign $campaignAuction $auctionItem $item)
  105.     {
  106.         $user $this->getUser();
  107.         if (!$user) {
  108.             $this->messageAccessDeniedException('You must login or create an account to place a bid');
  109.         }
  110.         if ('POST' !== $request->getMethod() || !$this->isItemBiddable($item)) {
  111.             return $this->redirectToRoute('auction_item', [
  112.                 'orgSlug'      => $organization->getSlug(),
  113.                 'campaignSlug' => $campaign->getSlug(),
  114.                 'itemId'       => $item->getId(),
  115.             ]);
  116.         }
  117.         [$proxy$bidForm$buyForm$donationForm$showBidForm$showBuyForm$showDonationForm] = $this->getItemVars($item);
  118.         if (!$this->isGranted('WITH_CC'$campaign)) {
  119.             $params = [
  120.                 'organization'      => $organization,
  121.                 'campaign'          => $campaign,
  122.                 'auction'           => $auction,
  123.                 'item'              => $item,
  124.                 'bidForm'           => $bidForm->createView(),
  125.                 'buyForm'           => $buyForm->createView(),
  126.                 'donationForm'      => $donationForm->createView(),
  127.                 'showBidForm'       => $showBidForm,
  128.                 'showBuyForm'       => $showBuyForm,
  129.                 'showDonationForm'  => $showDonationForm,
  130.                 'ccRequiredWarning' => true,
  131.                 'requireCC'         => true,
  132.                 'type'              => 'auction',
  133.             ];
  134.             return $this->render('@BidcozFrontend/Auction/item.html.twig'$params);
  135.         }
  136.         $bidForm->handleRequest($request);
  137.         if ($bidForm->isValid()) {
  138.             try {
  139.                 $this->getBidManager()->createBid($user$proxy);
  140.                 $this->getEntityManager()->flush();
  141.             } catch (\Exception $e) {
  142.                 $this->addFlash('danger'$e->getMessage());
  143.             }
  144.             return $this->redirectToRoute('auction_item', [
  145.                 'orgSlug'      => $organization->getSlug(),
  146.                 'campaignSlug' => $campaign->getSlug(),
  147.                 'itemId'       => $item->getId(),
  148.             ]);
  149.         } else {
  150.             $this->addFlash('warning''There was an error placing your bid, please try again');
  151.         }
  152.         $params = [
  153.             'organization'     => $organization,
  154.             'campaign'         => $campaign,
  155.             'auction'          => $auction,
  156.             'item'             => $item,
  157.             'bidForm'          => $bidForm->createView(),
  158.             'buyForm'          => $buyForm->createView(),
  159.             'donationForm'     => $donationForm->createView(),
  160.             'showBidForm'      => $showBidForm,
  161.             'showBuyForm'      => $showBuyForm,
  162.             'showDonationForm' => $showDonationForm,
  163.             'requireCC'        => false,
  164.             'type'             => 'auction',
  165.         ];
  166.         return $this->render('@BidcozFrontend/Auction/item.html.twig'$params);
  167.     }
  168.     /**
  169.      * @Route("/auction/item/{itemId}/buy", name="auction_item_buy")
  170.      *
  171.      * @Entity("item", class="Bidcoz\Bundle\CoreBundle\Entity\Auction\Item", options={"id" = "itemId"}, expr="repository.findHydrated(itemId)")
  172.      *
  173.      * @IsGranted("VIEW", subject="item")
  174.      */
  175.     public function buyAuctionItemAction(Request $requestOrganization $organizationCampaign $campaignAuction $auctionItem $item)
  176.     {
  177.         return $this->buyItem($request$organization$campaign$auction$item);
  178.     }
  179.     /**
  180.      * @Route("/shop/item/{itemId}/buy", name="shop_item_buy")
  181.      * @Route("/shop/item/{itemId}/donation", name="shop_item_donation")
  182.      *
  183.      * @Entity("item", class="Bidcoz\Bundle\CoreBundle\Entity\Auction\Item", options={"id" = "itemId"}, expr="repository.findHydrated(itemId)")
  184.      *
  185.      * @IsGranted("VIEW", subject="item")
  186.      */
  187.     public function buyShopItemAction(Request $requestOrganization $organizationCampaign $campaignShop $shopItem $item)
  188.     {
  189.         return $this->buyItem($request$organization$campaign$shop$item);
  190.     }
  191.     /**
  192.      * @Route("/fund-a-need/item/{itemId}/buy", name="fund_a_need_item_buy")
  193.      * @Route("/fund-a-need/item/{itemId}/donation", name="fund_a_need_item_donation")
  194.      *
  195.      * @Entity("item", class="Bidcoz\Bundle\CoreBundle\Entity\Auction\Item", options={"id" = "itemId"}, expr="repository.findHydrated(itemId)")
  196.      *
  197.      * @IsGranted("VIEW", subject="item")
  198.      */
  199.     public function buyFundANeedItemAction(Request $requestOrganization $organizationCampaign $campaignFundANeed $fundANeedItem $item)
  200.     {
  201.         return $this->buyItem($request$organization$campaign$fundANeed$item);
  202.     }
  203.     private function buyItem(Request $requestOrganization $organizationCampaign $campaignAuction $auctionItem $item)
  204.     {
  205.         $user $this->getUser();
  206.         if (!$user) {
  207.             $this->messageAccessDeniedException('You must login or create an account to purchase an item');
  208.         }
  209.         if ('POST' !== $request->getMethod() || !($this->isItemBuyitNow($item) || $this->isItemDonation($item))) {
  210.             return $this->redirectToRoute('auction_item', [
  211.                 'orgSlug'      => $organization->getSlug(),
  212.                 'campaignSlug' => $campaign->getSlug(),
  213.                 'itemId'       => $item->getId(),
  214.             ]);
  215.         }
  216.         [$proxy$bidForm$buyForm$donationForm$showBidForm$showBuyForm$showDonationForm] = $this->getItemVars($item);
  217.         if ($auction instanceof Shop) {
  218.             $type 'shop';
  219.         } elseif ($auction instanceof FundANeed) {
  220.             $type 'fund-a-need';
  221.         } else {
  222.             $type 'auction';
  223.         }
  224.         if (!$this->isGranted('WITH_CC'$campaign)) {
  225.             $params = [
  226.                 'organization'      => $organization,
  227.                 'campaign'          => $campaign,
  228.                 'auction'           => $auction,
  229.                 'item'              => $item,
  230.                 'bidForm'           => $bidForm->createView(),
  231.                 'buyForm'           => $buyForm->createView(),
  232.                 'donationForm'      => $donationForm->createView(),
  233.                 'showBidForm'       => $showBidForm,
  234.                 'showBuyForm'       => $showBuyForm,
  235.                 'showDonationForm'  => $showDonationForm,
  236.                 'ccRequiredWarning' => true,
  237.                 'requireCC'         => true,
  238.                 'type'              => $type,
  239.             ];
  240.             return $this->render('@BidcozFrontend/Auction/item.html.twig'$params);
  241.         }
  242.         if ($showBuyForm) {
  243.             $buyForm->handleRequest($request);
  244.             if ($buyForm->isValid()) {
  245.                 try {
  246.                     $holdInCart $campaign->getHoldItemsInCart();
  247.                     $expirationDate $holdInCart
  248.                         null
  249.                         : new \DateTime('+15 minutes');
  250.                     $this->getPurchaseManager()->createBuyItNowItemPurchase($user$proxy$campaign->getHoldItemsInCart(), $expirationDate);
  251.                     if ('auction' == $type) {
  252.                         $this->getWatchListManager()->createWatchListItem($user$proxy->getItem());
  253.                     }
  254.                     $this->getEntityManager()->flush();
  255.                 } catch (\Exception $e) {
  256.                     $this->addFlash('warning'$e->getMessage());
  257.                 }
  258.                 return $this->redirectToRoute('account_campaign_purchases', [
  259.                     'orgSlug'      => $organization->getSlug(),
  260.                     'campaignSlug' => $campaign->getSlug(),
  261.                 ]);
  262.             } else {
  263.                 $this->addFlash('warning''There was an error purchasing this item, please try again');
  264.             }
  265.         } elseif ($showDonationForm) {
  266.             $donationForm->handleRequest($request);
  267.             if ($donationForm->isValid()) {
  268.                 try {
  269.                     $this->getPurchaseManager()->createDonationItemPurchase($user$proxy);
  270.                     $this->getEntityManager()->flush();
  271.                 } catch (\Exception $e) {
  272.                     $this->addFlash('warning'$e->getMessage());
  273.                 }
  274.                 return $this->redirectToRoute('account_campaign_purchases', [
  275.                     'orgSlug'      => $organization->getSlug(),
  276.                     'campaignSlug' => $campaign->getSlug(),
  277.                 ]);
  278.             } else {
  279.                 $this->addFlash('warning''There was an error making this purchase, please try again');
  280.             }
  281.         }
  282.         $params = [
  283.             'organization'     => $organization,
  284.             'campaign'         => $campaign,
  285.             'auction'          => $auction,
  286.             'item'             => $item,
  287.             'bidForm'          => $bidForm->createView(),
  288.             'buyForm'          => $buyForm->createView(),
  289.             'donationForm'     => $donationForm->createView(),
  290.             'showBidForm'      => $showBidForm,
  291.             'showBuyForm'      => $showBuyForm,
  292.             'showDonationForm' => $showDonationForm,
  293.             'requireCC'        => false,
  294.             'type'             => $auction instanceof Shop 'shop' 'auction',
  295.         ];
  296.         return $this->render('@BidcozFrontend/Auction/item.html.twig'$params);
  297.     }
  298.     /**
  299.      * @Route("/auction/item/{itemId}/max-bid", name="item_max_bid")
  300.      *
  301.      * @Entity("item", class="Bidcoz\Bundle\CoreBundle\Entity\Auction\Item", options={"id" = "itemId"}, expr="repository.findHydrated(itemId)")
  302.      *
  303.      * @IsGranted("VIEW", subject="item")
  304.      */
  305.     public function updateMaxBidAction(Request $requestOrganization $organizationCampaign $campaignAuction $auctionItem $item)
  306.     {
  307.         $user $this->getUser();
  308.         if (!$user) {
  309.             $this->messageAccessDeniedException('You must login or create an account to place a bid');
  310.         }
  311.         if ('POST' !== $request->getMethod() || !$this->isItemBiddable($item)) {
  312.             return $this->redirectToRoute('auction_item', [
  313.                 'orgSlug'      => $organization->getSlug(),
  314.                 'campaignSlug' => $campaign->getSlug(),
  315.                 'itemId'       => $item->getId(),
  316.             ]);
  317.         }
  318.         if (!$this->isGranted('WITH_CC'$campaign)) {
  319.             [$proxy$bidForm$buyForm$donationForm$showBidForm$showBuyForm$showDonationForm] = $this->getItemVars($item);
  320.             $params = [
  321.                 'organization'      => $organization,
  322.                 'campaign'          => $campaign,
  323.                 'auction'           => $auction,
  324.                 'item'              => $item,
  325.                 'bidForm'           => $bidForm->createView(),
  326.                 'buyForm'           => $buyForm->createView(),
  327.                 'donationForm'      => $donationForm->createView(),
  328.                 'showBidForm'       => $showBidForm,
  329.                 'showBuyForm'       => $showBuyForm,
  330.                 'showDonationForm'  => $showDonationForm,
  331.                 'ccRequiredWarning' => true,
  332.                 'requireCC'         => true,
  333.                 'type'              => 'auction',
  334.             ];
  335.             return $this->render('@BidcozFrontend/Auction/item.html.twig'$params);
  336.         }
  337.         try {
  338.             $amount    $request->request->get('amount'0);
  339.             $cancelBid = (bool) $request->request->get('_cancel'false);
  340.             $this->getBidManager()->setMaxBid($user$item$amount$cancelBid);
  341.             $this->getEntityManager()->flush();
  342.         } catch (\Exception $e) {
  343.             $this->addFlash('warning'$e->getMessage());
  344.         }
  345.         return $this->redirectToRoute('auction_item', [
  346.             'orgSlug'      => $organization->getSlug(),
  347.             'campaignSlug' => $campaign->getSlug(),
  348.             'itemId'       => $item->getId(),
  349.         ]);
  350.     }
  351.     protected function isItemBiddable(Item $item)
  352.     {
  353.         return $this->getItemManager()->isItemBiddable($item);
  354.     }
  355.     protected function isItemBuyitNow(Item $item)
  356.     {
  357.         return $this->getItemManager()->isItemBuyitNow($item);
  358.     }
  359.     protected function isItemDonation(Item $item)
  360.     {
  361.         return $this->getItemManager()->isItemDonation($item);
  362.     }
  363.     protected function createItemPurchaseProxy(Item $item)
  364.     {
  365.         return new ItemPurchaseProxy($item);
  366.     }
  367.     protected function getBidForm(ItemPurchaseProxy $proxy)
  368.     {
  369.         $item $proxy->getItem();
  370.         if ($item->isAuctionType()) {
  371.             $itemMinimumBid $this->getBidManager()->getItemMinimumBid($item);
  372.             $proxy->setAmount($itemMinimumBid);
  373.         }
  374.         $form $this->createForm(ItemBidType::class, $proxy);
  375.         return $form;
  376.     }
  377.     protected function getBuyForm(ItemPurchaseProxy $proxy)
  378.     {
  379.         $item $proxy->getItem();
  380.         $form $this->createForm(ItemBuyType::class, $proxy, [
  381.             'item' => $item,
  382.         ]);
  383.         if ($item->isFixedPrice()) {
  384.             $form->get('quantity')->setData(1);
  385.         }
  386.         return $form;
  387.     }
  388.     protected function getDonationForm(ItemPurchaseProxy $proxy)
  389.     {
  390.         $item $proxy->getItem();
  391.         return $this->createForm(ItemDonationType::class, $proxy, [
  392.             'item' => $item,
  393.         ]);
  394.     }
  395.     protected function getItemVars(Item $item)
  396.     {
  397.         $proxy            $this->createItemPurchaseProxy($item);
  398.         $bidForm          $this->getBidForm($proxy);
  399.         $buyForm          $this->getBuyForm($proxy);
  400.         $donationForm     $this->getDonationForm($proxy);
  401.         $showBidForm      $this->getItemManager()->isItemBiddable($item);
  402.         $showBuyForm      $this->getItemManager()->isItemBuyitNow($item);
  403.         $showDonationForm $this->getItemManager()->isItemDonation($item);
  404.         return [$proxy$bidForm$buyForm$donationForm$showBidForm$showBuyForm$showDonationForm];
  405.     }
  406. }