<?php
/*------------------------------------------------
 * Загрузчик 1C to Хорошоп				2026-12-12
 * Copyright © FinBoss 2026
 * finboss.ua@gmail.com 
 *
 * просмотр характеристик по категориям 
 *
 * License: Commercial open source software (COSS) 
 *------------------------------------------------
 */

@set_time_limit(0);

error_reporting (E_ALL);

header('Content-Type: text/html; charset=utf-8');

// контроль доступа по IP
$a_allow = false;
$a_ips = '';
if (is_file('.allowed_ip')){
	$a_ips = file('.allowed_ip');
}elseif (is_file('../.allowed_ip')){
	$a_ips = file('../.allowed_ip');
}

if (is_array($a_ips)){
	foreach ($a_ips as $a_ip){
		$a_ip = trim($a_ip);
		if (strpos($a_ip, '*') !== false){
			
			// process 127.0.*.*
			
			$remote = explode('.', $_SERVER['REMOTE_ADDR']);
			$a = explode('.', $a_ip);
			
			$true_count = 0;
			for ($i=0;$i<4;$i++){
				switch ($i){
					case 0:
					case 1:
						if ($remote[$i] != $a[$i]){
							break 2;
						}else{
							$true_count++;
						}
						break;
					case 2:
					case 3:
						if ($a[$i] == '*'){
							// пропускаем
							$true_count++;
						}else{
							if ($remote[$i] != $a[$i]){
								break 2;
							}else{
								$true_count++;
							}
						}
						
				}
			}
			if ($true_count == 4){
				$a_allow = true;
				break;
			}
			
		}else{
			if ($_SERVER['REMOTE_ADDR'] == trim($a_ip)){
				$a_allow = true;
				break;
			}
		}
	}
	
}
if ($a_allow === false){
	die('доступ для IP '.$_SERVER['REMOTE_ADDR'].' заблоковано');
}


date_default_timezone_set ('Europe/Kiev');

// имя файла
$d = dir(".");

$config_file = '';

while (false !== ($entry = $d->read())) {
	if ($entry != ".")
		if ($entry != "..")
			if (strpos($entry, '.cfg.') !== false){
				$config_file = $entry;
				break;
			}
}
$d->close();

if ($config_file == ''){
	die ('Конфігураційний файл не знайдено');
}

include_once($config_file);

$title = "Синхронізація з 1С v.8x - характеристики у файлі import.xml";
	
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" >
<title><?php echo $title?></title>
</head>
<body style="font-family:Trebuchet MS; font-size: 10pt;" bgcolor="#f5f8fb">

<table width="100%" bgcolor="#416e98">
<tr valign="middle">
<td><span style="font-size:25px; color:#FFF; font-family:Trebuchet MS"><?php echo $title?></span></td>
<td align="right"><span style="font-size:15px; color:#FFF; font-family:Trebuchet MS"></span></td>
</tr>
</table>

<?php 

	if (is_file('tmp/import.xml')){
		$import_file = 'tmp/import.xml';
	}else{
		if (!is_file('../'.config_get('hs_loader_1c_dir').'/import.xml')){
			die("Помилка: Файл ".config_get('hs_loader_1c_dir')."/import.xml не знайдено");
		}else{
			$import_file = '../'.config_get('hs_loader_1c_dir').'/import.xml';
		}
	}
		
	$size = filesize($import_file);
		
	
