6 declare(strict_types=1);
22 private $unrequiredConditions;
27 private $requiredConditions;
35 $this->setConditions($conditions);
41 private function setConditions(array $conditions)
43 $this->validateConditions($conditions);
45 $unrequiredConditions = array_filter(
48 return !isset(
$item[
'required']);
51 $this->unrequiredConditions = array_column($this->sortConditions($unrequiredConditions),
'object');
53 $requiredConditions = array_filter(
56 return isset(
$item[
'required']) && (bool)
$item[
'required'];
59 $this->requiredConditions = array_column($requiredConditions,
'object');
66 private function validateConditions(array $conditions)
68 foreach ($conditions as $condition) {
69 if (empty($condition[
'object'])) {
70 throw new LocalizedException(
__(
'Parameter "object" must be present.'));
73 if (empty($condition[
'required']) && empty($condition[
'sort_order'])) {
74 throw new LocalizedException(
__(
'Parameter "sort_order" must be present for unrequired conditions.'));
77 if (!$condition[
'object'] instanceof IsProductSalableInterface) {
78 throw new LocalizedException(
79 __(
'Condition have to implement IsProductSalableInterface.')
89 private function sortConditions(array $conditions)
91 usort($conditions,
function (array $conditionLeft, array $conditionRight) {
92 if ($conditionLeft[
'sort_order'] == $conditionRight[
'sort_order']) {
95 return ($conditionLeft[
'sort_order'] < $conditionRight[
'sort_order']) ? -1 : 1;
103 public function execute(
string $sku,
int $stockId): bool
106 foreach ($this->requiredConditions as $requiredCondition) {
107 if ($requiredCondition->execute($sku, $stockId) ===
false) {
111 foreach ($this->unrequiredConditions as $unrequiredCondition) {
112 if ($unrequiredCondition->execute($sku, $stockId) ===
true) {
__construct(array $conditions)
execute(string $sku, int $stockId)