<?php 
/**
 * Система управления сайтом HostCMS v. 5.xx
 * Copyright © 2005-2008 ООО "Хостмэйк" (Hostmake LLC), http://www.hostcms.ru
 *
 * Форма для загрузки прайс-листов (2 из 2) cml.
 * 
 * Файл: /admin/shop/action/import_price_list_load_form_step_two_cml.php
 * 
 * @author Hostmake LLC
 * @version 5.2
 */
$kernel = & singleton('kernel');

$array_of_cml_data = array();

$shop = new shop();
// Получаем структурированный массив данных из CommerceML файла
$array_of_cml_data = $kernel->Xml2Array(file_get_contents($floadfile));
$import_price_action_items = to_int($_REQUEST['import_price_action_items']);

// Удаляем временный файл
if (is_file($floadfile))
{
	@unlink($floadfile);
}

// Проверяем флаг действия с существующими товарами
if ($import_price_action_items == 0)
{
	// Если флаг действия равен 0, значит нужно удалить все товары перед импортом
	$shop->DeleteAllItemsCatalogAndGroups($shop_shops_id);
}

function GenCmlId($shop_groups_id)
{
	if (!is_int($shop_groups_id))
	{
		return $shop_groups_id;
	}

	$temp = 'ID';

	$shop_groups_id = to_str($shop_groups_id);

	$len = 8 - strlen($shop_groups_id);

	for ($i = 0; $i < $len; $i++)
	{
		$temp .= '0';
	}

	return $temp .= $shop_groups_id;
}

$count_insert_item = 0;

$count_update_item = 0;

$count_dir = 0;

/* Идентификатор магазина */
$shop_shops_id = to_int($_REQUEST['shop_shops_id']);

// Выбираем данные о магазине
$row_shop = $shop->GetShop($shop_shops_id);


if (!$row_shop)
{
	show_error_message($GLOBALS['MSG_shops']['error_show_group']);
	do_html_footer_admin();
}

// Наименование магазина
$shop_name = htmlspecialchars($row_shop['shop_shops_name']);


