CREATE OR REPLACE FUNCTION fnc_calcula_preco_moeda(var_filial integer, var_data_cot date, var_vlr_unitario numeric, var_cliente integer, var_orcamento integer) RETURNS numeric AS $BODY$ DECLARE var_prc_unitario_final numeric; var_moeda_cliente integer; var_cotacao_moeda numeric; var_utiliza_moeda character varying(1); var_uf_cliente character varying(2); BEGIN SELECT utiliza_moeda_venda INTO var_utiliza_moeda FROM par_faturamento WHERE filial_par = var_filial; IF var_utiliza_moeda = 'S' THEN SELECT cli_endereco.uf INTO var_uf_cliente FROM vnd_orcamento INNER JOIN cli_endereco ON cli_endereco.filial = vnd_orcamento.filial_cli AND cli_endereco.cliente = vnd_orcamento.cliente AND cli_endereco.sequencia = vnd_orcamento.endereco_entrega WHERE vnd_orcamento.orcamento = var_orcamento; IF var_uf_cliente = 'EX' THEN SELECT moeda_venda INTO var_moeda_cliente FROM cli_cliente_moeda_venda WHERE filial = var_filial AND cliente = var_cliente; IF var_moeda_cliente IS NOT NULL THEN SELECT cotacao INTO var_cotacao_moeda FROM prc_moeda_cotacao WHERE codigo_moeda = var_moeda_cliente AND data <= var_data_cot AND cotacao > 0 ORDER BY data DESC LIMIT 1; IF var_cotacao_moeda IS NOT NULL THEN var_prc_unitario_final = var_vlr_unitario / var_cotacao_moeda; ELSE var_prc_unitario_final = var_vlr_unitario; END IF; ELSE var_prc_unitario_final = var_vlr_unitario; END IF; ELSE var_prc_unitario_final = var_vlr_unitario; END IF; ELSE var_prc_unitario_final = var_vlr_unitario; END IF; RETURN TRUNC(var_prc_unitario_final,3); END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION fnc_calcula_preco_moeda(integer, date, numeric, integer, integer) OWNER TO postgres; CREATE OR REPLACE FUNCTION fnc_calcula_preco_moeda_atual(var_filial integer, var_data_cot date, var_vlr_unitario numeric, var_cliente integer, var_orcamento integer) RETURNS numeric AS $BODY$ DECLARE var_prc_unitario_final numeric; var_prc_unitario_moeda numeric; var_moeda_cliente integer; var_cotacao_moeda numeric; var_cotacao_moeda_atual numeric; var_utiliza_moeda character varying(1); var_uf_cliente character varying(2); BEGIN SELECT utiliza_moeda_venda INTO var_utiliza_moeda FROM par_faturamento WHERE filial_par = var_filial; IF var_utiliza_moeda = 'S' THEN SELECT cli_endereco.uf INTO var_uf_cliente FROM vnd_orcamento INNER JOIN cli_endereco ON cli_endereco.filial = vnd_orcamento.filial_cli AND cli_endereco.cliente = vnd_orcamento.cliente AND cli_endereco.sequencia = vnd_orcamento.endereco_entrega WHERE vnd_orcamento.orcamento = var_orcamento; IF var_uf_cliente = 'EX' THEN SELECT moeda_venda INTO var_moeda_cliente FROM cli_cliente_moeda_venda WHERE filial = var_filial AND cliente = var_cliente; IF var_moeda_cliente IS NOT NULL THEN SELECT cotacao INTO var_cotacao_moeda FROM prc_moeda_cotacao WHERE codigo_moeda = var_moeda_cliente AND data <= var_data_cot AND cotacao > 0 ORDER BY data DESC LIMIT 1; IF var_cotacao_moeda IS NOT NULL THEN var_prc_unitario_moeda = var_vlr_unitario / var_cotacao_moeda; ELSE var_cotacao_moeda = 1; END IF; SELECT cotacao INTO var_cotacao_moeda_atual FROM prc_moeda_cotacao WHERE codigo_moeda = var_moeda_cliente AND data <= current_date AND cotacao > 0 ORDER BY data DESC LIMIT 1; IF var_cotacao_moeda_atual IS NOT NULL THEN var_prc_unitario_final = var_prc_unitario_moeda * var_cotacao_moeda_atual; ELSE var_prc_unitario_final = var_vlr_unitario; END IF; ELSE var_prc_unitario_final = var_vlr_unitario; END IF; ELSE var_prc_unitario_final = var_vlr_unitario; END IF; ELSE var_prc_unitario_final = var_vlr_unitario; END IF; RETURN TRUNC(var_prc_unitario_final,3); END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION fnc_calcula_preco_moeda_atual(integer, date, numeric, integer, integer) OWNER TO postgres;