<?php
/*------------------------------------------------
 * Загрузчик YML 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 ('Конфігураційний файл не знайден0');
}

include_once($config_file);


$title = "Синхронізація з 1С v.8x - модифікації у файлі offers.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';
		if (is_file('tmp/offers.xml')){
			$offers_file = 'tmp/offers.xml';
		}else{
			die("Помилка: Файл 'tmp/offers.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';
			if (!is_file('../'.config_get('hs_loader_1c_dir').'/offers.xml')){
				die("Помилка: Файл ".config_get('hs_loader_1c_dir')."/offers.xml не знайдено");
			}else{
				$offers_file = '../'.config_get('hs_loader_1c_dir').'/offers.xml';
			}
		}
	}
	
/////////////////////////////// обработка со считываем всего файла

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

	echo "Всього товарів у файлі import.xml ".$productsCount." <br/><br/>\r\n";
	echo "<hr/>\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);
		
	}
	
	$products = $products_data = 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->Наименование;
		$id = (string)$item->Ид;
		
		$products_data[$id]['name'] = $name;
		$products_data[$id]['cat_name'] = $cat_name;
		
		$products1[] = "<tr><td>$cat_name</td><td>$name</td></tr>\r\n";
	
	}
	
	unset($products);
	
	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);
		}
	}
	
	echo "<br/><hr/><br/>\r\n";
	
	// offers.xml
	
	$size_offers = filesize($offers_file);
	
	echo "Обробляється файл $offers_file<br/>\r\n";
	echo "Розмір файлу $size_offers <br/>\r\n";
	
	$data = simplexml_load_file($offers_file);
	
	if ($data === false){
		echo("Помилка: файл '$offers_file' не може бути оброблений як файл XML");
		die;
	}
	
	$productsCount = count($data->ПакетПредложений->Предложения->Предложение);


	echo "Всього товарів у файлі offers.xml ".$productsCount." <br/>\r\n";
	echo "<hr/><br/>\r\n";

	// Типы цен
	$price_types = array();
	if ($data->ПакетПредложений->ТипыЦен->ТипЦены) {
		foreach ($data->ПакетПредложений->ТипыЦен->ТипЦены as $type) {
			$price_types[(string)$type->Ид] = (string)$type->Наименование;
		}
		echo("Є такі Типы цен:"." <br/>\r\n");
		foreach ($price_types as $id_1c => $price_type){
			echo("'$price_type'"." <br/>\r\n");
		}
	}else{
		echo("Помилка: в файлі 'offers.xml' немає інформації про ціни товарів - тега 'ТипЦены'"." <br/><br/>\r\n");
	}

	echo "<center>\r\n";

	
	$modifications = array();
	$modifications_by_cat = array();
	
	$items = $data->ПакетПредложений->Предложения;

	foreach ($items->children() as $item){
		
		$id_1c = (string)$item->Ид;
		
		if (strpos($id_1c, '#') !== false){

			list($id_1c, $dummy) = explode('#', $id_1c);
			
			if (isset($products_data[$id_1c])){
			
				$name = (string)$item->Наименование;
				$cat_name = $products_data[$id_1c]['cat_name'];
		// 		$article = (string)$item->Артикул;
				
				// атрибуты из файла
				$attr_data = array();
					
				if (isset($item->ХарактеристикиТовара->ХарактеристикаТовара)){
					if (count($item->ХарактеристикиТовара->ХарактеристикаТовара) > 1){
						
						foreach ($item->ХарактеристикиТовара->ХарактеристикаТовара as $option){
							$option_name = (string)$option->Наименование;
							$modifications[$option_name][(string)$option->Значение] = 1;
							$modifications_by_cat[$cat_name][$option_name] = $name;
						}
						
					}else{
						$option_name = (string)$item->ХарактеристикиТовара->ХарактеристикаТовара->Наименование;
						$modifications[$option_name][(string)$item->ХарактеристикиТовара->ХарактеристикаТовара->Значение] = 1;
						$modifications_by_cat[$cat_name][$option_name] = $name;
					}
					
					$products_data[$id_1c]['modification_name'][] = $name;
				}
			}
		}
	}

	ksort($modifications_by_cat);
	
// 	$modifications1 = array();
// 	// пересчет товаров по категориям
// 	foreach ($modifications_by_cat as $cat_postav => $product_data){
// 		foreach ($product_data as $option_name => $dummy){
// 			$modifications1[$cat_postav][$option_name] = $group_id;
// 			}
// 		}
// 	}
	
	
?>

<h2>Модификації</h2>
<table width="90%" border="1" style="border-collapse:collapse;border-color:black;">
<tr>
<th>Категорія</th>
<th>Назва характеристики у файлі</th>
</tr>

<?php 

foreach ($modifications_by_cat as $cat_postav => $option_name_array){
		ksort($option_name_array);
		foreach ($option_name_array as $option_name => $name){
?>

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

<h1>Значення характеристик (довідково)</h1>

<?php 
	ksort($modifications);

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

<?php 
		ksort($values_array);
		
		foreach ($values_array as $value => $dummy){
			echo $value.'<br/>';
		}
	}
?>
<center>
<h2>Товары</h2>
<table width="90%" border="1" style="border-collapse:collapse;border-color:black;">
<tr>
<th>Назва товару</th>
<th>Назва модифікації</th>
</tr>
<?php 
	
foreach ($products_data as $id_1c => $product_data){
	
	$product_name = $product_data['name'];
	
	if (isset($product_data['modification_name'])){
		$modifacations = $product_data['modification_name'];
		
		asort($modifacations);
	
?>
<tr>
<td><?php echo $product_name?></td>
<td><?php 

		$delimiter = '';
		foreach ($modifacations as $modification_name){
			echo $delimiter.$modification_name;
			$delimiter = '<br/>';
		}

?></td>
</tr>
<?php 	

	}else{
?>		
<tr>
<td><?php echo $product_name?></td>
<td>-</td>
</tr>
<?php 
	}
}

?>
</table>
</center>
</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;
		}
	}
}