/////////////////////////////// обработка со считываем всего файла

	$data = simplexml_load_file($import_file);
	
	if ($data === false){
		echo("Помилка: файл '$import_file' не може бути оброблений як файл XML");
		die;
	}
	
	// всего товаров
	$productsCount = count($data->Каталог->Товары->Товар);
	
	echo "<br/><center>\r\n";
	echo "Використовується  файл $import_file<br/>\r\n";
	echo "Розмір файлу $size <br/>\r\n";
	echo "Всього товарів ".$productsCount." <br/><br/>\r\n";
	echo "<hr/>\r\n";
	echo "</center>\r\n";

	// категории файла
	$categoriesCount = count($data->Классификатор->Группы->Группа);
	if ($categoriesCount == 0){
		die("Помилка: в файлі 'import.xml' немає відомостей про категорії (Групи) 1С");
	}
	
	// считываем категории из файла
	$parents = array();
	import_categories($data->Классификатор);
	
	foreach ($cat_root as $id => $name){
		$categories_1c[$id] = $name;
		get_tree($id, $name);
		
	}
	
	echo("<br/>Всього категорій в файлі 'import.xml' ".count($categories_1c));
	
	if (config_get('hs_loader_1c_show_1c_categories') == true){
		asort($categories_1c);
		foreach ($categories_1c as $key => $value){
			echo('<br/>'.$value);
		}
	}

	// обрабатываемые тэги
	$import_tags_textarea = config_get('hs_loader_import_tags');
	if (trim($import_tags_textarea) == ''){
		$import_tags_textarea='ЗначенияСвойств/r/nЗначенияРеквизитов/r/nХарактеристикиТовара'; //Список обрабатываемых тэгов, содержащих характеритики и опции
	}
	$import_tags = array();
	if (trim($import_tags_textarea) != ''){
		$import_tags_array = explode('/r/n', $import_tags_textarea);
		foreach ($import_tags_array as $string){
			if (trim($string) != ''){
				$import_tags[] = trim($string);
			}
		}
	}
	echo '<br/><br/>Аналізуються теги';
	foreach ($import_tags as $string){
		echo '<br/>'.$string;
	}
	
	$features_mapping = $features_names = array();
	
	if($data->Классификатор->Свойства){
		
		$property = $data->Классификатор->Свойства;
		
		if ($property->СвойствоНоменклатуры){
			foreach ($property->СвойствоНоменклатуры as $xml_feature){
				
				$feature_name = strval($xml_feature->Наименование);
				$feature_id = strval($xml_feature->Ид);
				$features_names[$feature_id] = $feature_name;
				
				if (isset($xml_feature->ТипыЗначений->ТипЗначений->ВариантыЗначений)){
					
					foreach ($xml_feature->ТипыЗначений->ТипЗначений->ВариантыЗначений->ВариантЗначения as $feature_value){
						
						$feature_value_id = strval($feature_value->Ид);
						$feature_value_value = strval($feature_value->Значение);
						
						$features_mapping[$feature_id][$feature_value_id] = $feature_value_value;
					}
				}
			}
		}
		
		if ($property->Свойство){
			foreach ($property->Свойство as $xml_feature){
				
				$feature_name = strval($xml_feature->Наименование);
				$feature_id = strval($xml_feature->Ид);
				$features_names[$feature_id] = $feature_name;
				
				if ($xml_feature->ВариантыЗначений){
					
					foreach ($xml_feature->ВариантыЗначений->Справочник as $feature_value){
						
						$feature_value_id = strval($feature_value->ИдЗначения);
						$feature_value_value = strval($feature_value->Значение);
						
						$features_mapping[$feature_id][$feature_value_id] = $feature_value_value;
					}
				}
			}
		}
		
	}

	$parameters_in_file = array();
	$products = $values = $names = array();
	
	$products = $data->Каталог->Товары;
	$count_p = count($products->Товар);
	unset($data);
	
	for ($p=0;$p<$count_p;$p++){
		
		$item = $products->children()->Товар[$p];
		
		$product_categories  = array();

		if (count($item->Группы->Ид) > 1){
			foreach ($item->Группы->Ид as $group){
				$categoryId = (string)$group;
				if (isset($categories_1c_to_job[$categoryId])){
					$product_categories[] = $categories_1c[$categoryId];
				}
			}
		}else{
			$categoryId = (string)$item->Группы->Ид;
			if (isset($categories_1c[$categoryId])){
				$product_categories[] = $categories_1c[$categoryId];
			}
		}

		$cat_name = $product_categories[0];
		
// 		$vendorCode = (string)$item->vendorCode;
		$name  = (string)$item->Наименование;
		
		$products1[] = "<tr><td>$cat_name</td><td>$name</td></tr>\r\n";
		
		foreach ($import_tags as $import_tag){
			
			if (isset($item->$import_tag)){
				
				$svoistva = $item->$import_tag;

				if (count($svoistva->children()) > 0){
					
					foreach ($svoistva->children() as $svoistvo){
						
						$feature_id = (string)$svoistvo->Ид;
						
						if (isset($features_names[$feature_id])){
							$feature_name = $features_names[$feature_id];
							
							if ((string)$svoistvo->Значение != ''){
								if (isset($features_mapping[$feature_id][(string)$svoistvo->Значение])){
									$value = $features_mapping[$feature_id][(string)$svoistvo->Значение];
								}else{
									$value = (string)$svoistvo->Значение;
								}
								if (!isset($parameters_in_file[$cat_name][$feature_name])){
									$parameters_in_file[$cat_name][$feature_name] = $value;
								}
								$values[$feature_name][$value] = 1;
							}
						}
					}
				}
			}
		}
	}

	
	ksort($parameters_in_file);
	
?>
<center>
<h2>Характеристики</h2>
<table width="90%" border="1" style="border-collapse:collapse;border-color:black;">
<tr>
<th>Категорія</th>
<th>Найменування характеристики у файлі</th>
</tr>

