/**
  * {@inheritdoc}
  */
 protected function addItem(Product $product, $entity, array $itemData = [])
 {
     if (!$entity instanceof Order) {
         return;
     }
     $lineItem = new OrderLineItem();
     $lineItem->setProduct($product)->setProductSku($product->getSku());
     if (array_key_exists(ProductDataStorage::PRODUCT_QUANTITY_KEY, $itemData)) {
         $lineItem->setQuantity($itemData[ProductDataStorage::PRODUCT_QUANTITY_KEY]);
     }
     $this->fillEntityData($lineItem, $itemData);
     if (!$lineItem->getProductUnit()) {
         /** @var ProductUnitPrecision $unitPrecision */
         $unitPrecision = $product->getUnitPrecisions()->first();
         if (!$unitPrecision) {
             return;
         }
         /** @var ProductUnit $unit */
         $unit = $unitPrecision->getUnit();
         if (!$unit) {
             return;
         }
         $lineItem->setProductUnit($unit);
         $lineItem->setProductUnitCode($unit->getCode());
     }
     if ($lineItem->getProduct()) {
         $entity->addLineItem($lineItem);
     }
 }
 /**
  * @param QuoteProductOffer $quoteProductOffer
  * @param float|null $quantity
  * @return OrderLineItem
  */
 protected function createOrderLineItem(QuoteProductOffer $quoteProductOffer, $quantity = null)
 {
     $quoteProduct = $quoteProductOffer->getQuoteProduct();
     if ($quoteProduct->getProductReplacement()) {
         $product = $quoteProduct->getProductReplacement();
     } else {
         $product = $quoteProduct->getProduct();
     }
     $orderLineItem = new OrderLineItem();
     $orderLineItem->setProduct($product)->setProductUnit($quoteProductOffer->getProductUnit())->setQuantity($quantity ?: $quoteProductOffer->getQuantity())->setPriceType($quoteProductOffer->getPriceType())->setPrice($quoteProductOffer->getPrice())->setFromExternalSource(true);
     return $orderLineItem;
 }
 public function testPrePersist()
 {
     $entity = new OrderLineItem();
     $entity->setPrice(Price::create(42, 'USD'));
     $this->assertEquals(42, $entity->getValue());
     $this->assertEquals('USD', $entity->getCurrency());
     $entity->getPrice()->setValue(84);
     $entity->getPrice()->setCurrency('EUR');
     $this->assertEmpty($entity->getProductSku());
     $this->assertEmpty($entity->getProductUnitCode());
     $entity->setProduct((new Product())->setSku('SKU'));
     $entity->setProductUnit((new ProductUnit())->setCode('kg'));
     $entity->preSave();
     $this->assertEquals(84, $entity->getValue());
     $this->assertEquals('EUR', $entity->getCurrency());
     $this->assertEquals('SKU', $entity->getProductSku());
     $this->assertEquals('kg', $entity->getProductUnitCode());
 }
 /**
  * @param string $sku
  * @param string $unitCode
  * @param float $qty
  * @param int $priceType
  * @param float $priceValue
  * @param string $priceCurrency
  * @return OrderLineItem
  */
 protected function createOrderLineItem($sku, $unitCode, $qty, $priceType, $priceValue, $priceCurrency)
 {
     $orderLineItem = new OrderLineItem();
     $orderLineItem->setProduct((new Product())->setSku($sku))->setProductUnit((new ProductUnit())->setCode($unitCode))->setQuantity($qty)->setPriceType($priceType)->setPrice(Price::create($priceValue, $priceCurrency))->setFromExternalSource(true);
     return $orderLineItem;
 }