<?php
/**
 * Система управления сайтом HostCMS v. 5.xx
 * Copyright © 2005-2010 ООО "Хостмэйк" (Hostmake LLC), http://www.hostcms.ru
 *
 * Обработчик экспорта данных о товарах в CML.
 *
 * Файл: /admin/shop/action/export_data_cml.php
 *
 * @author Hostmake LLC
 * @version 5.x
 */

$shop = & singleton('shop');

$kernel = & singleton('kernel');

$DataBase = & singleton('DataBase');

$warehouse = & singleton('warehouse');

// Начинаем отправлять заголовки
header("Pragma: public");

header("Content-Description: File Transfer");

// Указываем уже определенный Content-Type
header("Content-Type: application/force-download");

// Force the download
header("Content-Disposition: attachment; filename = " . 'CommerceML_' .date("Y_m_d_H_i_s").'.xml'. ";");
header("Content-Transfer-Encoding: binary");

// Содержание будущего XML-документа
echo '<?xml version="1.0" encoding="utf-8"?>'."\r\n";

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

// Получаем GUID для владельца каталога
$user_guid = $kernel->Guid();

// Получаем данные о магазине
$shop_data = $shop->GetShop($shop_shops_id);

function GenCmlId($shop_groups_id)
{
	$temp = 'ID';

	$shop_groups_id = to_str($shop_groups_id);

	$len = 8 - mb_strlen($shop_groups_id);

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

	return $temp .= $shop_groups_id;
}

function addSomeDays($current_date,$number_of_days)
{
	$old_timestamp = strtotime($current_date);
	$new_timestamp = $old_timestamp + $number_of_days * 86400;
	return date("Y-m-d",$new_timestamp);
}

// Проверяем GUID магазина на пустоту, если пустой, генерируем новый
if ($shop_data['shop_shops_guid'] == '')
{
	$shop_data['shop_shops_guid'] = $kernel->Guid();
}

// Получаем информацию о еденице измерения
$mesure = $shop->GetMesure($shop_data['shop_mesures_id']);

echo '<КоммерческаяИнформация xmlns="urn:CommerceML">'."\r\n";
echo '<Каталог Идентификатор="'.str_for_xml($shop_data['shop_shops_guid']).'" Наименование="'.str_for_xml($shop_data['shop_shops_name']).'" Владелец="'.str_for_xml($user_guid).'" Единица="'.str_for_xml($mesure['shop_mesures_name']).'">'."\r\n";

// Получаем родительскую группу, с котрой нужно начать экспорт
$shop_groups_parent_id = to_int($_REQUEST['shop_groups_parent_id']);

// В цикле получаем список товаров, которые войдут в конечный XML-документ
$array_of_items = array();

$arr = array();

// Получаем список групп товаров, которые войдут в конечный XML-документ
function create_option(& $arr, & $group_mas, $group_parent_id)
{
	$shop = & singleton('shop');

	if (isset($group_mas[$group_parent_id]))
	{
		foreach ($group_mas[$group_parent_id] as $key => $sub_group_id)
		{
			$arr[] = $sub_group_id;

			$arr = create_option($arr, $group_mas, $sub_group_id);
		}
	}

	return $arr;
}

// Получаем ID всех подгрупп
$shop->FillMemCacheGoupsIdTree($shop_shops_id);
$arr = create_option($arr, $shop->CacheGoupsIdTree[$shop_shops_id], $shop_groups_parent_id);

// Начинаем экспорт групп
foreach ($arr as $group_id)
{
	$metadata = $shop->GetGroup($group_id);

	if ($metadata)
	{
		// Генерируем идентификатор группы CommerceML, используем его только если у групы не задан идентификатор CommerceML
		if($metadata['shop_groups_cml_id'] == '')
		{
			$id_group = GenCmlId($metadata['shop_groups_id']);
		}
		else
		{
			$id_group = $metadata['shop_groups_cml_id'];
		}
		
		// ПОлучаем информацию о родительской группе
		$parent_metadata = $shop->GetGroup($metadata['shop_groups_parent_id']);
		
		if($parent_metadata['shop_groups_cml_id'] == '')
		{
			$id_parent_group = GenCmlId($metadata['shop_groups_parent_id']);
		}
		else
		{
			$id_parent_group = $parent_metadata['shop_groups_cml_id'];
		}
		

		echo '<Группа Идентификатор="'.str_for_xml($id_group).'" ИдентификаторВКаталоге="'.str_for_xml($id_group).'" Наименование="'.str_for_xml($metadata['shop_groups_name']).'" Родитель="'.str_for_xml($id_parent_group).'"/>'."\r\n";
	}
	
	if (isset($shop->MasGroup[$group_id]))
	{
		unset($shop->MasGroup[$group_id]);
	}
	flush();
}

// !!! Сама родительская группа добавляется в массив
$arr[] = $shop_groups_parent_id;

// Очищаем кэш
$shop->MasGroup = array();
$shop->CacheGoupsIdTree = array();

// Для корня условия по группам в SQL-запрос не дописываем
if ($shop_groups_parent_id && count($arr) > 0)
{
	$where_case = " AND `shop_groups_id` IN (" . implode(',' , $arr) . ")";
}
else
{
	$where_case = "";
}

// Запрос на получение данных о товарах для всех категориях
$query = "SELECT * FROM `shop_items_catalog_table`
WHERE `shop_shops_id` = '{$shop_shops_id}' {$where_case}";

$items_res = $DataBase->query($query);