ob_start();
///
if (isset($array_of_cml_data['children'][0]))
{
	$array_of_cml_data = $array_of_cml_data['children'][0];

	// Есть узел "КоммерческаяИнформация" и у нее есть хотя бы 1 ребенок
	if (isset($array_of_cml_data['name'])
	&& $array_of_cml_data['name'] == 'КоммерческаяИнформация'
	&& isset($array_of_cml_data['children']))
	{
		// Ищем дочерний узел с именем "Каталог"
		foreach ($array_of_cml_data['children'] as $number => $metadata)
		{
			if (isset($metadata['name'])
			&& $metadata['name'] == 'Каталог' && isset($metadata['children']))
			{
				$new_group_array = array();
				$new_group_array_tree = array();
				$h = 0;
				// Строим дерево групп
				foreach ($metadata['children'] as $c_number => $c_metadata)
				{
					if ($c_metadata['name'] == 'Группа'
					&& isset($c_metadata['attr']))
					{
						// Для корня родитель не передается, поэтому положим равным 0
						if (!isset($c_metadata['attr']['Родитель']))
						{
							$c_metadata['attr']['Родитель'] = 0;
						}

						$new_group_array[$c_metadata['attr']['Идентификатор']] = $c_metadata['attr'];
						$new_group_array_tree[$c_metadata['attr']['Родитель']][] = $c_metadata['attr']['Идентификатор'];
					}
				}

				// Вначале в стэке только корневая группа
				$stack = array(0 => 0);

				// Текущая родительская группа
				$cur_parent_id = $shop_groups_parent_id;

				// Пока в стеке остаются элементы, продолжаем цикл
				while (count($stack) > 0)
				{
					// Текущая группа - последний элемент стека
					$current_group_cml_id = GenCmlId(end($stack));
					// Удаляем элемент из стэка, т.к. мы извлекли из него все, что нужно
					unset($stack[count($stack) - 1]);

					// Пытаемся получить группу по ее CommerceML ID
					if ($parent_group_row = $shop->GetGroupIdByCmlId($current_group_cml_id, $shop_shops_id))
					{
						$cur_parent_id = $parent_group_row['shop_groups_id'];
					}

					if (isset($new_group_array_tree[$current_group_cml_id]))
					{
						foreach ($new_group_array_tree[$current_group_cml_id] as $key => $group_cml_id)
						{
							// Проверяем, есть ли группа в базе с текущим $group_cml_id
							if (!$shop->GetGroupIdByCmlId($group_cml_id, $shop_shops_id))
							{
								// Если нет, получаем данные о группе
								$array_of_data = $new_group_array[$group_cml_id];

								// Формируем массив параметров для вставки
								$param = array();
								$param['shop_groups_name'] = $array_of_data['Наименование'];
								$param['shop_shops_id'] = $shop_shops_id;

								$param['shop_groups_parent_id'] = $cur_parent_id;
								$param['shop_groups_cml_id'] = $group_cml_id;

								$shop->InsertGroup($param);

								$count_dir++;
							}

							// [] нельзя, т.к. тогда индекс в массиве не будет сбрасываться
							$stack[count($stack)] = $group_cml_id;
						}
					}
				}

				reset($metadata['children']);

				// Работаем с дополнительными свойствами
				foreach ($metadata['children'] as $c_number => $c_metadata)
				{
					if ($c_metadata['name'] == 'Свойство'
					&& isset($c_metadata['attr']))
					{
						// Ищем дополнительное свойство с таким же CML ID
						if (!$shop->GetItemPropertyIdByCmlId($c_metadata['attr']['Идентификатор'], $shop_shops_id))
						{
							// Свойство не существует, добавляем его
							$shop->InsertPropretyOfItems(array(
							'name' => $c_metadata['attr']['Наименование'],
							'shop_list_of_properties_cml_id' => $c_metadata['attr']['Идентификатор'],
							'shop_shops_id' => $shop_shops_id));
						}
					}
				}


				reset($metadata['children']);

				// Работаем с товарами
				foreach ($metadata['children'] as $c_number => $c_metadata)
				{
					if ($c_metadata['name'] == 'Товар'
					&& isset($c_metadata['attr']))
					{
						// Для корня родитель не передается, поэтому положим равным 0
						if (!isset($c_metadata['attr']['Родитель']))
						{
							$c_metadata['attr']['Родитель'] = 0;
						}

						// Ищем товар с таким же CML ID
						$exist_shop_item_row = $shop->GetCatalogItemIdByCmlId($c_metadata['attr']['Идентификатор'], $shop_shops_id);

						// Если "Оставить как есть" и есть информация в базе о товаре - не проводим вставку/обновление
						if (!($exist_shop_item_row && $import_price_action_items == 2))
						{

							// Получаем родительскую группу товара по идентификатору
							if ($c_metadata['attr']['Родитель'] == 'ID00000000') 
							{
								$parent_group_data = -1;
							}
							else 
							{
								$parent_group_data = $shop->GetGroupIdByCmlId($c_metadata['attr']['Родитель'], $shop_shops_id);
							}

							// Если нашли родительскую группу
							if ($parent_group_data
							|| $c_metadata['attr']['Родитель'] == 0)
							{
								$param = array();

								$param['shop_items_cml_id'] = $c_metadata['attr']['Идентификатор'];

								if (isset($parent_group_data['shop_groups_id']))
								{
									$param['groups_id'] = $parent_group_data['shop_groups_id'];
								}
								elseif ($parent_group_data == -1)
								{
									$param['groups_id'] = 0;
								}
								else
								{
									$param['groups_id'] = $cur_parent_id;
								}

								if ($exist_shop_item_row)
								{
									// передаем идентификатор товара
									$param['item_id'] = $exist_shop_item_row['shop_items_catalog_item_id'];

									$count_update_item++;
								}
								else
								{
									$count_insert_item++;
								}


								$param['name'] = $c_metadata['attr']['Наименование'];

								if (isset($c_metadata['attr']['Единица']))
								{
									// Обрабатываем значение "Единица измерения"
									$mesure_data = $shop->GetMesuresByLike($c_metadata['attr']['Единица']);
	
									// Если такой единицы измерения нет, добавляем ее
									if (!$mesure_data)
									{
										$param['mesures_id'] = $shop->InsertMesure(array('name' => $c_metadata['attr']['Единица']));
									}
									else
									{
										$param['mesures_id'] = $mesure_data['shop_mesures_id'];
									}
								}
								else
								{
									// Иначе берем из атрибутов магазина
									$param['mesures_id'] = $row_shop['shop_mesures_id'];
								}

								$param['shops_id'] = $shop_shops_id;

								$shop->InsertItem($param);
							}
							// Если не нашли родительскую группу, выводим сообщение об ошибке
							else
							{
								// вывести сообщение об ошибке
								show_error_message(sprintf($GLOBALS['MSG_shops']['error_cant_find_parent_catalog'], $c_metadata['attr']['Родитель'], $c_metadata['attr']['Наименование']));
							}
						}

						// Обработка значений свойств для товара
						if (isset($c_metadata['children']))
						{
							$property_array = array();
							foreach ($c_metadata['children'] as $property_id => $property_data)
							{
								if (isset($property_data['name'])
								&& $property_data['name'] == 'ЗначениеСвойства')
								{
									if (!empty($property_data['attr']['Значение']))
									{
										// Значения могут быть множественными, поэтому ниже мы им сделаем implode
										$property_array[$property_data['attr']['ИдентификаторСвойства']][] = $property_data['attr']['Значение'];
									}
								}
								
								if (count($property_array) > 0)
								{
									foreach ($property_array as $property_cml_id => $property_value_array)
									{
										$value_property = implode(', ', $property_value_array);

										$item_row = $shop->GetCatalogItemIdByCmlId($c_metadata['attr']['Идентификатор'], $shop_shops_id);
										
										// Импорт свойств с ID = 0 (описание и текст товара)
										if ($property_cml_id == 0) 
										{
											$data_counter = 0;
											
											foreach ($c_metadata['children'] as $data_store_id => $data_store)
											{
												if ($data_store['attr']['ИдентификаторСвойства'] == 0) 
												{
													if ($data_counter == 0)
													{
														// Обновляем основное свойство "Описание"
														$data_counter++;
														$shop->InsertItem(array('shops_id' => $shop_shops_id, 'item_id' => $item_row['shop_items_catalog_item_id'], 'description' => $data_store['attr']['Значение']));
													}
													else 
													{
														// Обновляем основное свойство "Текст"
														$data_counter = 0;
														$shop->InsertItem(array('shops_id' => $shop_shops_id, 'item_id' => $item_row['shop_items_catalog_item_id'], 'text' => $data_store['attr']['Значение']));
													}
												}
											}
										}

										// Если найден товар для дополнительного свойства
										if ($item_row)
										{
											// Исли найдено свойство для его значения
											if ($prop_row = $shop->GetItemPropertyIdByCmlId($property_cml_id, $shop_shops_id))
											{
												// Сохраняем значение свойства
												$shop->InsertPropertiesItem(
												array('shop_items_catalog_item_id' => $item_row['shop_items_catalog_item_id'],
												'shop_list_of_properties_id' => $prop_row['shop_list_of_properties_id'],
												'shop_properties_items_value' => $value_property));

												// Если дополнительное свойство не доступно группе товаров, включаем доступность данного свойства данной группе товаров
												if (!$shop->IssetPropertyForGroup(
												array('shop_groups_id' => $item_row['shop_groups_id'],
												'shop_list_of_properties_id' => $prop_row['shop_list_of_properties_id'],
												'shop_shops_id' => $shop_shops_id)))
												{
													$shop->InsertPropertyForGroup(array('shop_groups_id' => $item_row['shop_groups_id'], 'shop_list_of_properties_id' => $prop_row['shop_list_of_properties_id'], 'shop_shops_id' => $shop_shops_id));
												}

											}
										}
									}
								}
							}
						}
					}
				}
			}

			// Работаем с пакетом предложений
			if (isset($metadata['name'])
			&& $metadata['name'] == 'ПакетПредложений'
			&& isset($metadata['children']))
			{
				foreach ($metadata['children'] as $thinking_id => $thinking_data)
				{
					if (isset($thinking_data['name'])
					&& $thinking_data['name'] == 'Предложение'
					&& isset($thinking_data['attr']))
					{
						// Если найден товар по идентификатору CML - обновляем давнные для него
						if (isset($thinking_data['attr']['ИдентификаторТовара'])
						&& $item_rows = $shop->GetCatalogItemIdByCmlId($thinking_data['attr']['ИдентификаторТовара'], $shop_shops_id))
						{
							// Обрабатываем валюту
							if ($currency_array = $shop->GetCurrencyByInternationalName($thinking_data['attr']['Валюта']))
							{
								$currency_international_id = $currency_array[0]['shop_currency_id'];
							}
							else
							{
								$currency_international_id = $shop->InsertCurrency(
								array('name' => $thinking_data['attr']['Валюта'],
								'currency_international_name' => $thinking_data['attr']['Валюта'],
								'value_in_basic_currency' => 0));
							}

							// Обновляем информацию о товаре
							$shop->InsertItem(array('shops_id' => $shop_shops_id,
							'item_id' => $item_rows['shop_items_catalog_item_id'],
							'price' => to_float($thinking_data['attr']['Цена']),
							'rest' => to_int($thinking_data['attr']['Количество']),
							'currency_id' => $currency_international_id));
						}
					}
				}
			}
		}
	}
}
////////////////////////////////////
/*
// Текущий идентификатор продавца ставим в 0
$shop_sallers_id = 0;

$shop_sallers_name = '';

$shop_sallers_inn = '';

if (isset($array_of_cml_data['children'][0]['name']) && $array_of_cml_data['children'][0]['name'] == 'КоммерческаяИнформация' && isset($array_of_cml_data['children'][0]['name']['children']))
{
	foreach ($array_of_cml_data['children'][0]['name']['children'] as $key1 => $value1) 
	{
		// Импортируем каталоги товаров, содержащие как товары, так и группы товаров
		if ($value1['name'] == 'Каталог') 
		{
			if (isset($value1['children'])) 
			{
				foreach ($value1['children'] as $key2 => $value2) 
				{
					if ($value2['name'] == 'Владелец' && isset($value2['children'])) 
					{
						// Обнаружили продавца, проверяем, существует ли данный продавец в базе, если нет, добавляем
						foreach ($value2['children'] as $key3 => $value3) 
						{
							if ($value3['name'] == 'Наименование') 
							{
								$shop_sallers_name = $value3['value'];
							}
							elseif ($value3['name'] == 'ПолноеНаименование')
							{
								$shop_sallers_name = $value3['value'];
							}
							
							if ($value3['name'] == 'ИНН')
							{
								$shop_sallers_inn = $value3['value'];
							}
							
							if ($shop_sallers_name != '') 
							{
								// Ищем продавца по имени в БД
								$saller_row = $shop->GetSellerByName($shop_sallers_name, $shop_shops_id);
								
								if ($saller_row === false) 
								{
									// Продавец не обнаружен
									$shop_sallers_id = $shop->InsertSeller(array('shop_sallers_name' => $shop_sallers_name, 'shop_sallers_inn' => $shop_sallers_inn));
								}
								else 
								{
									$shop_sallers_id = $saller_row['shop_sallers_id'];
								}
								
							}
						}
					}
				}
			}
		}
	}
}


*/////////////////////////////////////
$admin_forms_fields = new admin_forms_fields();

