/** * @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]); }