public function __construct(PromotionType $type)
 {
     parent::__construct($type);
     $this->entityDTO->isFixed = $this->entity->isFixed();
     $this->entityDTO->isPercent = $this->entity->isPercent();
     $this->entityDTO->isExact = $this->entity->isExact();
 }
 /**
  * @param int $unitPrice
  * @return int
  */
 public function getUnitPrice($unitPrice)
 {
     $returnValue = 0;
     if ($this->type->isFixed()) {
         $returnValue = $unitPrice - $this->value;
     } elseif ($this->type->isPercent()) {
         $returnValue = $unitPrice - $unitPrice * ($this->value / 100);
     } elseif ($this->type->isExact()) {
         $returnValue = $this->value;
     }
     return (int) $returnValue;
 }
 public function testFind()
 {
     $code = '20PCT';
     $name = '20% Off orders over $100';
     $value = 20;
     $minOrderValue = 10000;
     $maxOrderValue = 100000;
     $promotionType = PromotionType::fixed();
     $originalCoupon = new Coupon($code);
     $originalCoupon->setName($name);
     $originalCoupon->setValue($value);
     $originalCoupon->setType($promotionType);
     $originalCoupon->setMinOrderValue($minOrderValue);
     $originalCoupon->setMaxOrderValue($maxOrderValue);
     $originalCoupon->setFlagFreeShipping(true);
     $originalCoupon->setCanCombineWithOtherCoupons(true);
     $this->persistEntityAndFlushClear($originalCoupon);
     $this->setCountLogger();
     $coupon = $this->couponRepository->findOneById($originalCoupon->getId());
     $this->assertEquals($originalCoupon->getId(), $coupon->getId());
     $this->assertSame($code, $coupon->getCode());
     $this->assertSame($name, $coupon->getName());
     $this->assertSame($value, $coupon->getValue());
     $this->assertSame($minOrderValue, $coupon->getMinOrderValue());
     $this->assertSame($maxOrderValue, $coupon->getMaxOrderValue());
     $this->assertTrue($coupon->getType()->isFixed());
     $this->assertTrue($coupon->getFlagFreeShipping());
     $this->assertTrue($coupon->getCanCombineWithOtherCoupons());
     $this->assertSame(1, $this->getTotalQueries());
 }
 public function testGetNameFixed()
 {
     $this->productQuantityDiscount->setType(PromotionType::fixed());
     $this->productQuantityDiscount->setQuantity(10);
     $this->productQuantityDiscount->setValue(500);
     $this->assertSame('Buy 10 or more for $5.00 off', $this->productQuantityDiscount->getName());
 }
 public function handle(CreateProductQuantityDiscountCommand $command)
 {
     $product = $this->productService->findOneById($command->getProductId());
     $productQuantityDiscount = new ProductQuantityDiscount($product, $command->getProductQuantityDiscountId());
     $productQuantityDiscount->setType(PromotionType::createById($command->getPromotionTypeId()));
     $productQuantityDiscount->setValue($command->getValue());
     $productQuantityDiscount->setReducesTaxSubtotal($command->getReducesTaxSubtotal());
     $productQuantityDiscount->setMaxRedemptions($command->getMaxRedemptions());
     $productQuantityDiscount->setStart($command->getStartDate());
     $productQuantityDiscount->setEnd($command->getEndDate());
     $productQuantityDiscount->setQuantity($command->getQuantity());
     $productQuantityDiscount->setFlagApplyCatalogPromotions($command->getFlagApplyCatalogPromotions());
     $this->productService->createProductQuantityDiscount($productQuantityDiscount);
 }