echo '<h1>'.$GLOBALS['MSG_shops']['import_price_list_title'].'</h1><p><a href="'.$admin_forms_fields->GetHtmlCallDoLoadAjax('/admin/shop/shop.php', "&shop_groups_parent_id=0&shop_shops_id=$shop_shops_id", 65, 'load_data').'" onclick="'.$admin_forms_fields->GetOnClickCallDoLoadAjax('/admin/shop/shop.php', "&shop_groups_parent_id=0&shop_shops_id=$shop_shops_id", 65, 'load_data').'">'.$GLOBALS['MSG_shops']['show_shop'].' &quot; '.$shop_name.'&quot;</a></p>';


// Выводим отчет об импорте
echo $GLOBALS['MSG_shops']['count_insert_item'].' &#151; <b>'.$count_insert_item.'</b><br/>';

echo $GLOBALS['MSG_shops']['count_update_item'].' &#151; <b>'.$count_update_item.'</b><br/>';

echo $GLOBALS['MSG_shops']['create_catalog'].' &#151; <b>'.$count_dir.'</b><br/>';


$form_html = ob_get_clean();

$JsHttpRequest = new JsHttpRequest(SITE_CODING);

$GLOBALS['_RESULT'] = array(
'error' => '',
'form_html' => $form_html);

echo $JsHttpRequest->LOADER;

exit();
?>