/** * @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); } } }