/** * {@inheritdoc} */ public function load(ObjectManager $manager) { $locator = $this->container->get('file_locator'); $filePath = $locator->locate('@OroB2BPricingBundle/Migrations/Data/Demo/ORM/data/product_prices.csv'); if (is_array($filePath)) { $filePath = current($filePath); } $handler = fopen($filePath, 'r'); $headers = fgetcsv($handler, 1000, ','); while (($data = fgetcsv($handler, 1000, ',')) !== false) { $row = array_combine($headers, array_values($data)); $product = $this->getProductBySku($manager, $row['sku']); $productUnit = $this->getProductUnit($manager, $row['unitCode']); $priceList = $this->getPriceList($manager, $row['priceListName']); $price = Price::create($row['price'], $row['currency']); $productPrice = new ProductPrice(); $productPrice->setProduct($product)->setUnit($productUnit)->setPriceList($priceList)->setQuantity($row['quantity'])->setPrice($price); $manager->persist($productPrice); $productPrice10 = clone $productPrice; $productPrice10->setQuantity($row['quantity'] * 10)->setPrice($price->setValue($price->getValue() * 0.95)); $manager->persist($productPrice10); $productPrice20 = clone $productPrice; $productPrice20->setQuantity($row['quantity'] * 20)->setPrice($price->setValue($price->getValue() * 0.9)); $manager->persist($productPrice20); $productPrice50 = clone $productPrice; $productPrice50->setQuantity($row['quantity'] * 50)->setPrice($price->setValue($price->getValue() * 0.85)); $manager->persist($productPrice50); $productPrice100 = clone $productPrice; $productPrice100->setQuantity($row['quantity'] * 100)->setPrice($price->setValue($price->getValue() * 0.8)); $manager->persist($productPrice100); } fclose($handler); $manager->flush(); }
/** * {@inheritdoc} */ public function load(ObjectManager $manager) { foreach ($this->data as $data) { /** @var Product $product */ $product = $this->getReference($data['product']); /** @var PriceList $priceList */ $priceList = $this->getReference($data['priceList']); /** @var ProductUnit $unit */ $unit = $this->getReference($data['unit']); $price = Price::create($data['price'], $data['currency']); $productPrice = new ProductPrice(); $productPrice->setPriceList($priceList)->setUnit($unit)->setQuantity($data['qty'])->setPrice($price)->setProduct($product); $manager->persist($productPrice); $this->setReference($data['reference'], $productPrice); } $manager->flush(); }
public function testSetGetPrice() { $productPrice = new ProductPrice(); $this->assertNull($productPrice->getPrice()); $value = 11; $currency = 'EUR'; $this->setProperty($productPrice, 'value', $value); $this->setProperty($productPrice, 'currency', $currency); $productPrice->loadPrice(); $price = $productPrice->getPrice(); $this->assertInstanceOf('Oro\\Bundle\\CurrencyBundle\\Model\\Price', $price); $this->assertEquals($value, $price->getValue()); $this->assertEquals($currency, $price->getCurrency()); $price = Price::create(12, 'USD'); $productPrice->setPrice($price); $this->assertEquals($price, $productPrice->getPrice()); $productPrice->updatePrice(); $this->assertAttributeEquals($price->getValue(), 'value', $productPrice); $this->assertAttributeEquals($price->getCurrency(), 'currency', $productPrice); }
/** * @param ProductPrice|object $value * @param ProductPriceAllowedUnits $constraint * * {@inheritdoc} */ public function validate($value, Constraint $constraint) { $priceProduct = $value->getProduct(); $priceUnit = $value->getUnit(); if (!$priceProduct) { $this->context->addViolationAt('product', $constraint->notExistingProductMessage); return; } $unitPrecisions = $priceProduct->getUnitPrecisions(); $availableUnits = []; foreach ($unitPrecisions as $unitPrecision) { $availableUnits[] = $unitPrecision->getUnit(); } if (!in_array($priceUnit, $availableUnits)) { if ($priceUnit instanceof ProductUnit && $priceUnit->getCode()) { $this->context->addViolationAt('unit', $constraint->notAllowedUnitMessage, ['%product%' => $priceProduct->getSku(), '%unit%' => $priceUnit->getCode()]); } else { $this->context->addViolationAt('unit', $constraint->notExistingUnitMessage); } } }
public function testProcessLoadPriceAndProduct() { $productPrice = new ProductPrice(); $productPrice->setQuantity(555); $this->setValue($productPrice, 'value', 1.2); $this->setValue($productPrice, 'currency', 'USD'); /** @var ProductUnit $unit */ $unit = $this->getReference('product_unit.liter'); /** @var Product $product */ $product = $this->getReference('product.1'); /** @var PriceList $priceList */ $priceList = $this->getReference('price_list_1'); $productObject = new Product(); $productObject->setSku($product->getSku()); $productPrice->setProduct($product); $productPrice->setUnit($unit); $productPrice->setPriceList($priceList); $this->strategy->process($productPrice); $this->assertNotEmpty($productPrice->getPrice()); $this->assertEquals('USD', $productPrice->getPrice()->getCurrency()); $this->assertEquals(1.2, $productPrice->getPrice()->getValue()); $this->assertNotEmpty($productPrice->getProduct()); $this->assertEquals($product->getSku(), $productPrice->getProduct()->getSku()); }
/** * @param int $productId * @param string $unitCode * @param int $quantity * @param float $value * @param string $currency * @return ProductPrice */ protected function createPrice($productId, $unitCode, $quantity, $value, $currency) { $productPrice = new ProductPrice(); $price = new Price(); $price->setCurrency($currency); $price->setValue($value); $product = new Product(); $idReflection = new \ReflectionProperty(get_class($product), 'id'); $idReflection->setAccessible(true); $idReflection->setValue($product, $productId); $unit = new ProductUnit(); $unit->setCode($unitCode); $productPrice->setProduct($product); $productPrice->setUnit($unit); $productPrice->setQuantity($quantity); $productPrice->setPrice($price); return $productPrice; }
public function testGetAvailableCurrencies() { $this->assertEquals(['EUR' => 'EUR', 'USD' => 'USD'], $this->repository->getAvailableCurrencies()); $em = $this->getContainer()->get('doctrine')->getManager(); $price = new Price(); $price->setValue(1); $price->setCurrency('UAH'); /** @var Product $product */ $product = $this->getReference('product.1'); /** @var ProductUnit $unit */ $unit = $this->getReference('product_unit.liter'); /** @var PriceList $priceList */ $priceList = $this->getReference('price_list_1'); $productPrice = new ProductPrice(); $productPrice->setPrice($price)->setProduct($product)->setQuantity(1)->setUnit($unit)->setPriceList($priceList); $em->persist($productPrice); $em->flush(); $this->assertEquals(['EUR' => 'EUR', 'UAH' => 'UAH', 'USD' => 'USD'], $this->repository->getAvailableCurrencies()); }
/** * @param ProductPrice $entity * @return string */ protected function getEntityHashByUniqueFields(ProductPrice $entity) { return md5(implode(':', [$entity->getProduct()->getId(), $entity->getPriceList()->getId(), $entity->getQuantity(), $entity->getUnit()->getCode(), $entity->getPrice()->getCurrency()])); }
/** * @param int $productId * @param float $value * @param string $currency * @return ProductPrice */ protected function createPrice($productId, $value, $currency) { $product = new Product(); $reflection = new \ReflectionProperty(get_class($product), 'id'); $reflection->setAccessible(true); $reflection->setValue($product, $productId); $price = new ProductPrice(); $price->setProduct($product)->setPrice(Price::create($value, $currency)); return $price; }
/** * @param integer $priceListId * @param integer $quantity * @param string $unitCode * @param string $currency * @return ProductPrice */ protected function createPriceList($priceListId, $quantity, $unitCode, $currency) { $unit = new ProductUnit(); $unit->setCode($unitCode); $price = new Price(); $price->setValue(100)->setCurrency($currency); $productPrice = new ProductPrice(); $productPrice->setProduct($this->getEntity('OroB2B\\Bundle\\ProductBundle\\Entity\\Product', 42))->setPriceList($this->getEntity('OroB2B\\Bundle\\PricingBundle\\Entity\\PriceList', $priceListId))->setQuantity($quantity)->setUnit($unit)->setPrice($price); return $productPrice; }
/** * @return ProductPrice */ protected function createProductPrice() { /** @var Product $product */ $product = $this->getReference('product.1'); /** @var PriceList $priceList */ $priceList = $this->getReference('price_list_1'); /** @var ProductUnit $unit */ $unit = $this->getReference('product_unit.liter'); $price = Price::create(1.2, 'USD'); $newProductPrice = new ProductPrice(); $newProductPrice->setPriceList($priceList)->setProduct($product)->setQuantity(1)->setPrice($price)->setUnit($unit); return $newProductPrice; }
/** * @return array */ public function submitProvider() { $product = new Product(); $product->setSku('sku_test_001'); $productUnitPrecision = new ProductUnitPrecision(); $productUnitPrecision->setUnit((new ProductUnit())->setCode('kg')); $productUnitPrecision->setPrecision(5); $existingUnit = (new ProductUnit())->setCode('kg'); $existingPrice = (new Price())->setValue(42)->setCurrency('USD'); $product->addUnitPrecision($productUnitPrecision); /** @var PriceList $existingProductPriceList */ $existingProductPriceList = $this->getEntity('OroB2B\\Bundle\\PricingBundle\\Entity\\PriceList', 1); $existingProductPrice = new ProductPrice(); $existingProductPrice->setProduct($product)->setPriceList($existingProductPriceList)->setQuantity(123)->setUnit($existingUnit)->setPrice($existingPrice); /** @var PriceList $expectedPriceList */ $expectedPriceList = $this->getEntity('OroB2B\\Bundle\\PricingBundle\\Entity\\PriceList', 2); $expectedUnit = (new ProductUnit())->setCode('item'); $expectedPrice = (new Price())->setValue(43)->setCurrency('EUR'); $expectedProductPrice = new ProductPrice(); $expectedProductPrice->setPriceList($expectedPriceList)->setQuantity(124)->setUnit($expectedUnit)->setPrice($expectedPrice)->setProduct($product); $updatedExpectedProductPrice = clone $expectedProductPrice; $updatedExpectedProductPrice->setProduct($product); return ['product price with data' => ['defaultData' => (new ProductPrice())->setProduct($product)->setUnit($existingUnit), 'submittedData' => ['priceList' => 2, 'quantity' => 124, 'unit' => 'item', 'price' => ['value' => 43, 'currency' => 'EUR']], 'expectedData' => $expectedProductPrice], 'product price with precision' => ['defaultData' => $existingProductPrice, 'submittedData' => ['priceList' => 2, 'quantity' => 124, 'unit' => 'item', 'price' => ['value' => 43, 'currency' => 'EUR']], 'expectedData' => $updatedExpectedProductPrice, 'expectedOptions' => ['precision' => 5]]]; }
/** * @return array */ public function submitProvider() { $priceList = new PriceList(); $priceList->setCurrencies(['GBP']); /** @var Product $expectedProduct */ $expectedProduct = $this->getProductEntityWithPrecision(2, 'kg', 3); $expectedPrice1 = (new Price())->setValue(42)->setCurrency('USD'); $expectedPrice2 = (new Price())->setValue(42)->setCurrency('GBP'); $expectedProductPrice = new ProductPrice(); $expectedProductPrice->setProduct($expectedProduct)->setQuantity(123)->setUnit($expectedProduct->getUnitPrecision('kg')->getUnit())->setPrice($expectedPrice1)->setPriceList($priceList); $expectedProductPrice2 = clone $expectedProductPrice; $expectedProductPrice2->setQuantity(123.556)->setPrice($expectedPrice2); $defaultProductPrice = new ProductPrice(); $defaultProductPrice->setPriceList($priceList); return ['product price without data' => ['defaultData' => $defaultProductPrice, 'submittedData' => [], 'expectedData' => clone $defaultProductPrice, 'rounding' => false], 'product price with data' => ['defaultData' => clone $defaultProductPrice, 'submittedData' => ['product' => 2, 'quantity' => 123, 'unit' => 'kg', 'price' => ['value' => 42, 'currency' => 'USD']], 'expectedData' => $expectedProductPrice, 'rounding' => true], 'product price with data for rounding' => ['defaultData' => clone $defaultProductPrice, 'submittedData' => ['product' => 2, 'quantity' => 123.5555, 'unit' => 'kg', 'price' => ['value' => 42, 'currency' => 'GBP']], 'expectedData' => $expectedProductPrice2, 'rounding' => true]]; }
/** * @return ProductPrice */ public function getProductPrice() { $unit = new ProductUnit(); $unit->setCode('kg'); $unitPrecision = new ProductUnitPrecision(); $unitPrecision->setUnit($unit)->setPrecision(3); $product = new Product(); $product->setSku('testSku')->addUnitPrecision($unitPrecision); $price = new Price(); $price->setValue('50')->setCurrency('USD'); $productPrice = new ProductPrice(); $productPrice->setPriceList(new PriceList())->setProduct($product)->setQuantity('10')->setPrice($price); return $productPrice; }
/** * @param string $key * @param ProductPrice $entity */ public function fillEntityData($key, $entity) { $entity->setProduct($this->createProduct())->setPrice($this->createPrice())->setUnit($this->createProductUnit())->setQuantity(42); }
/** * @param ProductPrice $productPrice * @return string */ protected function getHash(ProductPrice $productPrice) { return md5(sprintf('%s_%s_%s_%s_%s', $productPrice->getProduct()->getId(), $productPrice->getPriceList()->getId(), (double) $productPrice->getQuantity(), $productPrice->getUnit()->getCode(), $productPrice->getPrice()->getCurrency())); }
/** * Create product form * * @Route( * "/create/{priceListId}", * name="orob2b_product_price_create_widget", * requirements={"priceListId"="\d+"} * ) * @Template("OroB2BPricingBundle:ProductPrice:widget/update.html.twig") * @Acl( * id="orob2b_pricing_product_price_create", * type="entity", * class="OroB2BPricingBundle:ProductPrice", * permission="CREATE" * ) * @ParamConverter("priceList", class="OroB2BPricingBundle:PriceList", options={"id" = "priceListId"}) * * @param PriceList $priceList * @return array|RedirectResponse */ public function createAction(PriceList $priceList) { $productPrice = new ProductPrice(); $productPrice->setPriceList($priceList); return $this->update($productPrice); }
/** * @return ProductPrice */ public function getProductPrice() { $priceList = new PriceList(); $priceList->setCurrencies(['USD', 'EUR']); $productPrice = new ProductPrice(); $productPrice->setPriceList($priceList); return $productPrice; }
/** * @param ProductPrice $productPrice * @return string */ protected function formatProductPrice(ProductPrice $productPrice) { $price = $productPrice->getPrice(); return $this->numberFormatter->formatCurrency($price->getValue(), $price->getCurrency()); }