The concept of coupons is closely connected to the Promotions Concept.
A Coupon besides a
code has a date when it expires, the
usageLimit and it counts how many times it was already used.
How to create a coupon with a promotion programmatically?¶
The promotion has to be
couponBased = true in order to be able to hold a collection of Coupons that belong to it.
Let’s create a promotion that will have a single coupon that activates the free shipping promotion.
/** @var PromotionInterface $promotion */ $promotion = $this->container->get('sylius.factory.promotion')->createNew(); $promotion->setCode('free_shipping'); $promotion->setName('Free Shipping');
Remember to set a channel for your promotion and to make it couponBased!
$promotion->addChannel($this->container->get('sylius.repository.channel')->findOneBy(['code' => 'US_Web_Store'])); $promotion->setCouponBased(true);
Then create a coupon and add it to the promotion:
/** @var CouponInterface $coupon */ $coupon = $this->container->get('sylius.factory.promotion_coupon')->createNew(); $coupon->setCode('FREESHIPPING'); $promotion->addCoupon($coupon);
Now create an PromotionAction that will take place after applying this promotion - 100% discount on shipping
/** @var PromotionActionFactoryInterface $actionFactory */ $actionFactory = $this->container->get('sylius.factory.promotion_action'); // Provide the amount in float ( 1 = 100%, 0.1 = 10% ) $action = $actionFactory->createShippingPercentageDiscount(1); $promotion->addAction($action); $this->container->get('sylius.repository.promotion')->add($promotion);
Finally to see the effects of your promotion with couponyou need to apply a coupon on the Order.
How to apply a coupon to an Order?¶
To apply you promotion with coupon that gives 100% discount on the shipping costs you need an order that has shipments. Set your promotion coupon on that order - this is what happens when a customer provides a coupon code during checkout.
And after that call the OrderProcessor on the order to have the promotion applied.
Promotion Coupon Generator¶
Making up new codes might become difficult if you would like to prepare a lot of coupons at once. That is why Sylius provides a service that generates random codes for you - CouponGenerator. In its PromotionCouponGeneratorInstruction you can define the amount of coupons that will be generated, length of their codes, expiration date and usage limit.
// Find a promotion you desire in the repository $promotion = $this->container->get('sylius.repository.promotion')->findOneBy(['code' => 'simple_promotion']); // Get the CouponGenerator service /** @var CouponGeneratorInterface $generator */ $generator = $this->container->get('sylius.promotion_coupon_generator'); // Then create a new empty PromotionCouponGeneratorInstruction /** @var PromotionCouponGeneratorInstructionInterface $instruction */ $instruction = new PromotionCouponGeneratorInstruction(); // By default the instruction will generate 5 coupons with codes of length equal to 6 // You can easily change it with the ``setAmount()`` and ``setLength()`` methods $instruction->setAmount(10); // Now use the ``generate()`` method with your instruction on the promotion where you want to have Coupons $generator->generate($promotion, $instruction);
The above piece of code will result in a set of 10 coupons that will work with the promotion identified by the