diff --git a/src/Sylius/Bundle/CoreBundle/Announcer/CatalogPromotionAnnouncer.php b/src/Sylius/Bundle/CoreBundle/Announcer/CatalogPromotionAnnouncer.php index b13c91de3ab..25b11716003 100644 --- a/src/Sylius/Bundle/CoreBundle/Announcer/CatalogPromotionAnnouncer.php +++ b/src/Sylius/Bundle/CoreBundle/Announcer/CatalogPromotionAnnouncer.php @@ -42,6 +42,10 @@ public function dispatchCatalogPromotionCreatedEvent(CatalogPromotionInterface $ public function dispatchCatalogPromotionUpdatedEvent(CatalogPromotionInterface $catalogPromotion): void { + if ($catalogPromotion->getStartDate() > $this->dateTimeProvider->now()) { + $this->eventBus->dispatch(new CatalogPromotionUpdated($catalogPromotion->getCode()), []); + } + $this->eventBus->dispatch( new CatalogPromotionUpdated($catalogPromotion->getCode()), $this->calculateStartDateStamp($catalogPromotion) diff --git a/src/Sylius/Bundle/CoreBundle/spec/Announcer/CatalogPromotionAnnouncerSpec.php b/src/Sylius/Bundle/CoreBundle/spec/Announcer/CatalogPromotionAnnouncerSpec.php index dd2942a4a04..d4076178f33 100644 --- a/src/Sylius/Bundle/CoreBundle/spec/Announcer/CatalogPromotionAnnouncerSpec.php +++ b/src/Sylius/Bundle/CoreBundle/spec/Announcer/CatalogPromotionAnnouncerSpec.php @@ -127,4 +127,35 @@ function it_dispatches_catalog_promotion_updated_and_catalog_promotion_ended_eve $this->dispatchCatalogPromotionUpdatedEvent($catalogPromotion); } + + function it_dispatches_catalog_promotion_updated_twice_if_catalog_promotion_is_updated_with_delayed_start( + MessageBusInterface $eventBus, + DelayStampCalculatorInterface $delayStampCalculator, + DateTimeProviderInterface $dateTimeProvider, + CatalogPromotionInterface $catalogPromotion + ): void { + $startDateTime = new \DateTime('2021-10-10'); + $endDateTime = new \DateTime('2021-10-11'); + + $dateTimeProvider->now()->willReturn(new \DateTime('2021-10-09')); + + $catalogPromotion->getCode()->willReturn('SALE'); + $catalogPromotion->getStartDate()->willReturn($startDateTime); + $catalogPromotion->getEndDate()->willReturn($endDateTime); + + $startDelayStamp = new DelayStamp(200000); + $endDelayStamp = new DelayStamp(300000); + + $delayStampCalculator->calculate(Argument::any(), $startDateTime)->willReturn($startDelayStamp); + $delayStampCalculator->calculate(Argument::any(), $endDateTime)->willReturn($endDelayStamp); + + $messageUpdate = new CatalogPromotionUpdated('SALE'); + $messageEnd = new CatalogPromotionEnded('SALE'); + + $eventBus->dispatch($messageUpdate, [])->willReturn(new Envelope($messageUpdate))->shouldBeCalled(); + $eventBus->dispatch($messageUpdate, [$startDelayStamp])->willReturn(new Envelope($messageUpdate))->shouldBeCalled(); + $eventBus->dispatch($messageEnd, [$endDelayStamp])->willReturn(new Envelope($messageEnd))->shouldBeCalled(); + + $this->dispatchCatalogPromotionUpdatedEvent($catalogPromotion); + } }