Você está na página 1de 3

primeiro passo : DROP FUNCTION public.

produto_permite_venda_f(bigint, bigint,
text);

segundo passo : CREATE OR REPLACE FUNCTION public.produto_permite_venda_f(


bigint,
bigint,
text)
RETURNS boolean
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$
/*Parametros:
1-$1 produto
2-$2 empresa
3-$3 codigo_barra
4-Retorno TRUE or FALSE
*/

DECLARE
v_empresa BIGINT;
v_resultado BOOLEAN;
v_distribuidora BIGINT;
v_permite_venda BOOLEAN;

BEGIN
IF $2 IS NULL THEN
SELECT empresa INTO v_empresa FROM empresa_local;
ELSE
v_empresa := $2;
END IF;

-- Se produto não permite venda, não precisa ser verificado o codigo de


barras
SELECT produto_verifica_permite_venda_f($1, v_empresa) INTO
v_permite_venda;

IF not v_permite_venda THEN


RETURN FALSE;
END IF;

IF $3 IS NULL THEN
RETURN TRUE;
END IF;

-- Se codigo do produto
SELECT count(*) > 0 INTO v_resultado FROM produto p WHERE p.grid = $1
AND p.codigo = $3;

IF v_resultado THEN
RETURN TRUE;
END IF;

SELECT distribuidora INTO v_distribuidora FROM empresa_distribuidora


WHERE empresa = v_empresa;

IF v_distribuidora = 1 THEN --Ipiranga


SELECT count(*) > 0 INTO v_resultado FROM produto_distribuidora
pd
JOIN exc_ipp_produto eip ON pd.produto_dist = eip.grid
JOIN exc_ipp_produto_empresa eipe ON eip.grid =
eipe.produto
WHERE pd.produto = $1 AND eipe.empresa = v_empresa AND
eip.codigo = $3;

-- Verifica produto_livre
IF NOT v_resultado THEN
SELECT count(*) > 0 into v_resultado FROM
exc_ipp_produto_livre eipl
JOIN exc_ipp_produto_livre_empresa eiple ON
eiple.produto_livre = eipl.grid
WHERE eiple.empresa = v_empresa AND eipl.produto = $1
AND NOT EXISTS (
SELECT 1 FROM produto_distribuidora pd
JOIN exc_ipp_produto eip ON eip.grid =
pd.produto_dist
JOIN exc_ipp_produto_empresa eipe ON
eipe.produto = eip.grid
WHERE pd.produto = $1 AND
pd.distribuidora = 1 AND eipe.empresa = v_empresa LIMIT 1
);
END IF;

IF NOT v_resultado THEN


SELECT count(*) > 0 INTO v_resultado FROM produto WHERE
grid = $1 and tipo='K';
END IF;

IF $3 IS NOT NULL THEN


SELECT case when eip.data_bloq_venda is not null and
eip.data_bloq_venda < now() then false else true end as permite_venda INTO
v_resultado
FROM exc_ipp_produto eip
LEFT JOIN produto_codigo_barra pcb ON
pcb.codigo_barra=eip.codigo
WHERE eip.codigo = $3;
END IF;

RETURN v_resultado;

ELSIF v_distribuidora = 4 THEN --BR


SELECT count(*) > 0 into v_resultado FROM produto_distribuidora
pd
JOIN exc_br_produto br ON br.grid = pd.produto_dist
WHERE pd.produto = $1 AND br.codigo_barra = $3;

--verificar produto livre


IF NOT v_resultado THEN
SELECT count(*) > 0 into v_resultado FROM
exc_br_inclusao_cadastro eic
WHERE eic.produto = $1 AND eic.empresa = v_empresa;
END IF;

RETURN v_resultado;
END IF;
RETURN TRUE;

END;
$BODY$;

ALTER FUNCTION public.produto_permite_venda_f(bigint, bigint, text)


OWNER TO postgres;

Você também pode gostar