SELECT  infs.id_nota_fiscal_saida,
    infs.id_item_nfs,
    i.codigo AS codigo_item,
    COALESCE(i.codigo_barra, '') AS codigo_barra,
    CASE WHEN (NOT EXISTS (SELECT 1 FROM sis_parametro WHERE id_parametro = 'fiscal.complementar_campo_xprod_com_descricao_complementar')) THEN i.denominacao ELSE
    TRIM(RPAD(i.denominacao || (CASE WHEN ((SELECT f_obtem_parametro_alfanumerico('fiscal.complementar_campo_xprod_com_descricao_complementar', nfs.id_empresa, NULL, 'S')) = 'S') THEN ' ' || COALESCE(i.descricao_complementar, '') ELSE '' END),120,' ')) END AS denominacao_item,
    COALESCE(cf.codigo, '') AS codigo_ncm,
    i.codigo_servico,
    cfop.cfop,
    u.sigla AS sigla_unidade,
    tu.permite_fracionamento AS permite_fracionamento,
    infs.quantidade,
    (CASE WHEN ui.fator_medida != u.fator_medida THEN f_calcula_arredondamento_abnt((infs.total_item / infs.quantidade),10) ELSE infs.valor_unitario END) AS valor_unitario,
    infs.total_item,
    infs.rateio_frete,
    infs.rateio_seguro,
    infs.desconto,
    infs.rateio_despesa_acessoria,
    COALESCE(le.tipo, 2) AS tipo_le,
    i.tipo_item,
    i.origem_produto,
    i.origem_produto || (COALESCE(cst_icms.codigo, 'XX')) AS codigo_cst_icms,
    infs.base_icms_reduzida AS base_icms,
    infs.aliquota_icms,
    infs.icms,
    infs.base_icms_substituicao,
    infs.icms_substituicao,
    infs.base_icms_st_retido,
    infs.icms_st_retido,
    infs.id_tipo_tributacao_pis,
    infs.id_cst_pis,
    cst_pis.codigo AS codigo_cst_pis,
    infs.base_pis,
    infs.aliquota_pis,
    infs.pis,
    infs.id_tipo_tributacao_cofins,
    infs.id_cst_cofins,
    cst_cofins.codigo AS codigo_cst_cofins,
    infs.base_cofins,
    infs.aliquota_cofins,
    infs.cofins,
    infs.base_iss,
    infs.aliquota_iss,
    infs.iss,
    infs.id_cst_ipi,
    cst_ipi.codigo AS codigo_cst_ipi,
    infs.ipi,
    infs.fcp,
    infs.base_fcp,
    infs.aliquota_fcp,
    0 AS fcp_st_retido,
    0 AS aliquota_fcp_st_retido,
    0 AS base_fcp_st_retido,
    CASE WHEN infs.base_fcp > 0 OR infs.aliquota_fcp > 0 OR infs.fcp > 0 THEN TRUE ELSE FALSE END AS tem_fcp
FROM    item_nfs AS infs
        INNER JOIN nota_fiscal_saida AS nfs ON (nfs.id_nota_fiscal_saida = infs.id_nota_fiscal_saida)
    INNER JOIN item AS i ON (i.id_item = infs.id_item)
    INNER JOIN item_empresa AS ie ON (ie.id_item = i.id_item AND ie.id_empresa = nfs.id_empresa)
    INNER JOIN cfop ON (cfop.id_cfop = infs.id_cfop)
    INNER JOIN unidade_medida AS u ON (u.id_unidade_medida = infs.id_unidade_medida)
    INNER JOIN unidade_medida AS ui ON (ui.id_unidade_medida = i.id_unidade_medida)
    INNER JOIN tipo_unidade_medida AS tu ON (tu.id_tipo_unidade_medida = u.id_tipo_unidade_medida)
    LEFT OUTER JOIN local_estoque AS le ON (le.id_local_estoque = infs.id_local_estoque)
    LEFT OUTER JOIN cst AS cst_icms ON (cst_icms.id_cst = infs.id_cst_icms)
    INNER JOIN cst AS cst_pis ON (cst_pis.id_cst = infs.id_cst_pis)
    INNER JOIN cst AS cst_cofins ON (cst_cofins.id_cst = infs.id_cst_cofins)
    LEFT OUTER JOIN cst AS cst_ipi ON (cst_ipi.id_cst = infs.id_cst_ipi)
    LEFT JOIN codigo_fiscal cf ON (cf.id_codigo_fiscal = i.id_codigo_fiscal AND cf.tipo = 1)
WHERE   infs.id_nota_fiscal_saida = :Id
AND EXISTS(SELECT 1 FROM item_nfs AS i1 INNER JOIN cfop AS c1 ON (c1.id_cfop = i1.id_cfop)
        WHERE id_nota_fiscal_saida = nfs.id_nota_fiscal_saida AND c1.entrada_saida = 2)

UNION ALL

