/** * @param string $currency * @param ProductUnitQuantity[] $productUnitQuantities * @param OrderLineItem[] $lineItemsWithIdentifier */ protected function fillLineItemsPrice($currency, array $productUnitQuantities, array $lineItemsWithIdentifier) { $prices = $this->productPriceProvider->getMatchedPrices($productUnitQuantities, $currency); foreach ($lineItemsWithIdentifier as $identifier => $lineItem) { if (array_key_exists($identifier, $prices) && $prices[$identifier] instanceof Price) { $lineItem->setPrice($prices[$identifier]); } } }
/** * @param Product $product * @param ProductUnit $productUnit * @param float $quantity * @param string $currency * @param PriceList $priceList * @return Price */ protected function getPrice(Product $product, ProductUnit $productUnit, $quantity, $currency, PriceList $priceList) { $productUnitQuantity = new ProductUnitQuantity($product, $productUnit, $quantity); $identifier = $productUnitQuantity->getIdentifier(); if (!isset($this->prices[$priceList->getId()][$currency][$identifier])) { $prices = $this->productPriceProvider->getMatchedPrices([$productUnitQuantity], $currency, $priceList); $this->prices[$priceList->getId()][$currency][$identifier] = $prices[$identifier]; } $price = $this->prices[$priceList->getId()][$currency][$identifier]; return $price ?: Price::create(mt_rand(10, 1000), $currency); }
/** * @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); }