public function testAddQuoteProduct() { $quote = new Quote(); $quoteProduct = new QuoteProduct(); $this->assertNull($quoteProduct->getQuote()); $quote->addQuoteProduct($quoteProduct); $this->assertEquals($quote, $quoteProduct->getQuote()); }
/** * @param Quote $quote * @param LifecycleEventArgs $event */ public function postPersist(Quote $quote, LifecycleEventArgs $event) { if ($quote->getQid()) { return; } $unitOfWork = $event->getEntityManager()->getUnitOfWork(); $changeSet = ['qid' => [null, $quote->getId()]]; $unitOfWork->scheduleExtraUpdate($quote, $changeSet); }
/** * @param int $ownerId * @param QuoteProduct[] $items * @return Quote */ protected function getQuote($ownerId, array $items = []) { $quote = new Quote(); $quote->setOwner($this->getEntity('Oro\\Bundle\\UserBundle\\Entity\\User', $ownerId)); foreach ($items as $item) { $quote->addQuoteProduct($item); } return $quote; }
public function testPersistQuote() { /* @var $em EntityManager */ $em = static::getContainer()->get('doctrine')->getManagerForClass('OroB2BSaleBundle:Quote'); $quote = new Quote(); $quote->setOwner($this->getReference(LoadUserData::USER1)); $this->assertNull($quote->getQid()); $em->persist($quote); $this->assertEquals(null, $quote->getQid()); $em->flush(); $this->assertNotNull($quote->getId()); $em->clear(); $quote = $em->getRepository('OroB2BSaleBundle:Quote')->find($quote->getId()); $this->assertEquals($quote->getId(), $quote->getQid()); }
/** * @return array */ public function submitDataProvider() { $firstUnitOffer = $this->createOffer(1, QuoteProductOffer::PRICE_TYPE_UNIT, 12, 'kg'); $secondUnitOffer = $this->createOffer(2, QuoteProductOffer::PRICE_TYPE_UNIT, 16, 'kg'); $thirdUnitOffer = $this->createOffer(3, QuoteProductOffer::PRICE_TYPE_UNIT, 17, 'kg', true); $bundledOffer = $this->createOffer(4, QuoteProductOffer::PRICE_TYPE_BUNDLED, 1000, 'item'); $firstUnitQuoteProduct = new QuoteProduct(); $firstUnitQuoteProduct->addQuoteProductOffer($firstUnitOffer); $secondUnitQuoteProduct = new QuoteProduct(); $secondUnitQuoteProduct->addQuoteProductOffer($secondUnitOffer)->addQuoteProductOffer($thirdUnitOffer); $bundledQuoteProduct = new QuoteProduct(); $bundledQuoteProduct->addQuoteProductOffer($bundledOffer); $unitAndBundledQuote = new Quote(); $unitAndBundledQuote->addQuoteProduct($firstUnitQuoteProduct)->addQuoteProduct($secondUnitQuoteProduct)->addQuoteProduct($bundledQuoteProduct); return ['no products' => ['quote' => new Quote(), 'defaultData' => [], 'submit' => [], 'expectedData' => []], 'unit and bundled products' => ['quote' => $unitAndBundledQuote, 'defaultData' => [$firstUnitQuoteProduct, $secondUnitQuoteProduct, $bundledQuoteProduct], 'submit' => [[QuoteProductToOrderType::FIELD_QUANTITY => '12', QuoteProductToOrderType::FIELD_UNIT => 'kg'], [QuoteProductToOrderType::FIELD_QUANTITY => '16', QuoteProductToOrderType::FIELD_UNIT => 'kg'], [QuoteProductToOrderType::FIELD_QUANTITY => '1000', QuoteProductToOrderType::FIELD_UNIT => 'item']], 'expectedData' => [[QuoteProductToOrderType::FIELD_QUANTITY => 12, QuoteProductToOrderType::FIELD_OFFER => $firstUnitOffer], [QuoteProductToOrderType::FIELD_QUANTITY => 16, QuoteProductToOrderType::FIELD_OFFER => $secondUnitOffer], [QuoteProductToOrderType::FIELD_QUANTITY => 1000, QuoteProductToOrderType::FIELD_OFFER => $bundledOffer]]]]; }
/** * @param Quote $quote * @param ObjectManager $manager */ protected function processQuoteProducts(Quote $quote, ObjectManager $manager) { $products = $this->getProducts($manager); $currencies = $this->getCurrencies(); $types = [QuoteProduct::TYPE_REQUESTED, QuoteProduct::TYPE_NOT_AVAILABLE]; $priceTypes = [QuoteProductOffer::PRICE_TYPE_UNIT, QuoteProductOffer::PRICE_TYPE_BUNDLED]; 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 { for ($i = 0; $i < rand(1, 3); $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(); for ($j = 0; $j < rand(1, 3); $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); } } }
/** * @param ObjectManager $manager * @param Quote $quote * @param string $sku * @param array $items */ protected function addQuoteProduct(ObjectManager $manager, Quote $quote, $sku, $items) { $product = new QuoteProduct(); if ($this->hasReference($sku)) { $product->setProduct($this->getReference($sku)); } else { $product->setProductSku($sku); } foreach ($items as $item) { $productOffer = new QuoteProductOffer(); $productOffer->setQuantity($item['quantity'])->setPrice((new Price())->setValue($item['price'])->setCurrency($item['currency'])); if ($this->hasReference($item['unit'])) { $productOffer->setProductUnit($this->getReference($item['unit'])); } else { $productOffer->setProductUnitCode($item['unit']); } $manager->persist($productOffer); $product->addQuoteProductOffer($productOffer); } $manager->persist($product); $quote->addQuoteProduct($product); }
/** * @param int $ownerId * @param int $accountUserId * @param int $accountId * @param QuoteProduct[] $items * @param bool $locked * @return Quote */ protected function getQuote($ownerId, $accountUserId = null, $accountId = null, array $items = [], $locked = false) { $quote = new Quote(); $quote->setOwner($this->getEntity('Oro\\Bundle\\UserBundle\\Entity\\User', $ownerId)); if (null !== $accountUserId) { $quote->setAccountUser($this->getEntity('OroB2B\\Bundle\\AccountBundle\\Entity\\AccountUser', $accountUserId)); } if (null !== $accountId) { $quote->setAccount($this->getEntity('OroB2B\\Bundle\\AccountBundle\\Entity\\Account', $accountId)); } foreach ($items as $item) { $quote->addQuoteProduct($item); } $quote->setLocked($locked); return $quote; }
/** * @param ObjectManager $manager * @param Quote $quote * @param string $sku * @param array $items */ protected function addQuoteProduct(ObjectManager $manager, Quote $quote, $sku, $items) { $product = new QuoteProduct(); if ($this->hasReference($sku)) { $product->setProduct($this->getReference($sku)); } else { $product->setProductSku($sku); } foreach ($items as $index => $item) { $productOffer = new QuoteProductOffer(); $productOffer->setAllowIncrements($item['allow_increments'])->setQuantity($item['quantity'])->setPriceType($item['priceType'])->setPrice((new Price())->setValue($item['price'])->setCurrency($item['currency'])); if ($this->hasReference($item['unit'])) { $productOffer->setProductUnit($this->getReference($item['unit'])); } else { $productOffer->setProductUnitCode($item['unit']); } $manager->persist($productOffer); // e.g sale.quote.1.product.1.offer.1 $this->addReference($quote->getQid() . '.' . $sku . '.offer.' . ($index + 1), $productOffer); $product->addQuoteProductOffer($productOffer); } $manager->persist($product); $quote->addQuoteProduct($product); }
/** * @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; }
/** * "Success" form handler * * @param RFPRequest $entity * @return bool */ protected function onSuccess(RFPRequest $entity) { $quote = new Quote(); $quote->setRequest($entity)->setOwner($this->user)->setAccount($entity->getAccount())->setAccountUser($entity->getAccountUser())->setOrganization($this->user->getOrganization()); foreach ($entity->getRequestProducts() as $requestProduct) { $quoteProduct = new QuoteProduct(); $quoteProduct->setProduct($requestProduct->getProduct())->setType(QuoteProduct::TYPE_REQUESTED)->setCommentAccount($requestProduct->getComment()); foreach ($requestProduct->getRequestProductItems() as $requestProductItem) { $quoteProductRequest = new QuoteProductRequest(); $quoteProductRequest->setQuantity($requestProductItem->getQuantity())->setPrice($requestProductItem->getPrice())->setProductUnit($requestProductItem->getProductUnit())->setRequestProductItem($requestProductItem); $quoteProduct->addQuoteProductRequest($quoteProductRequest); $quoteProductOffer = new QuoteProductOffer(); $quoteProductOffer->setQuantity($requestProductItem->getQuantity())->setProductUnit($requestProductItem->getProductUnit())->setPriceType(QuoteProductOffer::PRICE_TYPE_UNIT)->setAllowIncrements(true); $quoteProduct->addQuoteProductOffer($quoteProductOffer); } $quote->addQuoteProduct($quoteProduct); } try { $this->manager->persist($quote); $this->manager->flush(); $this->quote = $quote; } catch (DBALException $e) { $this->exception = $e; return false; } return true; }
/** * @param int $quoteProductCount * @param int $quoteProductOfferCount * @param bool|false $allowIncrements * @return Quote */ protected function createQuote($quoteProductCount, $quoteProductOfferCount, $allowIncrements = false) { $quote = new Quote(); for ($i = 0; $i < $quoteProductCount; $i++) { $quoteProduct = new QuoteProduct(); for ($j = 0; $j < $quoteProductOfferCount; $j++) { $quoteProductOffer = new QuoteProductOffer(); $quoteProductOffer->setAllowIncrements($allowIncrements); $quoteProduct->addQuoteProductOffer($quoteProductOffer); } $quote->addQuoteProduct($quoteProduct); } return $quote; }
/** * @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; }