﻿<?xml version="1.0" encoding="UTF-8"?>
<task version="1.5">
	<!-- Настройки подключения -->
	<endpoints>
		<!-- Настройки подключения к MSSQL -->
		<mssql connection="Provider=SQLOLEDB.1;DataTypeCompatibility=80;Password={SQLPassword};Persist Security Info=True;User ID={SQLUser};Initial Catalog={MSSQL_DB};Data Source={SQLServer}" db="{CH_DB}">
			<user></user>
			<pass></pass>
			<queryTimeout></queryTimeout>
		</mssql>

		<!-- Настройки подключения к ClickHouse -->
		<clickhouse connection="http://10.1.31.41:8123/">
			<user>{CH_user}</user>
			<pass>{CH_pass}</pass>
		</clickhouse>
	</endpoints>

	<operations>

		<node type="tsql" once="1">
			<query>
				UPDATE bsMigrationCache SET 
					[last_migrated] = NULL,
					[head_value] = NULL,
					[LastRowVersion] = NULL				
			</query>
		</node>

		<node type="clickhouse" desc="Создание базы" once="1">
			<query context="system">
				DROP DATABASE IF EXISTS {CH_DB} 
			</query>
			<query context="system">
				CREATE DATABASE IF NOT EXISTS {CH_DB} 
			</query>
		</node>

		<node type="clickhouse" desc="Создаю служебные метаданные">
			<query desc="Создаю реестр пользовательских таблиц">
					CREATE TABLE IF NOT EXISTS meta_UserTables(
						name String,
						representation String,
						description String,
						allow UInt8,
						sign Int8 DEFAULT 1
					) ENGINE = CollapsingMergeTree(sign)
					ORDER BY(name)
			</query>
			<query desc="Создаю реестр пользовательских виртуальных полей">
				CREATE TABLE IF NOT EXISTS meta_VirtualFields(
    					id FixedString(32),
    					metadata String,
    					for_tables Array(FixedString(32)),
    					query String,
    					type String,
    					version datetime DEFAULT now()
				)
				ENGINE ReplacingMergeTree(version)
				ORDER BY (id)
			</query>
		</node>

		<node type="clickhouse" desc="Создаю буфферную таблицу фактов продаж">				
			<query>
				CREATE TABLE IF NOT EXISTS _Sales
				(
					event_date DateTime,
					doc_id String,
					card_id String,
					shop_name String,												
					total Decimal(17, 2),
					total_with_discount Decimal(17, 2),						
					shop_id String,
					workplace String,
					operation Int8,
					bonus_earned Decimal(17, 2), 
					bonus_spent Decimal(17, 2),
					bonus_earned_by_referral Decimal(17, 2),
					doc_num String,				
					coupon_id String
				)
				ENGINE = MergeTree
				ORDER BY (
					event_date						
				)
			</query>			
		</node>

		<node type="clickhouse" desc="Создаю буфферную таблицу товаров в продажах">				
			<query>
				CREATE TABLE IF NOT EXISTS _ItemsSold
				(
					line_number Int32,
					doc_id String,
					item_id String,
					item_name String,
					quantity Decimal(17, 3),
					price Decimal(17, 2),
					discount Decimal(17, 2),
					cost Decimal(17, 2)
				)
				ENGINE = MergeTree
				ORDER BY
				(
					doc_id,
					line_number
				)
			</query>				
		</node>

		<node type="clickhouse" desc="Создаю буфферную таблицу скидок в продажах">				
			<query>
				CREATE TABLE IF NOT EXISTS _SaleDiscounts
				(		
					event_date DateTime,
					doc_id String,
					line_number Int32,
					discount_id String,
					discount_name String,
					discount_value Decimal(17, 2)						
				)
				ENGINE = MergeTree
				ORDER BY
				(
					event_date,
					doc_id,
					line_number						
				)
			</query>				
		</node>

		<node type="clickhouse" desc="Создаю основную таблицу фактов продаж">
			<query>
				CREATE TABLE IF NOT EXISTS Sales(
				event_date DateTime,
				doc_id String,
				doc_num String,	
				card_id String,		
				shop_id String,
				shop_name String,
				workplace String,
				operation Enum(
					'Продажа' = 0,
					'Возврат' = 1
				),
				item_name String,
				item_id String,
				price Decimal(17, 2),
				cost Decimal(17,2),
				quantity Decimal(17, 3),
				discount Decimal(17, 2),
				total Decimal(17, 2),
				total_with_discount Decimal(17, 2),
				coupon_id String,
				bonus_earned Decimal(17, 2), 
				bonus_spent Decimal(17, 2),
				bonus_earned_by_referral Decimal(17, 2),
				discounts Nested(
					discount_id String,
					discount_name String,
					discount_value Decimal(17, 2)
					)
				)
				ENGINE = MergeTree
				ORDER BY event_date
				PARTITION BY toYYYYMM(event_date)
			</query>			
			<query>
				ALTER TABLE Sales
				COMMENT COLUMN item_name '{
				"repr": "Номенклатура",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN discounts.discount_value '{
				"repr": "Сумма скидки",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN event_date '{
				"repr": "Период",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "sum(%1)",
				"default_dim": "toYear(event_date)",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN shop_id '{
				"repr": "shop_id",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "sum(%1)",
				"default_dim": "shop_id",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN doc_id '{
				"repr": "Документ",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN doc_num '{
				"repr": "№ Документа",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "sum(%1)",
				"default_dim": "doc_num",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN shop_name '{
				"repr": "shop_name",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "sum(%1)",
				"default_dim": "shop_name",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "shop_id",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_id '{
				"repr": "card_id",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "card_id",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN bonus_spent '{
				"repr": "Баллов потрачено",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN workplace '{
				"repr": "Касса",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "workplace",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN operation '{
				"repr": "Вид операции",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN item_id '{
				"repr": "Номенклатура",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN price '{
				"repr": "Цена",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN bonus_earned_by_referral '{
				"repr": "Баллов начислено рефералу",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN cost '{
				"repr": "Стоимость",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "cost",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN quantity '{
				"repr": "Кол-во",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN discount '{
				"repr": "Сумма скидки",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN total '{
				"repr": "Сумма",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN total_with_discount '{
				"repr": "Сумма со скидкой",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN coupon_id '{
				"repr": "coupon_id",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "sum(%1)",
				"default_dim": "coupon_id",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN bonus_earned '{
				"repr": "Баллов начислено",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN discounts.discount_id '{
				"repr": "discounts.discount_id",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "sum(%1)",
				"default_dim": "discounts.discount_id",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN discounts.discount_name '{
				"repr": "Скидка",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "discounts.discount_id",
				"formatter_id": ""
				}'				
			</query>
			<query>
				INSERT INTO meta_UserTables (name, representation, description, allow, sign)
				VALUES 
				('Sales', '', '', 0, -1),
				('Sales', 'Продажи и возвраты', 'Операции продаж и возвратов в ваших магазинах', 1, 1)
			</query>
		</node>

		<node type="clickhouse" desc="Создаю буфферную таблицу карт участников">				
			<query>
				CREATE TABLE IF NOT EXISTS _Cards
				(
					is_group UInt8,
					card_id String,										
					card_code String,
					card_barcode String,
					card_name String,
					card_blocked UInt8,
					card_active UInt8,					
					card_email String,
					card_phone String,
					card_balance Float32,
					card_turnover Float32,
					card_level_id String,					
					card_last_oper DateTime,
					card_first_oper DateTime,
					user_id String					
				)
				ENGINE = MergeTree
				ORDER BY card_id
			</query>				
		</node>

		<node type="clickhouse" desc="Создаю буфферную таблицу профилей участников">
			<query>
				CREATE TABLE IF NOT EXISTS _Profiles
				(
					user_id String,
					user_name String,
					user_login String,
					user_birthdate DateTime,
					user_gender Int8,
					user_signed_at DateTime,
					user_subscribed UInt8,
					user_phone String,
					user_email String,
					user_home_phone String,
					user_app String,
					profile_confirmed_at DateTime,
					profile_confirmed UInt8,
					profile_locked UInt8,
					city_id String,
					user_referal_id String	
				)
				ENGINE = MergeTree
				ORDER BY user_id
			</query>
		</node>

		<node type="clickhouse" desc="Создаю общую таблицу карт и профилей">
			<query>
				CREATE TABLE IF NOT EXISTS Users(
  
				-- Атрибуты карт  
				card_id String,
				card_code String,
				card_barcode String,
				card_name String,
				card_blocked UInt8,
				card_active UInt8,
				card_email String,
				card_phone String,
				card_balance Float32,
				card_turnover Float32,
				card_last_oper DateTime,
				card_first_oper DateTime,
				
				-- Атрибуты пользователей
				user_id String,
				user_name String,
				user_login String,
				user_birthdate DateTime,
				user_gender Int8,
				user_signed_at DateTime,
				user_subscribed UInt8,
				user_phone String,
				user_email String,
				user_home_phone String,
				user_app String,
				profile_confirmed_at DateTime,
				profile_confirmed UInt8,
				profile_locked UInt8,
				
				-- Служебка
				version DateTime DEFAULT now()
				)
				ENGINE=ReplacingMergeTree(version)
				ORDER BY (card_id, user_id)
			</query>
			<query>
				ALTER TABLE Users				
				COMMENT COLUMN card_last_oper '{
				"repr": "Последняя операция",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "card_last_oper",
				"hidden": false
				}',
				COMMENT COLUMN card_first_oper '{
				"repr": "Первая операция",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "card_first_oper",
				"hidden": false
				}',
				COMMENT COLUMN card_id '{
				"repr": "card_id",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "card_id",
				"hidden": true
				}',
				COMMENT COLUMN card_code '{
				"repr": "Код карты",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN card_email '{
				"repr": "Почта(карта)",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN card_barcode '{
				"repr": "Штрихкод карты",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN card_name '{
				"repr": "Наименование карты",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN card_active '{
				"repr": "Карта активна",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN card_blocked '{
				"repr": "Карта заблокирована",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN user_id '{
				"repr": "user_id",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "user_id",
				"hidden": true
				}',
				COMMENT COLUMN card_phone '{
				"repr": "Телефон(карта)",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN card_balance '{
				"repr": "Баланс",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN card_turnover '{
				"repr": "Оборот",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN user_name '{
				"repr": "Имя профиля",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN profile_confirmed '{
				"repr": "Подтвержден",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN user_app '{
				"repr": "Канал регистрации",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN user_login '{
				"repr": "Логин профиля",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN user_birthdate '{
				"repr": "Дата рождения",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN user_gender '{
				"repr": "Пол",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN user_signed_at '{
				"repr": "Дата авторизации",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN user_subscribed '{
				"repr": "Получает уведомления",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN user_home_phone '{
				"repr": "Домашний телефон",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN user_phone '{
				"repr": "Телефон(профиль)",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN user_email '{
				"repr": "Почта(Профиль)",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN profile_confirmed_at '{
				"repr": "Дата подтверждения",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN profile_locked '{
				"repr": "Профиль заблокирован",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false
				}',
				COMMENT COLUMN version '{
				"repr": "version",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "version",
				"default_dim": "version",
				"hidden": true
				}'
			</query>
			<query>
				INSERT INTO meta_UserTables (name, representation, description, allow, sign)
				VALUES 
				('Users', '', '', 0, -1),
				('Users', 'Профили участников', 'Профили и карты участников программы лояльности', 1, 1)
			</query>
		</node>

		<node type="migration" desc="Мигрирую карты участников">
			<node type="clickhouse" order="before">				
				<query>
					TRUNCATE TABLE _Cards
				</query>				
			</node>
			<extract>
				<table to="_Cards">
					bsCards
				</table>
				<fields>
					[ID],
					[IsGroup],
					[Code],
					[Name],
					[Blocked],
					[Active],
					[BarCode],
					[UserID],
					[Email],
					[Phone],
					[ActualBalance],					
					[AccumSaleAmount],
					[CardLevel],
					[LastOper],
					[FirstOper]
				</fields>
				<headExpr>
					rowversion(int) 
				</headExpr>
				<fetchSize>
					10000
				</fetchSize>
			</extract>
			<transform>
				<field from='IsGroup'         to='is_group' />
				<field from='ID'              to='card_id' />				
				<field from='Code'            to='card_code' />
				<field from='BarCode'         to='card_barcode' />
				<field from='Name'            to='card_name' />
				<field from='Blocked'         to='card_blocked' />
				<field from='Active'          to='card_active' />
				<field from='Email'           to='card_email' />
				<field from='Phone'           to='card_phone' />
				<field from='ActualBalance'   to='card_balance' />
				<field from='AccumSaleAmount' to='card_turnover' />    
				<field from='CardLevel'       to='card_level_id' /> 
				<field from='UserID'          to='user_id' />
				<field from='LastOper'        to='card_last_oper' />
				<field from='FirstOper'       to='card_first_oper' />
			</transform>
			<node type="clickhouse" order="error">
				<query>
					TRUNCATE TABLE _Cards
				</query>
			</node>
		</node>

		<node type="migration" desc="Мигрирую профили участников">
			<node type="clickhouse" order="before">
				<query>
					TRUNCATE TABLE _Profiles
				</query>
			</node>		
			<extract>
				<table to="_Profiles">
					bsUsers
				</table>
				<fields>
					[ID],
					[Name],
					[Login], 
					[BirthDate],
					[Gender],
					[ConfirmationDate],
					[Confirmed],
					[isLocked],
					[LoginDate], 
					[RecieveNotifications],
					[Phone],
					[Email],
					[HomePhone],
					[AppClient],
					[CityID],
					[ReferralUserID]
				</fields>
				<headExpr>
					rowversion(int) 
				</headExpr>
				<fetchSize>
					5000
				</fetchSize>
			</extract>
			<transform>
				<field from="ID"                   to="user_id"></field>
				<field from="Name"                 to="user_name"></field>
				<field from="Login"                to="user_login"></field>
				<field from="BirthDate"            to="user_birthdate"></field>
				<field from="Gender"               to="user_gender"></field>
				<field from="LoginDate"            to="user_signed_at"></field>
				<field from="RecieveNotifications" to="user_subscribed"></field>
				<field from="Phone"                to="user_phone"></field>
				<field from="Email"                to="user_email"></field>
				<field from="HomePhone"            to="user_home_phone"></field>
				<field from="AppClient"            to="user_app"></field>
				<field from="ConfirmationDate"     to="profile_confirmed_at"></field>
				<field from="Confirmed"            to="profile_confirmed"></field>
				<field from="isLocked"             to="profile_locked"></field>
				<field from="CityID"               to="city_id"></field>
				<field from="ReferralUserID"       to="user_referal_id"></field>
			</transform>
			<node type="clickhouse" order="error">				
				<query>
					TRUNCATE TABLE _Profiles
				</query>
			</node>		
		</node>

		<node type="clickhouse" desc="Переношу данные о картах и пользователях из буфферных таблиц">
			<query>
				INSERT INTO Users
				SELECT
					-- Атрибуты карт  
					card_id,
					card_code,
					card_barcode,
					card_name,
					card_blocked,
					card_active,
					card_email,
					card_phone ,
					card_balance,
					card_turnover,
					card_last_oper,
					card_first_oper,
					
					-- Атрибуты пользователей
					user_id,
					user_name,
					user_login,
					user_birthdate,
					user_gender,
					user_signed_at,
					user_subscribed,
					user_phone,
					user_email,
					user_home_phone,
					user_app,
					profile_confirmed_at,
					profile_confirmed,
					profile_locked,
					
					now()
				FROM
					_Cards ALL LEFT JOIN _Profiles USING(user_id)
			</query>
			<query>
				TRUNCATE TABLE _Cards
			</query>
			<query>
				TRUNCATE TABLE _Profiles
			</query>
			<query>
				OPTIMIZE TABLE Users
			</query>
		</node>

		<node type="clickhouse" desc="Создаю основную таблицу статистики покупок">
			<query>
				CREATE TABLE IF NOT EXISTS SaleStatistics(
					event_date DateTime,
					year UInt16,
					quater Enum8(
						'I квартал' = 1,
						'II квартал' = 2,
						'III квартал' = 3,
						'IV квартал' = 4
					),
					month Enum8(
						'Январь' = 1,
						'Февраль' = 2,
						'Март' = 3,
						'Апрель' = 4,
						'Май' = 5,
						'Июнь' = 6,
						'Июль' = 7,
						'Август' = 8,
						'Сентябрь' = 9,
						'Октябрь' = 10,
						'Ноябрь' = 11,
						'Декабрь' = 12
					),
					card_id String,
					shop_id String,
					shop_name String,
					doc_count UInt16,
					total_without_discount Decimal(17, 2),
					total Decimal(17, 2),
					bonus_spent Decimal(17, 2),
					bonus_earned Decimal(17, 2),
					cost Decimal(17, 2),
					discount Decimal(17, 2) MATERIALIZED total - total_without_discount
				)ENGINE = MergeTree()
				ORDER BY
					(event_date, year, month)
				PARTITION BY
					toYYYYMM(event_date)
			</query>			
			<query>
				CREATE OR REPLACE VIEW SalesStatisticsView AS
				SELECT * FROM
				(
					SELECT
						year as year,
						quater as quater,
						month as month,
						card_id as card_id,
						shop_id as shop_id,
						any(shop_name) as shop_name,
						sum(doc_count) as doc_count,
						sum(total_without_discount) as total_d,
						sum(total) as total,
						sum(discount) as discount,
						sum(bonus_spent) as bonus_spent,
						sum(bonus_earned) as bonus_earned,
						sum(cost) as cost
					FROM
						SaleStatistics
					GROUP BY
						year, quater, month, shop_id, card_id
				) LEFT JOIN Users USING card_id	
			</query>			
			<query>
				ALTER TABLE SalesStatisticsView
				COMMENT COLUMN card_email '{
				"repr": "Эл. почта",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "card_email",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN year '{
				"repr": "Год",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "year",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN shop_name '{
				"repr": "Магазин",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "shop_name",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "shop_id",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_id '{
				"repr": "id карты",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "card_id",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN quater '{
				"repr": "Квартал",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "quater",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_first_oper '{
				"repr": "card_first_oper",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "sum(%1)",
				"default_dim": "card_first_oper",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN month '{
				"repr": "Месяц",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "month",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN shop_id '{
				"repr": "id магазина",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "shop_id",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN doc_count '{
				"repr": "Кол-во",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "doc_count",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": true,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": "quantity"
				}',
				COMMENT COLUMN total_d '{
				"repr": "Сумма со скидкой",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "total_d",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": true,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": "money"
				}',
				COMMENT COLUMN total '{
				"repr": "Сумма",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "total",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": true,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": "money"
				}',
				COMMENT COLUMN card_barcode '{
				"repr": "Штрихкод карты",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "card_barcode",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN discount '{
				"repr": "Сумма скидки",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "discount",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": true,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": "money"
				}',
				COMMENT COLUMN bonus_spent '{
				"repr": "Сумма списаний",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "bonus_spent",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": true,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": "money"
				}',
				COMMENT COLUMN bonus_earned '{
				"repr": "Сумма начислений",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "bonus_earned",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": true,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": "money"
				}',
				COMMENT COLUMN cost '{
				"repr": "Стоимость",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "cost",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": true,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": "money"
				}',
				COMMENT COLUMN card_code '{
				"repr": "Магнитный код карты",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "card_code",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_name '{
				"repr": "Наименование карты",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "card_name",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_blocked '{
				"repr": "Карта заблокирована",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "card_blocked",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_active '{
				"repr": "Карта активна",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "card_active",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_id '{
				"repr": "id пользователя",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "sum(%1)",
				"default_dim": "user_id",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_balance '{
				"repr": "card_balance",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "card_balance",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_phone '{
				"repr": "Моб. телефон",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "card_phone",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_turnover '{
				"repr": "card_turnover",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "sum(%1)",
				"default_dim": "card_turnover",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN profile_locked '{
				"repr": "Аккаунт заблокирован",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "profile_locked",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_last_oper '{
				"repr": "card_last_oper",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "sum(%1)",
				"default_dim": "card_last_oper",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_name '{
				"repr": "Имя пользователя",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "user_name",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "user_id",
				"formatter_id": ""
				}',
				COMMENT COLUMN profile_confirmed '{
				"repr": "Аккаунт подтвержден",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "profile_confirmed",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_app '{
				"repr": "Канал регистрации",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "user_app",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_login '{
				"repr": "Логин пользователя",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "user_login",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_birthdate '{
				"repr": "Дата рождения",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "user_birthdate",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_gender '{
				"repr": "Пол",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "user_gender",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_signed_at '{
				"repr": "user_signed_at",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "user_signed_at",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_subscribed '{
				"repr": "user_subscribed",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "user_subscribed",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_home_phone '{
				"repr": "user_home_phone",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "user_home_phone",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_phone '{
				"repr": "user_phone",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "user_phone",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_email '{
				"repr": "user_email",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "user_email",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN profile_confirmed_at '{
				"repr": "Дата подтверждения",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "profile_confirmed_at",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN version '{
				"repr": "version",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "version",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}'						
			</query>
			<query>
				INSERT INTO meta_UserTables (name, representation, description, allow, sign)
				VALUES 
				('SalesStatisticsView', '', '', 0, -1),
				('SalesStatisticsView', 'Статистика покупок', 'Покупки в разрезе покупателей с возможностью подсчета количества документов по различным условиям', 1, 1)
			</query>
		</node>

		<node type="clickhouse" desc="Обновляю представление объединенной основной таблицы">
			<query>
				CREATE OR REPLACE VIEW All_Data AS
				SELECT * FROM Sales ANY LEFT JOIN Users USING (card_id)
			</query>
			<query>
				ALTER TABLE All_Data
				COMMENT COLUMN item_name '{
				"repr": "Номенклатура",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "ItemProperties",
				"prop_id": "item_id",
				"type_props_table": "dynamic",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "item_id",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_name '{
				"repr": "Имя профиля",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN discounts.discount_value '{
				"repr": "Сумма скидки",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": "money"
				}',
				COMMENT COLUMN event_date '{
				"repr": "Период",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "toYear(event_date)",
				"hidden": false,
				"period_field": true,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_first_oper '{
				"repr": "Первая операция",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "card_first_oper",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN shop_id '{
				"repr": "shop_id",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "sum(%1)",
				"default_dim": "shop_id",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN version '{
				"repr": "version",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "sum(%1)",
				"default_dim": "version",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN doc_id '{
				"repr": "ID Документа",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN doc_num '{
				"repr": "№ Документа",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "doc_id",
				"formatter_id": ""
				}',
				COMMENT COLUMN shop_name '{
				"repr": "Магазин",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "shop_id",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_id '{
				"repr": "card_id",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "card_id",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN bonus_spent '{
				"repr": "Баллов потрачено",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": "money"
				}',
				COMMENT COLUMN workplace '{
				"repr": "Касса",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "workplace",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_blocked '{
				"repr": "Карта заблокирована",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN operation '{
				"repr": "Вид операции",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN item_id '{
				"repr": "item_id",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "item_id",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "ItemProperties",
				"prop_id": "item_id",
				"type_props_table": "dynamic",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN price '{
				"repr": "Цена",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 2,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": "money"
				}',
				COMMENT COLUMN bonus_earned_by_referral '{
				"repr": "Баллов начислено рефералу",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": "money"
				}',
				COMMENT COLUMN cost '{
				"repr": "Стоимость",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "cost",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": "money"
				}',
				COMMENT COLUMN user_gender '{
				"repr": "Пол",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN quantity '{
				"repr": "Кол-во",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 3,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": "quantity"
				}',
				COMMENT COLUMN card_barcode '{
				"repr": "Штрихкод карты",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "card_id",
				"formatter_id": ""
				}',
				COMMENT COLUMN discount '{
				"repr": "Сумма скидки",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN total '{
				"repr": "Сумма",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": "money"
				}',
				COMMENT COLUMN total_with_discount '{
				"repr": "Сумма со скидкой",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": "money"
				}',
				COMMENT COLUMN coupon_id '{
				"repr": "Промокод",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN bonus_earned '{
				"repr": "Баллов начислено",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": "money"
				}',
				COMMENT COLUMN discounts.discount_id '{
				"repr": "ID Скидки",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN discounts.discount_name '{
				"repr": "Скидка",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_code '{
				"repr": "Код карты",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "card_id",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_name '{
				"repr": "Наименование карты",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "card_id",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_active '{
				"repr": "Карта активна",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_email '{
				"repr": "Почта(карта)",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_id '{
				"repr": "user_id",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "sum(%1)",
				"default_dim": "user_id",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_balance '{
				"repr": "Баланс",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": "money"
				}',
				COMMENT COLUMN card_phone '{
				"repr": "Телефон(карта)",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_turnover '{
				"repr": "Оборот",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "sum(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": "money"
				}',
				COMMENT COLUMN profile_locked '{
				"repr": "Профиль заблокирован",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN card_last_oper '{
				"repr": "Последняя операция",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "card_last_oper",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN profile_confirmed '{
				"repr": "Подтвержден",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_app '{
				"repr": "Канал регистрации",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_login '{
				"repr": "Логин профиля",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_birthdate '{
				"repr": "Дата рождения",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_signed_at '{
				"repr": "Дата авторизации",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_subscribed '{
				"repr": "Получает уведомления",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_home_phone '{
				"repr": "Домашний телефон",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_phone '{
				"repr": "Телефон(профиль)",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN user_email '{
				"repr": "Почта(Профиль)",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}',
				COMMENT COLUMN profile_confirmed_at '{
				"repr": "Дата подтверждения",
				"tool_tip": "",
				"role": "agregate",
				"default_agg": "any(%1)",
				"default_dim": "",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static",
				"dis_change_role": false,
				"dis_filter": false,
				"guid_field": "",
				"formatter_id": ""
				}'
			</query>
			<query>
				INSERT INTO meta_UserTables (name, representation, description, allow, sign)
				VALUES 
				('All_Data', '', '', 0, -1),
				('All_Data', 'Общая таблица продаж', 'Продажи и возвраты в разрезе профилей и карт', 1, 1)
			</query>
		</node>

		<node type="tsql" desc="Обновляю представление скидок">
			<query>
				DROP VIEW IF EXISTS bsSaleDiscounts
			</query>
			<query>
				CREATE VIEW bsSaleDiscounts AS
				SELECT
					hist.N as n, 
					[Date] as event_date,
					DocID as doc_id,	
					LineNumber as line_number,
					hist.DiscountID as discount_id,
					disc.DiscountName as discount_name,
					DiscountValue as discount_value	
				FROM 
					bsCalculateHistory as hist WITH(NOLOCK)
					LEFT JOIN bsDiscounts  as disc WITH(NOLOCK)
					ON hist.DiscountID = disc.DiscountID
				WHERE						
					ISNULL(hist.DocID, '') != ''
					AND ISNULL(hist.LineNumber, '') != ''
			</query>
			<query>
				UPDATE [dbo].[bsMigrationCache]
				SET [last_migrated] = NULL     
				WHERE [table_name] = 'bsSaleDiscounts'
			</query>
		</node>

		<node type="clickhouse" desc="Создаю основную таблицу свойств товаров">
			<query>
				CREATE TABLE IF NOT EXISTS ItemPropertiesKeys
				(
					id String,
					name String,
					type Enum(
						'string' = 0,
						'int' = 1,
						'float' = 2,
						'bool' = 3,
						'datetime' = 4
					)
				)
				ENGINE = MergeTree
				ORDER BY id
			</query>
		</node>

		<node type="clickhouse" desc="Создаю буфферную таблицу ассортимента">
			<query>
				CREATE TABLE IF NOT EXISTS _Items
				(						
					id String,						
					name String					
				)
				ENGINE = MergeTree
				ORDER BY id
			</query>
		</node>

		<node type="clickhouse" desc="Создаю основную таблицу ассортимента">
			<query>
				CREATE TABLE IF NOT EXISTS Items
				(						
					id String,						
					name String,
					version DateTime DEFAULT now()					
				)
				ENGINE = ReplacingMergeTree(version)
				ORDER BY id
			</query>
		</node>	

		<node type="clickhouse" desc="Создаю буфферную таблицу значений свойств">
			<query>
				CREATE TABLE IF NOT EXISTS _ItemProperties
				(						
					item_id String,
					prop_id String,
					value String
				) ENGINE = MergeTree
				ORDER BY (item_id, prop_id)
			</query>
		</node>

		<node type="clickhouse" desc="Создаю основную таблицу значений свойств товаров">
			<query>
				CREATE TABLE IF NOT EXISTS ItemProperties
				(						
					item_id String,
					prop_id String,
					value String,						
					version DateTime DEFAULT now()
				) ENGINE = ReplacingMergeTree(version)
				ORDER BY (item_id, prop_id)
			</query>
			<query>
				CREATE OR REPLACE VIEW ItemPropertiesKeyValue AS
				SELECT
					name,
					item_id,
					prop_name,
					value
				FROM 
					Items ALL LEFT JOIN (
					SELECT
						item_id,
						name as prop_name,
						value
					FROM
						ItemProperties FINAL
						ANY LEFT JOIN ItemPropertiesKeys ON prop_id == id
					) ON id == item_id 				
			</query>
			<query>
				ALTER TABLE ItemPropertiesKeyValue
				COMMENT COLUMN value '{
				"repr": "Значение свойства",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "value",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static"
				}',
				COMMENT COLUMN prop_name '{
				"repr": "Свойство",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "prop_name",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static"
				}',
				COMMENT COLUMN name '{
				"repr": "Товар",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "name",
				"hidden": false,
				"period_field": false,
				"digits": 0,
				"props_table": "ItemProperties",
				"prop_id": "item_id",
				"type_props_table": "dynamic"
				}',
				COMMENT COLUMN item_id '{
				"repr": "item_id",
				"tool_tip": "",
				"role": "dimension",
				"default_agg": "any(%1)",
				"default_dim": "item_id",
				"hidden": true,
				"period_field": false,
				"digits": 0,
				"props_table": "",
				"prop_id": "",
				"type_props_table": "static"
				}'
			</query>
			<query>
				INSERT INTO meta_UserTables (name, representation, description, allow, sign)
				VALUES 
				('ItemPropertiesKeyValue', '', '', 0, -1),
				('ItemPropertiesKeyValue', 'Классификатор ассортимента', 'Товары в разрезе свойств', 1, 1)
			</query>
			<query>
				INSERT INTO meta_UserTables (name, representation, description, allow, sign)
				VALUES 
				('ItemProperties', '', '', 0, -1),
				('ItemProperties', 'Свойства товаров', '', 0, 1)
			</query>
		</node>

		<node type="migration" desc="Мигрирую факты продаж">
			<node type="clickhouse" desc="before">				
				<query>
					TRUNCATE TABLE _Sales
				</query>
			</node>
			<extract>
				<table to="_Sales">
					bsSales
				</table>
				<fields>
					[Date],
					[DocID],
					[CardID],
					[CheckNumber],
					[Shop],
					[Sum],
					[SumWithDiscount],
					[ShopID],
					[Operation],
					[BonusEarned],
					[BonusSpent],
					[BonusEarnedReferral],
					[CouponID],
					[Cashbox]
				</fields>
				<headExpr>
					N(int)
				</headExpr>        
				<fetchSize>
					15000
				</fetchSize>
			</extract>
			<transform>
				<field from='Date' to='event_date' />
				<field from='DocID' to='doc_id' />
				<field from='CardID' to='card_id' />
				<field from='Shop' to='shop_name' />
				<field from='ShopID' to='shop_id' />    
				<field from='Sum' to='total' />
				<field from='SumWithDiscount' to='total_with_discount' />				
				<field from='Operation' to='operation' />
				<field from='BonusEarned' to='bonus_earned' />
				<field from='BonusSpent' to='bonus_spent' />
				<field from='BonusEarnedReferral' to='bonus_earned_by_referral' />
				<field from='CheckNumber' to='doc_num' />
				<field from='CouponID' to='coupon_id' />
				<field from='Cashbox' to='workplace' />
			</transform>
			<node type="clickhouse" desc="error">				
				<query>
					TRUNCATE TABLE _Sales
				</query>
			</node>						
		</node>

		<node type="migration" desc="Мигрирую товары в продажах">
			<node type="clickhouse" order="before">
				TRUNCATE TABLE _ItemsSold
			</node>
			<extract>
				<table to="_ItemsSold">
					bsSalesItems
				</table>
				<fields>
					[LineNumber],
					[DocID],
					[Item],
					[Quantity],
					[Price],
					[Discount],
					[Article],
					[CostPrice]															
				</fields>
				<headExpr>
					N(int)
				</headExpr>        
				<fetchSize>
					10000
				</fetchSize>
			</extract>			
			<transform>				
				<field from='LineNumber' to='line_number' />
				<field from='DocID' to='doc_id' />
				<field from='Item' to='item_name' />
				<field from='Article' to='item_id' />				
				<field from='Quantity' to='quantity' />
				<field from='Price' to='price' />    
				<field from='Discount' to='discount' />			
				<field from='CostPrice' to='cost' />
			</transform>
			<node type="clickhouse" order="error">
				TRUNCATE TABLE _ItemsSold
			</node>
		</node>

		<node type="migration" desc="Мигрирую скидки в продажах">
			<node type="clickhouse" order="before">
				TRUNCATE TABLE _SaleDiscounts
			</node>
			<extract>
				<table to="_SaleDiscounts">
					bsSaleDiscounts
				</table>
				<fields>
					event_date,
					doc_id,	
					line_number,
					discount_id,
					discount_name,
					discount_value				
				</fields>
				<headExpr>
					n(int)
				</headExpr>
				<fetchSize>
					5000
				</fetchSize>
			</extract>
			<transform/>
			<node type="clickhouse" order="error">
				TRUNCATE TABLE _SaleDiscounts
			</node>
		</node>

		<node type="clickhouse" desc="Переношу данные о продажах из буфферных таблиц">			
			<query>	
				<![CDATA[			
				INSERT INTO Sales
				SELECT
					event_date,
					doc_id,
					any(doc_num),
					card_id,					
					shop_id,
					any(shop_name),
					any(workplace),
					any(operation),
					any(item_name),
					item_id,
					price,
					sum(cost),					
					any(quantity),
					any(discount),
					any(total),
					any(total - discount) as total_with_discount,
					any(coupon_id),
					sum(bonus_earned), 
					sum(bonus_spent),
					sum(bonus_earned_by_referral),
					groupArray(discount_id),
					groupArray(discount_name),
					groupArray(discount_value)
				FROM
					(
						SELECT 
							t.event_date,
							t.doc_id,
							t.doc_num,
							t.shop_id,
							t.shop_name,
							t.workplace,
							t.operation,
							t.card_id,
							t.item_name,
							t.item_id,
							t.quantity,
							t.price,
							t.cost,
							t.discount,
							t.total,
							t.total_with_discount,								
							t.coupon_id,
							t.bonus_earned, 
							t.bonus_spent,
							t.bonus_earned_by_referral,
							d.discount_id,
							d.discount_name,
							d.discount_value
						FROM 
							(
								SELECT 
									event_date,
									doc_id,
									doc_num,						
									card_id,
									shop_id,
									shop_name,
									workplace,
									operation,
									line_number,
									item_name,
									item_id,
									quantity,
									price,
									cost,
									discount,
									quantity * price as total,
									total - discount as total_with_discount,
									coupon_id,
									bonus_earned, 
									bonus_spent,
									bonus_earned_by_referral
								FROM
									_Sales ALL LEFT JOIN _ItemsSold USING(doc_id)
								WHERE 
									ifNull(doc_id, '') <> ''
							) as t							
							ALL LEFT JOIN _SaleDiscounts as d USING(event_date, doc_id, line_number)											
					)
				GROUP BY
					event_date, doc_id, shop_id, card_id, item_id, price
				]]>				
			</query>
			<query>
				INSERT INTO SaleStatistics
				SELECT
					event_date,
					toYear(event_date),
					toQuarter(event_date),
					toMonth(event_date),
					card_id,
					shop_id,
					any(shop_name),
					count(distinct doc_id),
					sum(total_with_discount),
					sum(total),
					sum(bonus_spent),
					sum(bonus_earned),
					sum(cost)
				FROM 
					_Sales LEFT JOIN _ItemsSold USING doc_id
				WHERE
					ifnull(card_id, '') != ''
					AND ifnull(doc_id, '') != ''					
					AND operation == 0
				GROUP BY
					event_date, card_id, shop_id
			</query>
			<query>
				TRUNCATE TABLE IF EXISTS _Sales
			</query>
			<query>
				TRUNCATE TABLE IF EXISTS _SaleDiscounts
			</query>
			<query>
				TRUNCATE TABLE IF EXISTS _ItemsSold
			</query>
		</node>

		<node type="tsql" desc="Очищаю кэш миграции таблицы свойств">
			<query>
				UPDATE bsMigrationCache SET 
					[last_migrated] = NULL,
					[head_value] = NULL,
					[LastRowVersion] = NULL
				WHERE
					[table_name] = 'bsAssortmentProperties'
			</query>
		</node>

		<node type="migration" desc="Мигрирю свойства товаров">
			<node type="clickhouse" order="before">
				<query>
					TRUNCATE TABLE ItemPropertiesKeys
				</query>
			</node>
			<extract>
				<table to="ItemPropertiesKeys">
					bsAssortmentProperties
				</table>
				<fields>
					[ID],			
					[Name],
					CASE 
						WHEN [Type] = 0 THEN 'string'
						WHEN [Type] = 1 THEN 'int'
						WHEN [Type] = 2 THEN 'float'
						WHEN [Type] = 3 THEN 'bool'
						WHEN [Type] = 4 THEN 'datetime'
						ELSE 'string'
					END as Type
				</fields>
				<headExpr>
					ID(String)
				</headExpr>
				<fetchSize>
					100000
				</fetchSize>
			</extract>
			<transform>
				<field from="ID" to="id"/>
				<field from="Name" to="name"/>
				<field from="Type" to="type"/>
			</transform>
		</node>

		<node type="migration" desc="Миграция ассортимента">
			<node type="clickhouse" order="before">				
				<query>
					TRUNCATE TABLE _Items
				</query>
			</node>
			<extract>
				<table to="_Items">
					bsAssortment
				</table>
				<fields>
					[ID],			
					[Name]
				</fields>
				<headExpr>
					N(int)
				</headExpr>
				<fetchSize>
					5000
				</fetchSize>
			</extract>
			<transform>
				<field from="ID" to="id"/>
				<field from="Name" to="name"/>				
			</transform>
			<node type="clickhouse" order="error">
				<query>
					TRUNCATE TABLE IF EXISTS _Items
				</query>
			</node>
			<node type="clickhouse" order="after">
				<query>
					INSERT INTO Items (id, name)
					SELECT
						id, name
					FROM 
						_Items
				</query>
				<query>
					OPTIMIZE TABLE Items					
				</query>
			</node>
		</node>
		
		<node type="migration" desc="Мигрирую значеня свойств товаров">
			<node type="clickhouse" order="before">
				<query desc="Очистка буфферной таблицы значений свойств">
					TRUNCATE TABLE IF EXISTS _ItemProperties
				</query>
			</node>
			<extract>
				<table to="_ItemProperties">
					bsAssortmentPropertyValues
				</table>
				<fields>
					[AssortmentID],			
					[PropertyID],
					[Value]
				</fields>
				<headExpr>
					n(int) 
				</headExpr>
				<fetchSize>
					5000
				</fetchSize>
			</extract>
			<transform>
				<field from="AssortmentID" to="item_id"/>
				<field from="PropertyID"   to="prop_id"/>
				<field from="Value"        to="value"/>
			</transform>
			<node type="clickhouse" order="error">
				<query>
					TRUNCATE TABLE IF EXISTS _ItemProperties
				</query>
			</node>
			<node type="clickhouse" order="after">
				<query>
					INSERT INTO ItemProperties (item_id, prop_id, value)
					SELECT
						item_id, 
						prop_id,
						value
					FROM 
						_ItemProperties						
				</query>
			</node>
		</node>

	</operations>

	<!-- Логирование -->
	<log>
		<root>C:\\ProgramData\\1CRarus\\BonusServer\\ClickHouseData\\{MSSQL_DB}</root>
		<rotation>10</rotation>
	</log>
</task>