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); }
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)); }
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)); }
public function testCreateByIdThrowsExceptionWhenInvalid() { $this->setExpectedException(InvalidArgumentException::class); PromotionType::createById(999); }
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)); }
private function getPercentCoupon($value) { $coupon = $this->dummyData->getCoupon(); $coupon->setName($value . '% Off'); $coupon->setType(PromotionType::percent()); $coupon->setValue($value); return $coupon; }