Esempio n. 6
0
 public function testCreate()
 {
     $catalogPromotion = $this->dummyData->getCatalogPromotion();
     $catalogPromotion->setName('20% OFF Everything');
     $productQuantityDiscount1 = $this->dummyData->getProductQuantityDiscount();
     $productQuantityDiscount1->setType(PromotionType::exact());
     $productQuantityDiscount1->setQuantity(1);
     $productQuantityDiscount1->setValue(100);
     $product = $this->dummyData->getProduct();
     $product->setSku('sku1');
     $product->setName('Test Product');
     $productQuantityDiscount2 = $this->dummyData->getProductQuantityDiscount();
     $productQuantityDiscount2->setType(PromotionType::fixed());
     $productQuantityDiscount2->setQuantity(2);
     $productQuantityDiscount2->setValue(200);
     $price = $this->dummyData->getPrice();
     $price->addCatalogPromotion($catalogPromotion);
     $price->addProductQuantityDiscount($productQuantityDiscount1);
     $price->addProductQuantityDiscount($productQuantityDiscount2);
     $optionProduct = $this->dummyData->getOptionProduct();
     $optionProduct->getProduct()->setSku('OP1');
     $orderItemOptionProduct = $this->dummyData->getOrderItemOptionProduct($optionProduct);
     $optionValue = $this->dummyData->getOptionValue();
     $optionValue->setSku('OV1');
     $orderItemOptionValue = $this->dummyData->getOrderItemOptionValue($optionValue);
     $orderItemTextOptionValue = $this->dummyData->getOrderItemTextOptionValue();
     $order = $this->dummyData->getOrder();
     $orderItem = new OrderItem($order);
     $orderItem->setProduct($product);
     $orderItem->setQuantity(2);
     $orderItem->setPrice($price);
     $orderItem->addOrderItemOptionProduct($orderItemOptionProduct);
     $orderItem->addOrderItemOptionValue($orderItemOptionValue);
     $orderItem->addOrderItemTextOptionValue($orderItemTextOptionValue);
     $this->assertEntityValid($orderItem);
     $this->assertSame(2, $orderItem->getQuantity());
     $this->assertSame('sku1-OP1-OV1', $orderItem->getSku());
     $this->assertSame('Test Product', $orderItem->getName());
     $this->assertSame('20% OFF Everything, Buy 1 or more for $1.00 each, Buy 2 or more for $2.00 off', $orderItem->getDiscountNames());
     $this->assertSame($order, $orderItem->getOrder());
     $this->assertSame($product, $orderItem->getProduct());
     $this->assertSame($price, $orderItem->getPrice());
     $this->assertSame($orderItemOptionProduct, $orderItem->getOrderItemOptionProducts()[0]);
     $this->assertSame($orderItemOptionValue, $orderItem->getOrderItemOptionValues()[0]);
     $this->assertSame($orderItemTextOptionValue, $orderItem->getOrderItemTextOptionValues()[0]);
     $this->assertSame($catalogPromotion, $orderItem->getCatalogPromotions()[0]);
     $this->assertSame($productQuantityDiscount1, $orderItem->getProductQuantityDiscounts()[0]);
 }
 public function handle(CreateCouponCommand $command)
 {
     $coupon = new Coupon($command->getCode(), $command->getCouponId());
     $coupon->setFlagFreeShipping($command->getFlagFreeShipping());
     $coupon->setMinOrderValue($command->getMinOrderValue());
     $coupon->setMaxOrderValue($command->getMaxOrderValue());
     $coupon->setCanCombineWithOtherCoupons($command->canCombineWithOtherCoupons());
     $coupon->setName($command->getName());
     $coupon->setType(PromotionType::createById($command->getPromotionTypeId()));
     $coupon->setValue($command->getValue());
     $coupon->setReducesTaxSubtotal($command->getReducesTaxSubtotal());
     $coupon->setMaxRedemptions($command->getMaxRedemptions());
     $coupon->setStart($command->getStartDate());
     $coupon->setEnd($command->getEndDate());
     $this->couponService->create($coupon);
 }
 public function handle(CreateCatalogPromotionCommand $command)
 {
     $catalogPromotion = new CatalogPromotion($command->getCatalogPromotionId());
     $catalogPromotion->setName($command->getName());
     $catalogPromotion->setType(PromotionType::createById($command->getPromotionTypeId()));
     $catalogPromotion->setValue($command->getValue());
     $catalogPromotion->setReducesTaxSubtotal($command->getReducesTaxSubtotal());
     $catalogPromotion->setMaxRedemptions($command->getMaxRedemptions());
     $catalogPromotion->setStart($command->getStartDate());
     $catalogPromotion->setEnd($command->getEndDate());
     if ($command->getTagId() !== null) {
         $tag = $this->tagService->findOneById($command->getTagId());
         $catalogPromotion->setTag($tag);
     }
     $this->catalogPromotionService->create($catalogPromotion);
 }
 public function testGetPriceWithProductQuantityDiscountPercent()
 {
     $product = new Product();
     $product->setUnitPrice(500);
     $productQuantityDiscount6 = new ProductQuantityDiscount($product);
     $productQuantityDiscount6->setType(PromotionType::percent());
     $productQuantityDiscount6->setQuantity(6);
     $productQuantityDiscount6->setValue(5);
     $productQuantityDiscount12 = new ProductQuantityDiscount($product);
     $productQuantityDiscount12->setType(PromotionType::percent());
     $productQuantityDiscount12->setQuantity(12);
     $productQuantityDiscount12->setValue(30);
     $productQuantityDiscount24 = new ProductQuantityDiscount($product);
     $productQuantityDiscount24->setType(PromotionType::percent());
     $productQuantityDiscount24->setQuantity(24);
     $productQuantityDiscount24->setValue(35);
     $productQuantityDiscounts = $product->getProductQuantityDiscounts();
     $this->pricing->setProductQuantityDiscounts($productQuantityDiscounts);
     $expectedPrice = new Price();
     $expectedPrice->unitPrice = 500;
     $expectedPrice->origUnitPrice = 500;
     $expectedPrice->quantityPrice = 500;
     $expectedPrice->origQuantityPrice = 500;
     $this->assertEquals($expectedPrice, $this->pricingCalculator->getPrice($product, 1));
     $expectedPrice = new Price();
     $expectedPrice->unitPrice = 475;
     $expectedPrice->origUnitPrice = 500;
     $expectedPrice->quantityPrice = 2850;
     $expectedPrice->origQuantityPrice = 3000;
     $expectedPrice->addProductQuantityDiscount($productQuantityDiscount6);
     $this->assertEquals($expectedPrice, $this->pricingCalculator->getPrice($product, 6));
     $expectedPrice = new Price();
     $expectedPrice->unitPrice = 350;
     $expectedPrice->origUnitPrice = 500;
     $expectedPrice->quantityPrice = 4200;
     $expectedPrice->origQuantityPrice = 6000;
     $expectedPrice->addProductQuantityDiscount($productQuantityDiscount12);
     $this->assertEquals($expectedPrice, $this->pricingCalculator->getPrice($product, 12));
     $expectedPrice = new Price();
     $expectedPrice->unitPrice = 325;
     $expectedPrice->origUnitPrice = 500;
     $expectedPrice->quantityPrice = 7800;
     $expectedPrice->origQuantityPrice = 12000;
     $expectedPrice->addProductQuantityDiscount($productQuantityDiscount24);
     $this->assertEquals($expectedPrice, $this->pricingCalculator->getPrice($product, 24));
 }
