Files
ltsecurityinc/app/code/Amasty/HidePrice/Helper/Data.php
T

564 lines
17 KiB
PHP
Executable File

<?php
/**
* @author Amasty Team
* @copyright Copyright (c) Amasty (https://www.amasty.com)
* @package Hide Price (Call for Price) for Magento 2
*/
namespace Amasty\HidePrice\Helper;
use Amasty\HidePrice\Model\Source\HideButton;
use Lts\Customer\Model\Netsuite\Status;
use Magento\Catalog\Api\Data\ProductInterface;
use Magento\Catalog\Model\Product;
use Magento\Catalog\Model\ResourceModel\Category\CollectionFactory;
use Magento\Framework\UrlInterface;
use Magento\Store\Model\ScopeInterface;
use Magento\Framework\DataObject;
use Amasty\HidePrice\Model\Source\ReplaceButton;
class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
public const ROOT_CATEGORY_ID = 1;
public const NOT_LOGGED_KEY = '00';
public const DISABLED_GROUP_KEY = -1;
public const HIDE_PRICE_DATA_ROLE = 'data-role="amhideprice-hide-button"';
public const HIDE_PRICE_POPUP_IDENTIFICATOR = 'AmastyHidePricePopup';
/**
* @var string
*/
protected $currentCustomerGroup;
/**
* @var array
*/
protected $matchedCategories;
/**
* @var array
*/
protected $cache = [];
/**
* @var CollectionFactory
*/
private $categoryCollectionFactory;
/**
* @var \Magento\Store\Model\StoreManagerInterface
*/
private $storeManager;
/**
* @var \Magento\Framework\Json\EncoderInterface
*/
private $jsonEncoder;
/**
* @var \Magento\Customer\Model\SessionFactory
*/
private $sessionFactory;
/**
* @var \Magento\Framework\Filter\FilterManager
*/
private $filterManager;
/**
* @var \Magento\Customer\Model\Url
*/
private $customerUrl;
public function __construct(
\Magento\Framework\App\Helper\Context $context,
\Magento\Customer\Model\SessionFactory $sessionFactory,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Framework\Json\EncoderInterface $jsonEncoder,
CollectionFactory $categoryCollectionFactory,
\Magento\Framework\Filter\FilterManager $filterManager,
\Magento\Customer\Model\Url $customerUrl
) {
parent::__construct($context);
$this->categoryCollectionFactory = $categoryCollectionFactory;
$this->storeManager = $storeManager;
$this->jsonEncoder = $jsonEncoder;
$this->sessionFactory = $sessionFactory;
$this->currentCustomerGroup = $this->getCustomerSession()->getCustomerGroupId();
if (!$this->currentCustomerGroup) {
$this->currentCustomerGroup = self::NOT_LOGGED_KEY;
}
$this->filterManager = $filterManager;
$this->customerUrl = $customerUrl;
}
private function getCustomerSession()
{
return $this->sessionFactory->create();
}
public function getModuleConfig(string $path): string
{
return (string)$this->scopeConfig->getValue('amasty_hide_price/' . $path, ScopeInterface::SCOPE_STORE);
}
/**
* @return bool
*/
public function isModuleEnabled()
{
return $this->getModuleConfig('general/enabled') && $this->isModuleOutputEnabled();
}
/**
* @param ProductInterface $product
* @return bool
*/
public function isApplied(ProductInterface $product)
{
if (!$this->isModuleEnabled()) {
return false;
}
if (!$this->issetCachedResult($product->getId())) {
/* Checking settings by product and customer group. Order is important.*/
$result = $this->checkGlobalSettings($product);
$result = $this->checkStockStatus($result, $product);
$result = $this->checkCategorySettings($result, $product);
$result = $this->checkProductSettings($result, $product);
$result = $this->checkIgnoreSettings($result, $product);
// $result = $this->checkByNetsuiteStatus($result);
/* save result to cache for multiple places: price button add to wishlist and other*/
$this->saveResultToCache($result, $product->getId());
} else {
$result = $this->getResultFromCache($product->getId());
}
return $result;
}
/**
* Checking module setting and output
* @param ProductInterface $product
* @return bool
*/
public function isNeedHideProduct(ProductInterface $product)
{
$isConfigEnabled = $this->getModuleConfig('information/hide_price')
|| $this->getHideAddToCart();
return $isConfigEnabled && $this->isApplied($product);
}
/**
* @return int
*/
public function getHideAddToCart()
{
return (int)$this->getModuleConfig('information/hide_button');
}
/**
* @return bool
*/
public function getHideWishlist()
{
return (bool)$this->getModuleConfig('information/hide_wishlist');
}
/**
* Hide Price depend on selected categories and customer groups in configuration
* @param ProductInterface $product
* @return bool
*/
private function checkGlobalSettings(ProductInterface $product)
{
$result = false;
$settingCustomerGroup = $this->convertStringSettingToArray('general/customer_group');
if (in_array($this->currentCustomerGroup, $settingCustomerGroup)) {
$productCategories = $product->getCategoryIds();
$settingCategories = $this->convertStringSettingToArray('general/category');
//check for root category - hide price for all
$result = in_array(self::ROOT_CATEGORY_ID, $settingCategories)
|| count(array_uintersect($productCategories, $settingCategories, "strcmp")) > 0
? true: false;
}
return $result;
}
/**
* Plugin in stock status must work
*
* @param $result
* @param ProductInterface $product
*
* @return bool
*/
public function checkStockStatus($result, ProductInterface $product)
{
return $result;
}
/**
* Hide Price depend on selected individual category settings
* @param $result
* @param ProductInterface $product
* @return bool
*/
private function checkCategorySettings($result, ProductInterface $product)
{
$productCategories = $product->getCategoryIds();
if (!$this->matchedCategories) {
/* get categories only with not empty attributes customer_gr_cat and mode_cat */
$collection = $this->categoryCollectionFactory->create()
->addAttributeToSelect('am_hide_price_mode_cat')
->addAttributeToSelect('am_hide_price_customer_gr_cat')
->addAttributeToFilter('am_hide_price_mode_cat', ['notnull' => true])
->addAttributeToFilter('am_hide_price_customer_gr_cat', ['notnull' => true]);
$this->matchedCategories = $collection->getData();
}
if (!empty($this->matchedCategories)) {
foreach ($this->matchedCategories as $category) {
if (!in_array($category['entity_id'], $productCategories)) {
continue;
}
$customerGroups = $this->trimAndExplode($category['am_hide_price_customer_gr_cat']);
if (in_array($this->currentCustomerGroup, $customerGroups)) {
$result = !(bool)$category['am_hide_price_mode_cat'];
}
}
}
return $result;
}
/**
* Hide Price depend on selected individual product settings
* @param $result
* @param ProductInterface $product
* @return bool
*/
private function checkProductSettings($result, ProductInterface $product)
{
$mode = $product->getData('am_hide_price_mode');
$customerGroups = $product->getData('am_hide_price_customer_gr');
if ($mode !== null && $customerGroups) {
$customerGroups = $this->trimAndExplode($customerGroups);
if (in_array($this->currentCustomerGroup, $customerGroups)) {
$result = !(bool)$mode;
}
}
return $result;
}
private function checkByNetsuiteStatus($result)
{
$customerSession = $this->getCustomerSession();
if ($customerSession->isLoggedIn()) {
$customer = $customerSession->getCustomer();
$dataCustomer = $customer->getDataModel();
$netsuiteStatus = $dataCustomer->getExtensionAttributes()?->getNetsuiteStatus();
$netsuiteStatus = $netsuiteStatus? strtolower($netsuiteStatus):'';
if (in_array($netsuiteStatus, Status::getApprovedStatuses())) {
$result = true;
}
}
$result = false;
return $result;
}
/**
* Check ignore settings - the most important
* @param $result
* @param ProductInterface $product
* @return bool
*/
private function checkIgnoreSettings($result, ProductInterface $product)
{
$currentCustomerId = $this->getCustomerSession()->getCustomerId();
if ($currentCustomerId) {
$ignoredCustomers = $this->convertStringSettingToArray('general/ignore_customer');
if (in_array($currentCustomerId, $ignoredCustomers)) {
return false;
}
}
$ignoredProductIds = $this->convertStringSettingToArray('general/ignore_products');
if (in_array($product->getId(), $ignoredProductIds)) {
return false;
}
return $result;
}
/**
* Generate button html depend on module configuration
* @param $product
* @return string
*/
public function getNewPriceHtmlBox($product)
{
$priceBox = $this->getPriceBox();
// help for magento swatches detect category page
$html = sprintf('<div class="%s" data-product-id="%d"></div>', $priceBox, $product->getId());
$text = $this->filterManager->stripTags(
$this->getModuleConfig('frontend/text'),
[
'allowableTags' => null,
'escape' => true
]
);
$image = $this->getModuleConfig('frontend/image');
if ($text || $image) {
$href = $this->getModuleConfig('frontend/link');
if ($href) {
if ($href == self::HIDE_PRICE_POPUP_IDENTIFICATOR) {
$tag = $this->generatePopup($product);
} else {
$href = $this->checkLoginUrl($href);
$tag = '<a href="' . $href . '" ';
}
$closeTag = '</a>';
} else {
$tag = '<div ';
$closeTag = '</div>';
}
$customStyles = $this->getModuleConfig('frontend/custom_css');
if ($customStyles) {
$customStyles = 'style="' . $customStyles . '"';
}
$html .= $tag . ' class="amasty-hide-price-container" ' . $customStyles . '>';
if ($image) {
$mediaPath = $this->storeManager->getStore()->getBaseUrl(UrlInterface::URL_TYPE_MEDIA);
$image = $mediaPath . '/amasty/hide_price/' . $image;
$html .= '<img class="amasty-hide-price-image" src="' . $image .'">';
}
if ($text) {
$html .= '<span class="amasty-hide-price-text">' . $text . '</span>';
}
$html .= $closeTag;
}
return $html;
}
private function getPriceBox(): string
{
//fix dropdown in configurable product
return $this->_request->getControllerName() !== 'product' ? 'price-box price-final_price'
: 'price-final_price';
}
/**
* @param string $href
*
* @return string|string
*/
protected function checkLoginUrl(string $href)
{
if (strpos($href, 'customer/account/login') !== false) {
$href = $this->customerUrl->getLoginUrl();
}
return $href;
}
/**
* Generate button replacement html
* @param Product|null $product
* @param array|null $productData
* @return string
*/
public function getNewAddToCartHtml($product = null, $productData = null)
{
// help for magento swatches detect category page
$result = '';
if ($this->getModuleConfig('information/hide_button') == HideButton::REPLACE_WITH_NEW_ONE) {
$text = strip_tags($this->getModuleConfig('information/replace_text'));
$link = $this->getModuleConfig('information/replace_link') ?: '';
if (!$product && isset($productData['id'])) {
$product = new DataObject([
'id' => $productData['id'],
'name' => $productData['name']
]);
}
switch ($this->getModuleConfig('information/replace_with')) {
case ReplaceButton::REDIRECT_URL:
$href = $this->checkLoginUrl((string)$this->getModuleConfig('information/redirect_link'));
$href = $href ?: '#';
$tag = '<a href="' . $href . '"';
break;
case ReplaceButton::HIDE_PRICE_POPUP:
case ReplaceButton::CUSTOM_FORM:
$tag = $this->generatePopup($product);
break;
}
$styles = strip_tags($this->getModuleConfig('information/replace_css'));
$styles = $styles ? ' style="' . $styles . '"' : '';
$result .= sprintf(
'%s class="amasty-hide-price-button" %s><span>%s</span></a>',
$tag,
$styles,
$text
);
}
return $result;
}
/**
* generate Js code for Get a Quote Form
* @param Product|DataObject $product
* @return string
*/
private function generateFormJs($product)
{
$js = '<script>';
$js .= 'require([
"jquery",
"Amasty_HidePrice/js/amhidepriceForm"
], function ($, amhidepriceForm) {
amhidepriceForm.addProduct(' . $this->generateFormConfig($product) . ');
});';
$js .= '</script>';
return $js;
}
private function generateFormConfig($product)
{
$customer = $this->getCustomerSession()->getCustomer();
return $this->jsonEncoder->encode([
'url' => $this->_getUrl('amasty_hide_price/request/add'),
'id' => $product->getId(),
'name' => $product->getName(),
'customer' => [
'name' => $customer->getName(),
'email' => $customer->getEmail(),
'phone' => $customer->getPhone()
]
]);
}
private function convertStringSettingToArray($name)
{
$setting = $this->getModuleConfig($name);
$setting = $this->trimAndExplode($setting);
return $setting;
}
/**
* @param $string
* @return array
*/
private function trimAndExplode($string): array
{
$string = str_replace(' ', '', (string) $string);
return $string ? explode(',', $string) : [];
}
/**
* @param $productId
* @return bool
*/
private function issetCachedResult($productId)
{
if (!array_key_exists($this->currentCustomerGroup, $this->cache)) {
return false;
}
return array_key_exists($productId, $this->cache[$this->currentCustomerGroup]);
}
/**
* @param $productId
* @return mixed
*/
private function getResultFromCache($productId)
{
return $this->cache[$this->currentCustomerGroup][$productId];
}
/**
* @param $result
* @param $productId
*/
private function saveResultToCache($result, $productId)
{
if (!array_key_exists($this->currentCustomerGroup, $this->cache)) {
$this->cache[$this->currentCustomerGroup] = [];
}
$this->cache[$this->currentCustomerGroup][$productId] = $result;
}
/**
* @return bool
*/
public function isGDPREnabled()
{
return (bool)$this->getModuleConfig('gdpr/enabled');
}
/**
* @return string
*/
public function getGDPRText()
{
return $this->filterManager->stripTags(
$this->getModuleConfig('gdpr/text'),
[
'allowableTags' => '<a>',
'escape' => false
]
);
}
/**
* @param Product|DataObject $product
* @return string
*/
private function generatePopup($product)
{
$popupHtml = $this->generateFormJs($product)
. '<a data-product-id="' . $product->getId() . '" data-amhide="'
. self::HIDE_PRICE_POPUP_IDENTIFICATOR . '" ';
return $popupHtml;
}
/**
* @return bool
*/
public function isCustomFormOn()
{
return $this->_moduleManager->isEnabled('Amasty_Customform');
}
/**
* Checking module setting and output
* @param ProductInterface $product
* @return bool
*/
public function isNeedHidePrice(ProductInterface $product)
{
return $this->getModuleConfig('information/hide_price') && $this->isApplied($product);
}
}