SELECT  infe.id_nota_fiscal_entrada,
    infe.id_item_nfe,
    i.codigo AS codigo_item,
    COALESCE(i.codigo_barra, '') AS codigo_barra,
    CASE WHEN (NOT EXISTS (SELECT 1 FROM sis_parametro WHERE id_parametro = 'fiscal.complementar_campo_xprod_com_descricao_complementar')) THEN i.denominacao ELSE
    TRIM(RPAD(i.denominacao || (CASE WHEN ((SELECT f_obtem_parametro_alfanumerico('fiscal.complementar_campo_xprod_com_descricao_complementar', nfe.id_empresa, NULL, 'S')) = 'S') THEN ' ' || COALESCE(i.descricao_complementar, '') ELSE '' END),120,' ')) END AS denominacao_item,
    COALESCE(cf.codigo, '') AS codigo_ncm,
    i.codigo_servico,
    cfop.cfop AS cfop,
    u.sigla AS sigla_unidade,
    tu.permite_fracionamento AS permite_fracionamento,
    infe.quantidade,
    infe.valor_unitario,
    infe.total_produto AS total_item,
    infe.rateio_frete,
    infe.rateio_seguro,
    infe.desconto,
    infe.rateio_despesa_acessoria,
    le.tipo AS tipo_le,
    i.tipo_item,
    i.origem_produto,
    i.origem_produto || (COALESCE(cst_icms.codigo, 'XX')) AS codigo_cst_icms,
    infe.base_icms_reduzida AS base_icms,
    infe.aliquota_icms,
    infe.icms,
    infe.base_icms_substituicao,
    infe.icms_substituicao,
    CAST(0 AS DECIMAL(12,2)) AS base_icms_st_retido,
    CAST(0 AS DECIMAL(12,2)) AS icms_st_retido,
    infe.id_tipo_tributacao_pis,
    infe.id_cst_pis,
    cst_pis.codigo AS codigo_cst_pis,
    infe.base_pis,
    infe.aliquota_pis,
    infe.pis,
    infe.id_tipo_tributacao_cofins,
    infe.id_cst_cofins,
    cst_cofins.codigo AS codigo_cst_cofins,
    infe.base_cofins,
    infe.aliquota_cofins,
    infe.cofins,
    CAST(0 AS DECIMAL(12,2)) AS base_iss,
    CAST(0 AS DECIMAL(12,2)) AS aliquota_iss,
    CAST(0 AS DECIMAL(12,2)) AS iss,
    infe.id_cst_ipi,
    cst_ipi.codigo AS codigo_cst_ipi,
    infe.ipi,
    infe.fcp,
    infe.base_fcp,
    infe.aliquota_fcp,
    infe.fcp_st_retido,
    infe.aliquota_fcp_st_retido,
    infe.base_fcp_st_retido,
    CASE WHEN infe.base_fcp > 0 OR infe.aliquota_fcp > 0 OR infe.fcp > 0 OR infe.fcp_st_retido > 0 OR infe.aliquota_fcp_st_retido > 0 OR infe.base_fcp_st_retido > 0 THEN TRUE ELSE FALSE END AS tem_fcp
FROM    item_nfe AS infe
    INNER JOIN nota_fiscal_entrada AS nfe ON (nfe.id_nota_fiscal_entrada = infe.id_nota_fiscal_entrada)
    INNER JOIN modelo_documento_fiscal AS mdf ON (mdf.id_modelo_documento_fiscal = nfe.id_modelo_documento_fiscal)
    INNER JOIN item AS i ON (i.id_item = infe.id_item)
    INNER JOIN item_empresa AS ie ON (ie.id_item = i.id_item AND ie.id_empresa = nfe.id_empresa)
    INNER JOIN cfop ON (cfop.id_cfop = infe.id_cfop)
    INNER JOIN unidade_medida AS u ON (u.id_unidade_medida = infe.id_unidade_medida)
    INNER JOIN tipo_unidade_medida AS tu ON (tu.id_tipo_unidade_medida = u.id_tipo_unidade_medida)
    INNER JOIN local_estoque AS le ON (le.id_local_estoque = infe.id_local_estoque)
    LEFT OUTER JOIN cst AS cst_icms ON (cst_icms.id_cst = infe.id_cst_icms)
    INNER JOIN cst AS cst_pis ON (cst_pis.id_cst = infe.id_cst_pis)
    INNER JOIN cst AS cst_cofins ON (cst_cofins.id_cst = infe.id_cst_cofins)
    LEFT OUTER JOIN cst AS cst_ipi ON (cst_ipi.id_cst = infe.id_cst_ipi)
    INNER JOIN tipo_tributacao AS tt ON (tt.id_tipo_tributacao = infe.id_tipo_tributacao)
    LEFT JOIN codigo_fiscal cf ON (cf.id_codigo_fiscal = i.id_codigo_fiscal AND cf.tipo = 1)
WHERE   infe.id_nota_fiscal_entrada = :Id
AND EXISTS(SELECT 1 FROM item_nfe AS i1 INNER JOIN cfop AS c1 ON (c1.id_cfop = i1.id_cfop)
        WHERE id_nota_fiscal_entrada = nfe.id_nota_fiscal_entrada AND c1.entrada_saida = 1)
ORDER BY 1