-
Notifications
You must be signed in to change notification settings - Fork 82
/
PromotionExecutor.php
71 lines (60 loc) · 2.2 KB
/
PromotionExecutor.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php
namespace Oro\Bundle\PromotionBundle\Executor;
use Oro\Bundle\PromotionBundle\Discount\Converter\DiscountContextConverterInterface;
use Oro\Bundle\PromotionBundle\Discount\DiscountContextInterface;
use Oro\Bundle\PromotionBundle\Discount\Strategy\StrategyProvider;
use Oro\Bundle\PromotionBundle\Provider\PromotionDiscountsProviderInterface;
/**
* This class fills context with discounts' information for a given source entity using currently selected strategy.
*/
class PromotionExecutor
{
/**
* @var DiscountContextConverterInterface
*/
private $discountContextConverter;
/**
* @var StrategyProvider
*/
private $discountStrategyProvider;
/**
* @var PromotionDiscountsProviderInterface
*/
private $promotionDiscountsProvider;
/**
* @param DiscountContextConverterInterface $discountContextConverter
* @param StrategyProvider $discountStrategyProvider
* @param PromotionDiscountsProviderInterface $promotionDiscountsProvider
*/
public function __construct(
DiscountContextConverterInterface $discountContextConverter,
StrategyProvider $discountStrategyProvider,
PromotionDiscountsProviderInterface $promotionDiscountsProvider
) {
$this->discountContextConverter = $discountContextConverter;
$this->discountStrategyProvider = $discountStrategyProvider;
$this->promotionDiscountsProvider = $promotionDiscountsProvider;
}
/**
* @param object $sourceEntity
* @return DiscountContextInterface
*/
public function execute($sourceEntity): DiscountContextInterface
{
$discountContext = $this->discountContextConverter->convert($sourceEntity);
$discounts = $this->promotionDiscountsProvider->getDiscounts($sourceEntity, $discountContext);
if (!$discounts) {
return $discountContext;
}
$strategy = $this->discountStrategyProvider->getActiveStrategy();
return $strategy->process($discountContext, $discounts);
}
/**
* @param object $sourceEntity
* @return bool
*/
public function supports($sourceEntity)
{
return $this->discountContextConverter->supports($sourceEntity);
}
}