PromotionDiscountEntity::TYPE_ABSOLUTE =>
new DiscountAbsoluteCalculator($this->absolutePriceCalculator
),
PromotionDiscountEntity::TYPE_PERCENTAGE =>
new DiscountPercentageCalculator($this->absolutePriceCalculator,
$this->percentagePriceCalculator
),
PromotionDiscountEntity::TYPE_FIXED =>
new DiscountFixedPriceCalculator($this->absolutePriceCalculator
),
PromotionDiscountEntity::TYPE_FIXED_UNIT =>
new DiscountFixedUnitPriceCalculator($this->absolutePriceCalculator
),
default =>
throw new DiscountCalculatorNotFoundException($discount->
getType()),
};
$result =
$calculator->
calculate($discount,
$packages,
$context);
// now aggregate any composition items
// which might be duplicated due to separate packages
$aggregatedCompositionItems =
$this->discountCompositionBuilder->
aggregateCompositionItems($result->
getCompositionItems());
$result =
new DiscountCalculatorResult($result->
getPrice(),
$aggregatedCompositionItems);
// get the cart total price => discount may never be higher than this value
$maxDiscountValue =
$this->
getMaxDiscountValue($calculatedCart,
$context);
// if our price is larger than the max discount value,
// then use the max discount value as negative discount
if (abs($result->
getPrice()->
getTotalPrice()) >
abs($maxDiscountValue)) { $result =
$this->
limitDiscountResult($maxDiscountValue,
$packages->
getAffectedPrices(),
$result,
$context);
}