Your IP : 216.73.217.95


Current Path : /var/www/www.indacotrentino.com/www/app/code/Amasty/Rewards/Model/
Upload File :
Current File : /var/www/www.indacotrentino.com/www/app/code/Amasty/Rewards/Model/SuitableItemChecker.php

<?php

declare(strict_types=1);

/**
 * @author Amasty Team
 * @copyright Copyright (c) 2023 Amasty (https://www.amasty.com)
 * @package Reward Points Base for Magento 2
 */

namespace Amasty\Rewards\Model;

use Amasty\Rewards\Model\Config\Source\IncludeExclude;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\ConfigurableProduct\Model\Product\Type\Configurable;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Quote\Model\Quote\Item as QuoteItem;
use Magento\Sales\Model\Order\Item as OrderItem;

class SuitableItemChecker
{
    /**
     * @var ProductRepositoryInterface
     */
    private $productRepository;

    public function __construct(
        ProductRepositoryInterface $productRepository
    ) {
        $this->productRepository = $productRepository;
    }

    /**
     * @param QuoteItem|OrderItem $item
     * @param int $action
     * @param array $skuIds
     * @param array $categoryIds
     * @return bool
     * @throws NoSuchEntityException
     */
    public function isSuitableItem($item, int $action, array $skuIds, array $categoryIds): bool
    {
        $itemCategoryIds = $item->getProduct()->getCategoryIds();

        if (!empty($skuIds) && array_intersect($this->getApplicableSkus($item), $skuIds)) {
            return $action === IncludeExclude::INCLUDE_VALUE;
        }

        if (!empty($itemCategoryIds) && array_intersect($itemCategoryIds, $categoryIds)) {
            return $action === IncludeExclude::INCLUDE_VALUE;
        }

        return $action === IncludeExclude::EXCLUDE_VALUE;
    }

    /**
     * @param QuoteItem|OrderItem $quoteItem
     * @return array
     * @throws NoSuchEntityException
     */
    private function getApplicableSkus($quoteItem): array
    {
        $skus = [$quoteItem->getProduct()->getData('sku')];

        if ($quoteItem->getProductType() === Configurable::TYPE_CODE) {
            $option = $quoteItem->getOptionByCode('simple_product');
            if ($option) {
                $product = $option->getProduct();
                $skus[] = $product->getData('sku');
            }
        }

        //for validation on the cart, checkout and admin area
        if ($quoteItem->getParentItem()) {
            $skus[] = $quoteItem->getParentItem()->getProduct()->getData('sku');
        }

        //for validation on product page
        if ($quoteItem->getProduct()->getParentProductId()) {
            $skus[] = $this->productRepository->getById($quoteItem->getProduct()->getParentProductId())->getSku();
        }

        return $skus;
    }
}