Example #1
0
 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);
 }
Example #3
0
 /**
  * @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);
         }
     }
 }
Example #7
0
 /**
  * @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;
 }
Example #12
0
 /**
  * @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;
 }