<?php 
	$checkbox_count = 0;

	foreach ($parameters_in_file as $cat_postav => $parameters_in_cat){
		
		ksort($parameters_in_cat);
		
		foreach ($parameters_in_cat as $parameter_name => $dummy){
		
			if (isset($parameters[$cat_postav.'_'.$parameter_name])){
				$checked = ' checked ';
			}else{
				$checked = '';
			}
		
			$checkbox_count++;
?>

<tr>
<td>^<?php echo $cat_postav ?></td>
<td><?php echo $parameter_name?></td>
</tr>
<?php
		}
	}
?>
</table>
</center>

<h1>Значення параметрів (довідково)</h1>

<?php 
	ksort($values);

	foreach ($values as $param_name => $values_array){
?>
<h2><?php echo $param_name; ?></h2>

<?php 
		ksort($values_array);
		
		foreach ($values_array as $value => $dummy){
			echo $value.'<br/>';
		}
	}
?>
<h2>Товары</h2>
<?php 
sort($products1);

echo '<table width="95%" border="1" style="border-collapse:collapse;border-color:black;">'."\r\n";
echo "<tr><th>Категорія</th><th>Найменування</th></tr>\r\n";
foreach ($products1 as $product){
	echo $product;
}

echo '</table>';

?>
</body>
</html>
<?php 

function config_get($key){
	
	global $config;
	
	if (isset($config[$key])){
		return $config[$key];
	}else{
		
		$data = file('horoshop_loader_1c_uk.cfg.php', FILE_IGNORE_NEW_LINES);
		
		foreach ($data as $string){
			if ($string[0] == '$'){
				list($parameter, $comment) = explode('//', $string);
				list($variable, $value) = explode('=', trim($parameter), 2);
				$value = substr(trim($value), 0, -1);  // удаляем ;
				$value = str_replace("'", '', trim($value));
				$value = str_replace('&#039;', "\'", $value);
				if (strpos($variable, '_textarea') == false){
					if (strpos($variable, 'oc_loader_1c_option_') == false){
						if (strpos($variable, '_bool') == false){
							$config[substr($variable, 1)] = $value;
						}else{
							if ($value == 'true'){
								$config[str_replace('_bool', '', substr($variable, 1))] = 1;
							}else{
								$config[str_replace('_bool', '', substr($variable, 1))] = 0;
							}
						}
					}else{
						$config['oc_loader_1c_option_'.$value] = $value;
					}
				}else{
					$base = str_replace('_textarea', '', substr($variable, 1));
					$config[$base] = $value;
				}
			}
		}
		
		$config['hs_loader_1c_dir']='20261210/input'; //Путь к папке с входными файлами
		
		$config['send_quantity'] = 1;   // $send_quantity_bool=true; //Передавати на сайт кількість товарів
		
		if (isset($config[$key])){
			return $config[$key];
		}else{
			die("Помилка: не знайдено параметр '$key'");
		}
	}
}


function import_categories($xml, $parent_id = ''){
	
	global $cat_root, $cat_names, $parents, $categories_1c;
	
	// построение дерева
	if (isset($xml->Группы->Группа)){
		
		if (count($xml->Группы->Группа) > 1){
			
			foreach ($xml->Группы->Группа as $xml_group){
				
				$parentId 	= $parent_id;
				$id 		= (string)$xml_group->Ид;
				$category 	= (string)$xml_group->Наименование;
				
				if ($parentId != ''){
					$parents[$id] = $parentId;
				}else{
					$cat_root[$id] = $category;
				}
				$cat_names[$id] = $category;
				
				import_categories($xml_group, $id);
			}
			
		}else{
			
			$parentId 	= $parent_id;
			$id 		= (string)$xml->Группы->Группа->Ид;
			$category 	= (string)$xml->Группы->Группа->Наименование;
			
			if ($parentId != ''){
				$parents[$id] = $parentId;
			}else{
				$cat_root[$id] = $category;
			}
			$cat_names[$id] = $category;
			
			import_categories($xml->Группы->Группа, $id);
			
			
		}
	}
}

function get_tree($parent, $parent_name){
	
	global $cat_names, $parents, $categories_1c;
	
	while (true){
		$found = false;
		foreach ($parents as $id => $parentId){
			if ($parentId == $parent){
				$categories_1c[$id] = $parent_name.'>'.$cat_names[$id];
				unset($parents[$id]);
				get_tree($id, $parent_name.'>'.$cat_names[$id]);
				$found = true;
				break;
			}
		}
		if(!$found){
			break;
		}
	}
}