Esempio n. 10
0
 public function getPromotionType()
 {
     return PromotionType::exact();
 }
 public function testGetUnitPriceWithExact()
 {
     $this->promotion->setType(PromotionType::exact());
     $this->promotion->setValue(20);
     $this->assertSame(20, $this->promotion->getUnitPrice(1000));
 }
Esempio n. 12
0
 public function testCreateByIdThrowsExceptionWhenInvalid()
 {
     $this->setExpectedException(InvalidArgumentException::class);
     PromotionType::createById(999);
 }
Esempio n. 13
0
 public function testGetTotalWithZip5TaxAndCouponNoReduceSubtotal()
 {
     $product = new Product();
     $product->setUnitPrice(2000);
     $product->setIsTaxable(true);
     $taxRate = new TaxRate();
     $taxRate->setZip5(92606);
     $taxRate->setRate(8.0);
     $taxRate->setApplyToShipping(false);
     $coupon = $this->dummyData->getCoupon();
     $coupon->setName('20% Off orders under $100');
     $coupon->setType(PromotionType::percent());
     $coupon->setValue(20);
     $coupon->setMinOrderValue(1000);
     $coupon->setMaxOrderValue(10000);
     $coupon->setReducesTaxSubtotal(false);
     $cartItem = new CartItem();
     $cartItem->setProduct($product);
     $cartItem->setQuantity(1);
     $cart = new Cart();
     $cart->addCoupon($coupon);
     $cart->addCartItem($cartItem);
     $cart->setTaxRate($taxRate);
     $expectedCartTotal = new CartTotal();
     $expectedCartTotal->origSubtotal = 2000;
     $expectedCartTotal->subtotal = 2000;
     $expectedCartTotal->taxSubtotal = 2000;
     $expectedCartTotal->shipping = 0;
     $expectedCartTotal->discount = 400;
     $expectedCartTotal->tax = 160;
     $expectedCartTotal->total = 1760;
     $expectedCartTotal->savings = 400;
     $expectedCartTotal->coupons = [$coupon];
     $expectedCartTotal->taxRate = $taxRate;
     $cartCalculator = new CartCalculator(new Pricing());
     $this->assertEquals($expectedCartTotal, $cartCalculator->getTotal($cart));
 }
Esempio n. 14
0
 private function getPercentCoupon($value)
 {
     $coupon = $this->dummyData->getCoupon();
     $coupon->setName($value . '% Off');
     $coupon->setType(PromotionType::percent());
     $coupon->setValue($value);
     return $coupon;
 }