/**
  * {@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();
 }
Пример #2
0
 /**
  * {@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();
 }
Пример #3
0
 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;
 }
Пример #15
0
 /**
  * @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());
 }