// Начинаем экспорт товаров
while ($item_data = mysql_fetch_assoc($items_res))
{
	$item_id = $item_data['shop_items_cml_id'];

	if ($item_id == '')
	{
		$item_id = GenCmlId($item_data['shop_items_catalog_item_id']);
	}

	//$id_parent_item = GenCmlId($item_data['shop_groups_id']);
	
	$metadata = $shop->GetGroup($item_data['shop_groups_id']);
	
	if($metadata['shop_groups_cml_id'] == '')
	{
		$id_parent_item = GenCmlId($metadata['shop_groups_id']);
	}
	else
	{
		$id_parent_item = $metadata['shop_groups_cml_id'];
	}

	// Получаем информацию о еденице измерения
	$item_mesure_row = $shop->GetMesure($item_data['shop_mesures_id']);

	echo '<Товар Идентификатор="'.str_for_xml($item_id).'" ИдентификаторВКаталоге="'.str_for_xml($item_id).'" Наименование="'.str_for_xml($item_data['shop_items_catalog_name']).'" Родитель="'.str_for_xml($id_parent_item).'" Единица="'.str_for_xml($item_mesure_row['shop_mesures_name']).'">'."\r\n";

	// Проверяем наличие значений дополнительных свойств для товара
	$external_property_rows = $shop->GetAllPropertiesItem($item_data['shop_items_catalog_item_id'],
	// запрет кэширования для исключения активной записи в кэш
	array('cache_off' => true));

	// Очищаем кэш
	if (isset($shop->CachePropertiesItem[$item_data['shop_items_catalog_item_id']]))
	{
		unset($shop->CachePropertiesItem[$item_data['shop_items_catalog_item_id']]);
	}

	$count_ext_prop = count($external_property_rows);

	for ($i = 0; $i < $count_ext_prop; $i++)
	{
		if ($external_property_rows[$i]['shop_list_of_properties_id'] != '')
		{
			// Получаем информацию о дополнительном свойстве
			$ext_prop_row = $shop->GetPropretyOfItems($external_property_rows[$i]['shop_list_of_properties_id']);
		
			echo '<ЗначениеСвойства ИдентификаторКаталога="'.str_for_xml($shop_data['shop_shops_guid']).'" ИдентификаторСвойства="'.$ext_prop_row['shop_list_of_properties_cml_id'].'" Значение="'.str_for_xml($external_property_rows[$i]['shop_properties_items_value']).'"/>';
		}

		unset($external_property_rows[$i]);
	}

	$external_property_rows = array();
	
	// Экспортируем основные свойства "Описание" и "Текст"
	echo '<ЗначениеСвойства ИдентификаторКаталога="'.str_for_xml($shop_data['shop_shops_guid']).'" ИдентификаторСвойства="0" Значение="'.str_for_xml($item_data['shop_items_catalog_description']).'"/>';
	echo '<ЗначениеСвойства ИдентификаторКаталога="'.str_for_xml($shop_data['shop_shops_guid']).'" ИдентификаторСвойства="0" Значение="'.str_for_xml($item_data['shop_items_catalog_text']).'"/>';

	echo '</Товар>'."\r\n";
	
	if (isset($shop->MasGroup[$item_data['shop_groups_id']]))
	{
		unset($shop->MasGroup[$item_data['shop_groups_id']]);
	}
	
	flush();
}

$array_of_external_propertys_res = $shop->GetAllListProperties($shop_shops_id);

// Начинаем экспорт дополнительных свойств
while ($array_of_external_propertys_row = mysql_fetch_assoc($array_of_external_propertys_res))
{
	$property_id = $array_of_external_propertys_row['shop_list_of_properties_cml_id'];

	if ($property_id == '')
	{
		$property_id = GenCmlId($array_of_external_propertys_row['shop_list_of_properties_id']);
	}

	echo '<Свойство Идентификатор="'.str_for_xml($property_id).'" Наименование="'.str_for_xml($array_of_external_propertys_row['shop_list_of_properties_name']).'"/>';
}

echo '</Каталог>'."\r\n";

// Получаем даты действия пакета предложений, начало - текущая дата, окончание - текущая дата + 10 лет
$date_from = date("Y-m-d");

$date_to = addSomeDays($date_from, 365 * 10);

// Начинаем экспорт пакета предложений
echo '<ПакетПредложений ИдентификаторКаталога="'.str_for_xml($shop_data['shop_shops_guid']).'" Владелец="'.str_for_xml($user_guid).'" ДействительноС="'.$date_from.'" ДействительноДо="'.$date_to.'">';

if(mysql_num_rows($items_res) > 0)
{
	mysql_data_seek($items_res, 0);
}

while ($item_data = mysql_fetch_assoc($items_res))
{
	$item_id = $item_data['shop_items_cml_id'];

	if ($item_id == '')
	{
		$item_id = GenCmlId($item_data['shop_items_catalog_item_id']);
	}

	// Получаем данные о мере измерения
	$mesure_row = $shop->GetMesure($item_data['shop_mesures_id']);

	// Получаем данные о валюте
	$currency_row = $shop->GetCurrency($item_data['shop_currency_id']);

	echo '<Предложение ИдентификаторТовара="'.str_for_xml($item_id).'" Количество="'.str_for_xml($warehouse->GetItemCountForAllWarehouses($item_id)).'" Цена="'.str_for_xml($item_data['shop_items_catalog_price']).'" НормаУпаковки="0" Единица="'.str_for_xml($mesure_row['shop_mesures_name']).'" Валюта="'.str_for_xml($currency_row['shop_currency_international_name']).'"/>';
}

echo '</ПакетПредложений>'."\r\n";
echo '</КоммерческаяИнформация>'."\r\n";

exit();

?>