-- Alteração de Preços de Itens
WITH RECURSIVE niveis(id_categoria_item, id_categoria_item_pai) AS (
	SELECT	id_categoria_item,
		id_categoria_item_pai,
		1 AS nivel
	FROM	categoria_item
	WHERE	id_categoria_item IN (:IdCategoriaItemMultEsc)
	UNION ALL
	SELECT	ci.id_categoria_item,
		ci.id_categoria_item_pai,
		nv.nivel +1
	FROM	categoria_item AS ci
		INNER JOIN niveis AS nv ON (nv.id_categoria_item = ci.id_categoria_item_pai))

SELECT DISTINCT se.nome AS empresa,
	apie.id_empresa,
	apie.data_alteracao,
	apie.preco_anterior,
	apie.preco_atual,
	CASE WHEN COALESCE(apie.nivel_preco,0) = 0 THEN 1 ELSE apie.nivel_preco END,
	su.nome AS usuario,
	i.denominacao AS item,
	ci.denominacao AS categoria_item,
	CASE WHEN (SELECT f_obtem_parametro_inteiro('suprimentos.tipo_calculo_preco_venda', se.id_empresa, 0, 'S')) = 2 AND (TRUNC((CASE WHEN (ie.sobrepor_regra_categoria = 'S') THEN ie.margem_minima ELSE cie.margem_minima END), 2) > 100) THEN  /* calculo MarContribuicao e MArgemMinima maior que 100% erro */
		-1
	WHEN (SELECT f_obtem_parametro_inteiro('suprimentos.tipo_calculo_preco_venda', se.id_empresa, 0, 'S')) = 1  THEN /* calculo -MARKUP  */
		ROUND( ( custo_unitario * (100 + TRUNC((CASE WHEN (ie.sobrepor_regra_categoria = 'S') THEN ie.margem_minima ELSE cie.margem_minima END), 2)) ) / 100 , 3)
	WHEN (SELECT f_obtem_parametro_inteiro('suprimentos.tipo_calculo_preco_venda', se.id_empresa, 0, 'S')) = 2 THEN /* calculo MarContribuicao  */
		ROUND( ( custo_unitario / NULLIF((100 - TRUNC((CASE WHEN (ie.sobrepor_regra_categoria = 'S') THEN ie.margem_minima ELSE cie.margem_minima END), 2)),0)) * 100 , 3)
	ELSE
		0
	END AS preco_minimo,
	TRUNC((CASE WHEN (ie.sobrepor_regra_categoria = 'S') THEN ie.margem_minima ELSE cie.margem_minima END), 2) AS margem_minima,
	CAST((SELECT (CASE WHEN ie.saldo_quantidade > 0 THEN ie.saldo_valor / saldo_quantidade ELSE 0 END)) AS DECIMAL(13,3)) AS custo_medio
FROM	alteracao_preco_item_empresa AS apie
	INNER JOIN item_empresa AS ie ON(ie.id_item = apie.id_item AND ie.id_empresa = apie.id_empresa)
	INNER JOIN sis_usuario AS su ON (su.id_usuario = apie.id_usuario_alteracao) 
	INNER JOIN item AS i ON (i.id_item = apie.id_item)
	INNER JOIN categoria_item AS ci ON (ci.id_categoria_item = i.id_categoria_item)
	INNER JOIN categoria_item_empresa AS cie ON(cie.id_categoria_item = ci.id_categoria_item AND cie.id_empresa = ie.id_empresa)
	INNER JOIN sis_empresa AS se ON (se.id_empresa = apie.id_empresa)
WHERE	DATE(apie.data_alteracao) BETWEEN :DataInicial AND :DataFinal
AND	apie.id_empresa IN (:IdEmpresaMultSlc)
AND ci.id_categoria_item IN (SELECT id_categoria_item FROM niveis)
ORDER BY se.nome,
	ci.denominacao,
	i.denominacao,
	apie.data_alteracao