Your IP : 18.119.255.122


Current Path : /home/bitrix/ext_www/home-comfort.in.ua/local/modules/webprofy.offersgroup/lib/
Upload File :
Current File : /home/bitrix/ext_www/home-comfort.in.ua/local/modules/webprofy.offersgroup/lib/conflicts.php

<?php
namespace Webprofy\Offersgroup;


class Conflicts
{
    /**
     * @param $productID
     * @param bool $groupID
     * @return array
     * @throws \Bitrix\Main\ArgumentException
	 * Поиск групп по продуктам, с исключением текущией группы
     */
    protected static function searchGroupByProduct($productID, $groupID = false)
    {
        $filter = array(
            'VALUE_ID' => $productID,
            'VALUE_XML_ID' => 'product'
        );

        if($groupID){
            $filter['!GROUP_ID'] = $groupID;
        }

        return PropertiesTable::getList( array(
                'filter' => $filter,
                'select' => array(
                    'GROUP_ID'
                )
            )
        )->fetchAll();
    }


    /**
     * @param $groupID
     * @param $relationID
     * @param $arValue
     * @return array|bool
     * @throws \Bitrix\Main\ArgumentException
	 * Поиск свойств по фильтру группа, Id справочника из нашей таблицы связей, и массив значений id
     */
	public static function searchPropertyByFilter($groupID, $relationID, $arValue)
    {
        if(!$groupID || !$relationID || empty($arValue)) return false;

        $filter = array(
            'VALUE_ID' => $arValue,
            'GROUP_ID' => $groupID,
            'RELATION_ID' => $relationID,
        );


        $arProperty = array();
        $arResult = PropertiesTable::getList( array(
                'filter' => $filter,
                'select' => array(
                    'VALUE_ID'
                )
            )
        )->fetchAll();

        if(!empty($arResult)){
            foreach ($arResult as $item) {
                $arProperty[] = $item['VALUE_ID'];
            }
        }

        return $arProperty;
    }


    /**
     * @param $arProducts
     * @param $groupID
     * @return array
	 * Поиск групп по фильтру товарам для выбранной группы
     */
	public static function searchGroupId($arProducts, $groupID = false)
    {
        $productsGroup = array();
        foreach ($arProducts as $product) {
            $conflictsProductGroup = self::searchGroupByProduct($product, $groupID);

            if ($conflictsProductGroup) {
                foreach ($conflictsProductGroup as $group) {
                    if (!in_array($group['GROUP_ID'], $productsGroup)) {
                        $productsGroup[] = $group['GROUP_ID'];
                    }
                }
            }
        }

        return self::checkActiveGroup($productsGroup);
    }


    /**
     * @param $arGroup
     * @return array
     * @throws \Bitrix\Main\ArgumentException
	 * Проверяем активность группы
     */
    protected static function checkActiveGroup($arGroup)
    {
        $arActiveGroup = array();
        $arResult = MainTable::getList(array(
            'filter'=>array(
                'ID'=>$arGroup
            ),
            'select'=>array(
                'ID',
                'ACTIVE'
            )
        ));

        while($res = $arResult->fetch()){
            if(intval($res['ACTIVE']) > 0 ){
                $arActiveGroup[] = $res['ID'];
            }
        }

        return $arActiveGroup;
    }

	public static function prepareProperty($arProperty, $publicForm)
	{
		$arPropertyFormat = array();
		foreach($arProperty as $key => $item){
			if($publicForm){
				if(strrpos($key, 'reference') === false){
					continue;
				}
			}

			$referenceID = preg_replace('/[^0-9]/', '', $key);
			if(!empty($item)){
				$arPropertyFormat[$referenceID] = $item;
			}
		}

		$arProperty = array();
		$keys = array_keys($arPropertyFormat);
		sort($keys);
		for ($i=0; $i<count($keys); $i++){
			if (isset($arPropertyFormat[$keys[$i]])){
				$arProperty[$keys[$i]] = $arPropertyFormat[$keys[$i]];
			}
		}
		return $arProperty;
	}


	public static function isConflict($groupID, $arProducts, $arProperty, $publicForm = false)
    {
        if(!$groupID || empty($arProducts) || empty($arProperty)) return false;


        if($arProperty){
			$arProperty = self::prepareProperty($arProperty, $publicForm);
			$productsGroup = self::searchGroupId($arProducts, $groupID);
            if (!empty($productsGroup)) {
                $arConflicts = array();
				foreach($productsGroup as $group){
					$compareGroupProperty = OffersGroupMain::getPropertiesID($group);

					//Проверяем задействованные справочников в группе. Сравнение есть смысл продолжать, только если они совпадают
					if(array_keys($compareGroupProperty) != array_keys($arProperty)){
						continue;
					}

					//Ищем пересечения по матрице свойств
					$intersect = array_map(function($k1, $v1, $v2){
						return [$k1 => array_intersect($v1, $v2)];
					}, array_keys($arProperty), $arProperty, $compareGroupProperty);

					//Убираем лишнюю вложенность
					$result = array();
					foreach($intersect as $innerArray){
						foreach($innerArray as $key => $value){
							if(!empty($value)){
								sort($value);
								$result[$key] = $value;
							}
						}
					}
					//Если есть результат
					if(!empty($result) && (count($result) == (count($arProperty)))){
						$arConflicts[$group] = $result;
					}
				}
            }
        }

        return $arConflicts ? $arConflicts : false;
    }


    public static function isConflictsDeleted($arPropertyID, $arPropertyName, $isForm = false)
    {
        if(!is_array($arPropertyID) || empty($arPropertyID) || !is_array($arPropertyName) || empty($arPropertyName)){
            return;
        }

        $arResult = [];

        foreach ($arPropertyID as $referenceKey => $item) {
            $item = array_flip($item);
            if($isForm){
                $res = array_diff_key($item, $arPropertyName[$referenceKey]['DATA']);
            }else{
                $res = array_diff_key($item, $arPropertyName[$referenceKey]);
            }

            if(!empty($res)){
                $arResult[$referenceKey] =  array_flip($res);
            }
        }

        return $arResult;
    }

}