#proc refill_sql.build_query /*параметры #se : report_ref, min_date, form_date, DateTo, DateFrom, OPT_SELECT_FIELDS, EXTRA_WHERE, HAVING_FILTER*/ #include_module price_module @{ create table IF NOT EXISTS `const_podtovarka` ( `Дата` Date, `Датаврем` DateTime, `Номенклатура` INT UNSIGNED, `Характеристика` INT UNSIGNED, `Ответственный` INT UNSIGNED, `Цвет` VARCHAR(50), INDEX (`Дата`), INDEX (`Датаврем`), INDEX (`Номенклатура`), INDEX (`Номенклатура`,`Цвет`), INDEX (`Характеристика`) ) ENGINE=InnoDB; drop temporary table if exists tmp_ost_nom_cvet[report_ref]; create temporary table tmp_ost_nom_cvet[report_ref]( Номенклатура INT UNSIGNED, Цвет INT UNSIGNED, Размер VARCHAR(500), Количество INT, КоличествоПродано INT default 0, UNIQUE KEY(Номенклатура, Цвет) ); INSERT INTO tmp_ost_nom_cvet[report_ref](Номенклатура, Цвет, Количество, Размер) select ost.Номенклатура, znsv.Значение, SUM(ost.Количество), group_concat(distinct znsv2.Значение) from @<Таблицы.ОстаткиТовараВТаре>@ ost left join @<Таблицы.ЗначенияСвойств>@ znsv on znsv.Объект=ost.Характеристика and znsv.Свойство=(select ссылка from @<Справочники.НаименованияСвойств>@ where Наименование = 'цвет') left join @<Таблицы.ЗначенияСвойств>@ znsv2 on znsv2.Объект=ost.Характеристика and znsv2.Свойство=(select ссылка from @<Справочники.НаименованияСвойств>@ where Наименование = 'размер') where ost.Количество > 0 and ost.Тара = (select ссылка from @<Справочники.Тара>@ where Наименование like '%Торговый%' limit 1) group by ost.Номенклатура, znsv.Значение; INSERT INTO tmp_ost_nom_cvet[report_ref](Номенклатура, Цвет, Количество, КоличествоПродано) select dv.Номенклатура, znsv.Значение, 0, -sum(dv.Количество) from @<Таблицы.ДвижениеТовара>@ dv inner join @<Справочники.Тара>@ tt on tt.Ссылка=dv.Тара left join @<Таблицы.ЗначенияСвойств>@ znsv on znsv.Объект=dv.Характеристика and znsv.Свойство=(select ссылка from @<Справочники.НаименованияСвойств>@ where Наименование = 'цвет') where dv.Дата between '[min_date]' and '[DateTo]' and tt.Наименование='ТорговыйЗал' and dv.Количество < 0 group by dv.Номенклатура, znsv.Значение ON DUPLICATE KEY UPDATE КоличествоПродано = VALUES(КоличествоПродано); drop temporary table if exists tmp_podtovarka[report_ref]; create temporary table tmp_podtovarka[report_ref]( ДатаПодтоварки datetime, Номенклатура INT UNSIGNED, Характеристика INT UNSIGNED, Ответственный INT UNSIGNED, Цвет INT UNSIGNED, Размер INT UNSIGNED, UNIQUE KEY(Характеристика), KEY(Ответственный), KEY(ДатаПодтоварки), KEY(Номенклатура), KEY(Номенклатура, Цвет) ); INSERT INTO tmp_podtovarka[report_ref](Номенклатура, Характеристика, ДатаПодтоварки, Цвет, Размер) select pd.Номенклатура, MIN(pd.Характеристика), MAX(pd.Датаврем), znsv.Значение, znsv2.Значение from const_podtovarka pd left join @<Таблицы.ЗначенияСвойств>@ znsv on znsv.Объект=pd.Характеристика and znsv.Свойство=(select ссылка from @<Справочники.НаименованияСвойств>@ where Наименование = 'цвет') left join @<Таблицы.ЗначенияСвойств>@ znsv2 on znsv2.Объект=pd.Характеристика and znsv2.Свойство=(select ссылка from @<Справочники.НаименованияСвойств>@ where Наименование = 'размер') where pd.Дата >= '[DateFrom]' group by pd.Номенклатура, znsv.Значение; drop temporary table if exists tmp_sell_nom_cvet[report_ref]; create temporary table tmp_sell_nom_cvet[report_ref]( Дата datetime, Номенклатура INT UNSIGNED, Характеристика INT UNSIGNED, Цвет INT UNSIGNED, KEY(Дата), KEY(Номенклатура), KEY(Номенклатура, Цвет) ); INSERT INTO tmp_sell_nom_cvet[report_ref](Дата, Номенклатура, Цвет) select MAX(rozdv.Дата), rozdv.Номенклатура, znsv.Значение from @<Таблицы.РозницаДвижениеТовара>@ rozdv left join @<Таблицы.ЗначенияСвойств>@ znsv on znsv.Объект=rozdv.Характеристика and znsv.Свойство=(select ссылка from @<Справочники.НаименованияСвойств>@ where Наименование = 'цвет') where rozdv.Количество>0 and rozdv.Дата > DATE_SUB('[DateTo]', interval 14 day) group by rozdv.Номенклатура, znsv.Значение; }@ SELECT dv.Характеристика , dv.Номенклатура , nnnnom.Наименование 'Сектор' , nnnom.Наименование 'Группа' , nom.Наименование , nom.Артикул , concat('https://media.saticogroup.com/dm/goodpics/marmalato?good_id=',xar.Код) as Фото , xar.Ссылка as 'tov_id' , xar.Код as 'product_id' , sznsv.Наименование 'Цвет' , sznsv2.Наименование 'Размер' , coalesce(ROUND(pr_xxar.Цена), ROUND(pr_nom.Цена), ROUND(pr_base_xxar.Цена), ROUND(pr_base_nom.Цена), 'нет') as 'Цена (текущая)' , coalesce(ROUND(pr_plan_xxar.Цена), ROUND(pr_plan_nom.Цена), 'нет') as 'Цена план' , concat(if(coalesce(pr_plan_xxar.Цена, pr_plan_nom.Цена) > coalesce(pr_xxar.Цена, pr_nom.Цена, pr_base_xxar.Цена, pr_base_nom.Цена), -1, 1) * ROUND((( coalesce(pr_plan_xxar.Цена, pr_plan_nom.Цена) - coalesce(pr_xxar.Цена, pr_nom.Цена, pr_base_xxar.Цена, pr_base_nom.Цена) ) / coalesce(pr_plan_xxar.Цена, pr_plan_nom.Цена) ) * 100), '%') as 'Скидка' , [#price.doc_label_type_sql(uc)] as 'Ценник' , nom.МинимальныйОстаток 'Норма ТЗ' , ost_nom_cvet.Количество as 'Остаток' , LEAST( ost_nom_cvet.Количество , if( IFNULL(pod.ДатаПодтоварки, '') <> '', SUM(if(dv.Дата > pod.ДатаПодтоварки, -dv.Количество, 0)) , GREATEST(sum(-dv.Количество), ROUND(ost_nom_cvet.КоличествоПродано/7*3)) )) as 'Нужно подтоварить' ,MAX(if(dd._тип_документ=@#Документы.РозницаПродажа#@, dv.Дата, NULL)) as 'ДатаПродажи' ,MAX(if(dd._тип_документ=@#Документы.ПриемкаТовара#@, dv.Дата, NULL)) as 'ДатаПоступления' , pod.ДатаПодтоварки as 'Дата подтоварки' ,if(rozdv.Дата > IFNULL(pod.ДатаПодтоварки, '[min_date]') OR MAX(dv.Дата) > IFNULL(pod.ДатаПодтоварки, '[min_date]') and rozdv.Дата is NULL, NULL, concat('Подтоварено ', DATE_FORMAT(pod.ДатаПодтоварки, '%Y-%m-%d %H:%i') ) ) as 'Выполнено' ,if(rozdv.Дата > IFNULL(pod.ДатаПодтоварки, '[min_date]') OR MAX(dv.Дата) > IFNULL(pod.ДатаПодтоварки, '[min_date]') and rozdv.Дата is NULL, NULL, pod.ДатаПодтоварки ) is NULL as 'sort' [OPT_SELECT_FIELDS] from @<Таблицы.ДвижениеТовара>@ as dv inner join @<Справочники.ХарактеристикиНоменклатуры>@ as xar on xar.ссылка=dv.Характеристика inner join @<Справочники.Номенклатура>@ as nom on nom.ссылка=dv.Номенклатура left join @<Справочники.Номенклатура>@ nnom on nnom.Ссылка=nom.Родитель left join @<Справочники.Номенклатура>@ as nnnom on nnnom.Ссылка=nnom.Родитель left join @<Справочники.Номенклатура>@ as nnnnom on nnnnom.Ссылка=nnnom.Родитель left join @<Таблицы.ЗначенияСвойств>@ znsv on znsv.Объект=xar.Ссылка and znsv.Свойство=(select ссылка from @<Справочники.НаименованияСвойств>@ where Наименование = 'цвет') left join @<Справочники.ЗначенияСвойств>@ sznsv on sznsv.Ссылка=znsv.Значение left join @<Таблицы.ЗначенияСвойств>@ znsv2 on znsv2.Объект=xar.Ссылка and znsv2.Свойство=(select ссылка from @<Справочники.НаименованияСвойств>@ where Наименование = 'размер') left join @<Справочники.ЗначенияСвойств>@ sznsv2 on sznsv2.Ссылка=znsv2.Значение left join tmp_sell_nom_cvet[report_ref] as rozdv on rozdv.Номенклатура=dv.Номенклатура and rozdv.Цвет=znsv.Значение inner join tmp_ost_nom_cvet[report_ref] as ost_nom_cvet on ost_nom_cvet.Номенклатура=dv.Номенклатура and ost_nom_cvet.Цвет=znsv.Значение and ost_nom_cvet.Количество > 0 left join tmp_podtovarka[report_ref] as pod on pod.Номенклатура=dv.Номенклатура and pod.Цвет=znsv.Значение left join tablici_prajsi as pr_base_nom on pr_base_nom.Номенклатура=dv.Номенклатура and pr_base_nom.ТипЦены='[BasePriceType]' and pr_base_nom.Характеристика=0 left join tablici_prajsi as pr_base_xxar on pr_base_xxar.Номенклатура=dv.Номенклатура and pr_base_xxar.ТипЦены='[BasePriceType]' and pr_base_xxar.Характеристика=dv.Характеристика and pr_base_xxar.Дата>=IFNULL(pr_base_nom.Дата,pr_base_xxar.Дата) left join tablici_prajsi as pr_nom on pr_nom.Номенклатура=dv.Номенклатура and pr_nom.ТипЦены='[PriceType]' and pr_nom.Характеристика=0 and pr_nom.Дата>=GREATEST(IFNULL(pr_base_nom.Дата, pr_nom.Дата),IFNULL(pr_base_xxar.Дата, pr_nom.Дата)) left join tablici_prajsi as pr_xxar on pr_xxar.Номенклатура=dv.Номенклатура and pr_xxar.ТипЦены='[PriceType]' and pr_xxar.Характеристика=dv.Характеристика and pr_xxar.Дата>=GREATEST(IFNULL(pr_base_nom.Дата, pr_xxar.Дата),IFNULL(pr_base_xxar.Дата, pr_xxar.Дата),IFNULL(pr_nom.Дата, pr_xxar.Дата) ) left join tablici_prajsi as pr_plan_nom on pr_plan_nom.Номенклатура=nom.ссылка and pr_plan_nom.ТипЦены='[PlanPriceType]' and pr_plan_nom.Характеристика=0 left join tablici_prajsi as pr_plan_xxar on pr_plan_xxar.Номенклатура=nom.ссылка and pr_plan_xxar.ТипЦены='[PlanPriceType]' and pr_plan_xxar.Характеристика=xar.ссылка and pr_plan_xxar.Дата>=IFNULL(pr_plan_nom.Дата,pr_plan_xxar.Дата) left join @<Документы.УстановкаЦенНоменклатуры>@ as uc on uc.ССЫЛКА = coalesce(pr_xxar.Документ, pr_nom.Документ, pr_base_xxar.Документ, pr_base_nom.Документ) inner join @<Документы.Документ>@ as dd on dd.Ссылка=dv.Регистратор and ( dd._тип_документ=@#Документы.РозницаПродажа#@ OR dd._тип_документ=@#Документы.ПриемкаТовара#@) where dv.Количество<0 and dv.Дата between '[DateFrom]' and '[DateTo]' and nnnnom.Наименование not in ('СЕРТИФИКАТЫ', 'БИЖУТЕРИЯ', 'УПАКОВОЧНЫЕ ПАКЕТЫ') and nom.МинимальныйОстаток [EXTRA_WHERE] group by dv.Номенклатура, znsv.Значение [HAVING_FILTER] order by sort DESC, `Дата подтоварки` DESC; #endproc