/**
  * @param array $productUnitQuantities
  * @param string $currency
  * @param PriceList|null $priceList
  * @return array|Price[]
  */
 public function getMatchedPrices(array $productUnitQuantities, $currency, PriceList $priceList = null)
 {
     if (!$priceList) {
         $priceList = $this->requestHandler->getPriceList();
     }
     $productIds = [];
     $productUnitCodes = [];
     /** @var ProductUnitQuantity[] $productUnitQuantities */
     foreach ($productUnitQuantities as $productUnitQuantity) {
         $productIds[] = $productUnitQuantity->getProduct()->getId();
         $productUnitCodes[] = $productUnitQuantity->getProductUnit()->getCode();
     }
     $prices = $this->getRepository()->getPricesBatch($priceList->getId(), $productIds, $productUnitCodes, []);
     $result = [];
     foreach ($productUnitQuantities as $productUnitQuantity) {
         $id = $productUnitQuantity->getProduct()->getId();
         $code = $productUnitQuantity->getProductUnit()->getCode();
         $quantity = $productUnitQuantity->getQuantity();
         $productPrices = array_filter($prices, function (array $price) use($id, $code, $currency) {
             return $price['id'] === $id && $price['code'] === $code && $price['currency'] === $currency;
         });
         $price = $this->matchPriceByQuantity($productPrices, $quantity);
         $result[$productUnitQuantity->getIdentifier()] = $price ? Price::create($price, $currency) : null;
     }
     return $result;
 }
 protected function setUp()
 {
     parent::setUp();
     $this->registry = $this->getMockBuilder('Doctrine\\Common\\Persistence\\ManagerRegistry')->disableOriginalConstructor()->getMock();
     $this->priceListRequestHandler = $this->getMockBuilder('OroB2B\\Bundle\\PricingBundle\\Model\\FrontendPriceListRequestHandler')->disableOriginalConstructor()->getMock();
     $this->formType = new FrontendOrderLineItemType($this->registry, $this->priceListRequestHandler, self::PRICE_CLASS);
     $priceList = new PriceList();
     $this->priceListRequestHandler->expects($this->any())->method('getPriceList')->willReturn($priceList);
     $this->formType->setDataClass('OroB2B\\Bundle\\OrderBundle\\Entity\\OrderLineItem');
 }
 public function testGetShowTierPricesWithRequestAndSaveState()
 {
     $this->handler->setRequest($this->request);
     $this->request->expects($this->exactly(3))->method('get')->willReturnMap([[FrontendPriceListRequestHandler::TIER_PRICES_KEY, null, false, '1'], [FrontendPriceListRequestHandler::SAVE_STATE_KEY, null, false, true]]);
     $this->session->expects($this->once())->method('set')->with(FrontendPriceListRequestHandler::TIER_PRICES_KEY, true);
     $this->assertEquals(true, $this->handler->getShowTierPrices());
 }
 /**
  * @param BeforeListRenderEvent $event
  */
 public function onFrontendProductView(BeforeListRenderEvent $event)
 {
     if (!$this->request) {
         return;
     }
     $productId = (int) $this->request->get('id');
     /** @var Product $product */
     $product = $this->doctrineHelper->getEntityReference('OroB2BProductBundle:Product', $productId);
     $priceList = $this->frontendPriceListRequestHandler->getPriceList();
     /** @var ProductPriceRepository $priceRepository */
     $priceRepository = $this->doctrineHelper->getEntityRepository('OroB2BPricingBundle:ProductPrice');
     $prices = $priceRepository->findByPriceListIdAndProductIds($priceList->getId(), [$product->getId()]);
     $template = $event->getEnvironment()->render('OroB2BPricingBundle:Frontend/Product:productPrice.html.twig', ['prices' => $prices]);
     $scrollData = $event->getScrollData();
     $subBlockId = $scrollData->addSubBlock(0);
     $scrollData->addSubBlockData(0, $subBlockId, $template);
 }
 /**
  * @dataProvider getMatchedPricesDataProvider
  *
  * @param array $productUnitQuantities
  * @param string $currency
  * @param bool $withPriceList
  * @param array $repositoryData
  * @param array $expectedData
  */
 public function testGetMatchedPrices(array $productUnitQuantities, $currency, $withPriceList, array $repositoryData, array $expectedData)
 {
     $priceList = $this->getEntity('OroB2B\\Bundle\\PricingBundle\\Entity\\PriceList', 12);
     if ($withPriceList) {
         $this->requestHandler->expects($this->never())->method('getPriceList');
     } else {
         $this->requestHandler->expects($this->once())->method('getPriceList')->willReturn($priceList);
     }
     $repository = $this->getMockBuilder('OroB2B\\Bundle\\PricingBundle\\Entity\\Repository\\ProductPriceRepository')->disableOriginalConstructor()->getMock();
     $repository->expects($this->once())->method('getPricesBatch')->willReturn($repositoryData);
     $em = $this->getMockBuilder('Doctrine\\ORM\\EntityManager')->disableOriginalConstructor()->getMock();
     $em->expects($this->once())->method('getRepository')->with(self::CLASS_NAME)->willReturn($repository);
     $this->registry->expects($this->once())->method('getManagerForClass')->with(self::CLASS_NAME)->willReturn($em);
     $prices = $this->provider->getMatchedPrices($productUnitQuantities, $currency, $withPriceList ? $priceList : null);
     $this->assertInternalType('array', $prices);
     $this->assertEquals(count($productUnitQuantities), count($prices));
     $this->assertEquals($expectedData, $prices);
 }
 /**
  * @param OrderLineItem $item
  * @return array|ProductUnit[]
  */
 protected function getProductAvailableChoices(OrderLineItem $item)
 {
     /** @var ProductPriceRepository $repository */
     $repository = $this->registry->getManagerForClass($this->priceClass)->getRepository($this->priceClass);
     $priceList = $this->priceListRequestHandler->getPriceList();
     $choices = $repository->getProductUnitsByPriceList($priceList, $item->getProduct(), $item->getOrder()->getCurrency());
     $hasChoice = false;
     foreach ($choices as $unit) {
         if ($unit->getCode() === $item->getProductUnit()->getCode()) {
             $hasChoice = true;
             break;
         }
     }
     if (!$hasChoice) {
         $choices[] = $item->getProductUnit();
     }
     return $choices;
 }
 public function testOnFrontendProductView()
 {
     $templateHtml = 'template_html';
     $prices = [];
     /** @var Product $product */
     $product = $this->getEntity('OroB2B\\Bundle\\ProductBundle\\Entity\\Product', 11);
     /** @var PriceList $priceList */
     $priceList = $this->getEntity('OroB2B\\Bundle\\PricingBundle\\Entity\\PriceList', 42);
     $this->listener->setRequest(new Request(['id' => $product->getId()]));
     $productPriceRepository = $this->getMockBuilder('OroB2B\\Bundle\\PricingBundle\\Entity\\Repository\\ProductPriceRepository')->disableOriginalConstructor()->getMock();
     $productPriceRepository->expects($this->once())->method('findByPriceListIdAndProductIds')->with($priceList->getId(), [$product->getId()])->willReturn($prices);
     $this->doctrineHelper->expects($this->once())->method('getEntityRepository')->with('OroB2BPricingBundle:ProductPrice')->willReturn($productPriceRepository);
     $this->doctrineHelper->expects($this->once())->method('getEntityReference')->with('OroB2BProductBundle:Product', $product->getId())->willReturn($product);
     $this->frontendPriceListRequestHandler->expects($this->once())->method('getPriceList')->willReturn($priceList);
     /** @var \PHPUnit_Framework_MockObject_MockObject|\Twig_Environment $environment */
     $environment = $this->getMock('\\Twig_Environment');
     $environment->expects($this->once())->method('render')->with('OroB2BPricingBundle:Frontend/Product:productPrice.html.twig', ['prices' => $prices])->willReturn($templateHtml);
     $event = $this->createEvent($environment);
     $this->listener->onFrontendProductView($event);
     $scrollData = $event->getScrollData()->getData();
     $this->assertEquals([$templateHtml], $scrollData[ScrollData::DATA_BLOCKS][0][ScrollData::SUB_BLOCKS][1][ScrollData::DATA]);
 }