$packages =
$this->advancedRules->
filter($discount,
$packages,
$context);
} // depending on the selected picker of our
// discount, the packages might be restructure
// also make sure we have correct cart items in our restructured packages from the picker
$packages =
$this->advancedPicker->
pickItems($discount,
$packages);
$packages =
$this->
enrichPackagesWithCartData($packages,
$calculatedCart,
$context);
// if we have any graduation settings, make sure to reduce the items
// that are eligible for our discount by executing our graduation resolver.
$packages =
$this->advancedFilter->
filterPackages($discount,
$packages,
$originalPackageCount);
$packages =
$this->
enrichPackagesWithCartData($packages,
$calculatedCart,
$context);
$calculator =
match ($discount->
getType()) { 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);