/**
  * @param Quote $quote
  * @param AccountUser|null $user
  * @param array|null $selectedOffers
  * @return Order
  */
 public function convert(Quote $quote, AccountUser $user = null, array $selectedOffers = null)
 {
     $accountUser = $user ?: $quote->getAccountUser();
     $account = $user ? $user->getAccount() : $quote->getAccount();
     $order = new Order();
     $order->setAccount($account)->setAccountUser($accountUser)->setOwner($quote->getOwner())->setOrganization($quote->getOrganization());
     if (!$selectedOffers) {
         foreach ($quote->getQuoteProducts() as $quoteProduct) {
             /** @var QuoteProductOffer $productOffer */
             $productOffer = $quoteProduct->getQuoteProductOffers()->first();
             $order->addLineItem($this->createOrderLineItem($productOffer));
         }
     } else {
         foreach ($selectedOffers as $selectedOffer) {
             /** @var QuoteProductOffer $offer */
             $offer = $selectedOffer[self::FIELD_OFFER];
             $order->addLineItem($this->createOrderLineItem($offer, (double) $selectedOffer[self::FIELD_QUANTITY]));
         }
     }
     $this->orderCurrencyHandler->setOrderCurrency($order);
     $this->fillSubtotals($order);
     return $order;
 }
 /**
  * @param Form $form
  * @param Quote $quote
  * @param int $customQuantity
  * @return array
  */
 protected function setFormData(Form $form, Quote $quote, $customQuantity)
 {
     $selectedOffers = [];
     foreach ($quote->getQuoteProducts() as $quoteProduct) {
         /** @var \OroB2B\Bundle\SaleBundle\Entity\QuoteProductOffer $quoteProductOffer */
         $quoteProductOffer = $quoteProduct->getQuoteProductOffers()->first();
         foreach ($form->get('orob2b_sale_quote_to_order') as $key => $row) {
             if (!is_array($row)) {
                 continue;
             }
             /** @var ChoiceFormField $offer */
             $offer = $form->get('offer_choice_' . $key);
             if ((int) $offer->getValue() !== (int) $quoteProductOffer->getId()) {
                 continue;
             }
             if ($quoteProductOffer->isAllowIncrements()) {
                 $form['orob2b_sale_quote_to_order[' . $key . '][quantity]'] = $customQuantity;
             } else {
                 $form['orob2b_sale_quote_to_order[' . $key . '][quantity]'] = $quoteProductOffer->getQuantity();
             }
             $selectedOffers[] = $quoteProductOffer;
         }
     }
     return $selectedOffers;
 }
 /**
  * @param Quote $quote
  * @param ObjectManager $manager
  */
 protected function processQuoteProducts(Quote $quote, ObjectManager $manager)
 {
     $products = $this->getProducts($manager);
     $currencies = $this->getCurrencies();
     $types = [QuoteProduct::TYPE_REQUESTED];
     $priceTypes = [QuoteProductOffer::PRICE_TYPE_UNIT];
     if ($quote->getRequest()) {
         foreach ($quote->getRequest()->getRequestProducts() as $requestProduct) {
             $type = $types[rand(0, count($types) - 1)];
             $quoteProduct = $this->createQuoteProduct($requestProduct->getProduct(), $type);
             $this->processRequestProductItems($quoteProduct, $requestProduct);
             $quote->addQuoteProduct($quoteProduct);
         }
     } else {
         $numProducts = rand(1, 3);
         for ($i = 0; $i < $numProducts; $i++) {
             $product = $products[rand(1, count($products) - 1)];
             $quote->addQuoteProduct($this->createQuoteProduct($product, QuoteProduct::TYPE_OFFER));
         }
     }
     foreach ($quote->getQuoteProducts() as $quoteProduct) {
         $unitPrecisions = $quoteProduct->getProduct()->getUnitPrecisions();
         $numProductOffers = rand(1, 3);
         for ($j = 0; $j < $numProductOffers; $j++) {
             if (!count($unitPrecisions)) {
                 continue;
             }
             $productUnit = $unitPrecisions[rand(0, count($unitPrecisions) - 1)]->getUnit();
             $currency = $currencies[rand(0, count($currencies) - 1)];
             $priceType = $priceTypes[rand(0, count($priceTypes) - 1)];
             $quoteProductOffer = new QuoteProductOffer();
             $quoteProductOffer->setPrice(Price::create(rand(1, 100), $currency))->setQuantity(rand(1, 100))->setProductUnit($productUnit)->setPriceType($priceType)->setAllowIncrements((bool) rand(0, 1));
             if ($quoteProduct->isTypeNotAvailable()) {
                 $productReplacement = $products[rand(1, count($products) - 1)];
                 $unitPrecisionsRepl = $productReplacement->getUnitPrecisions();
                 $productUnitRepl = $unitPrecisionsRepl[rand(0, count($unitPrecisionsRepl) - 1)]->getUnit();
                 $quoteProduct->setProductReplacement($productReplacement);
                 $quoteProductOffer->setProductUnit($productUnitRepl);
             }
             $quoteProduct->addQuoteProductOffer($quoteProductOffer);
         }
     }
 }