SET TERM ^ ;

CREATE OR ALTER procedure SPC_PDV_PRODUTOS (
    ESTABELECIMENTO_ID_PARAM integer = 0,
    TABELA_PRECO_ID_PARAM integer = 0,
    EAN_PARAM varchar(13) = '',
    DESCRICAO_PRODUTO varchar(1000) = '')
returns (
    ESTABELECIMENTO_ID integer,
    LOCALIZACAO_ID integer,
    FAMILIA_ID integer,
    FAMILIA_DESCRICAO varchar(200),
    MODELO_ID integer,
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(500),
    DESC_PRODUTO varchar(500),
    COR_ID integer,
    COR_DESCRICAO varchar(200),
    UM varchar(50),
    NCM varchar(50),
    EAN varchar(50),
    EAN_2 varchar(50),
    TAMANHO integer,
    FRACIONAR varchar(20),
    CEST varchar(20),
    CFOP_CODIGO varchar(10),
    OPERACAO_CODIGO varchar(10),
    TABELA_PRECO_ID integer,
    TABELA_PRECO_ID_PROMOCIONAL integer,
    VALOR_UNITARIO_PROMOCIONAL numeric(18,2),
    QUANTIDADE_MINIMA integer,
    TRIBUTACAO_ORIGEM char(1),
    TRIBUTACAO_ICMS integer,
    ICMS_ALIQUOTA numeric(18,4),
    TRIBUTACAO_PIS char(3),
    PIS_ALIQUOTA numeric(18,4),
    TRIBUTACAO_COFINS char(3),
    COFINS_ALIQUOTA numeric(18,4),
    REDUCAO_BASE_PISCOF char(1),
    TIPO_DESCONTO varchar(1),
    TAM_DESCRICAO varchar(50),
    VALOR_UNITARIO numeric(18,5),
    PERCENTUAL_BASECALCULO_ICMS numeric(18,5),
    DESC_LOCALIZACAO_ID varchar(50),
    LOCALIZACAO_DESCRICAO varchar(200))
as
BEGIN
    FOR
        SELECT
            V.ESTABELECIMENTO_ID,
            V.LOCALIZACAO_ID,
            V.FAMILIA_ID,
            F.DESCRICAO AS FAMILIA_DESCRICAO,
            V.MODELO_ID,
            V.PRODUTO_ID,
            CAST(V.PRODUTO_DESCRICAO||' '||V.TAM_DESCRICAO AS VARCHAR(200)) AS PRODUTO_DESCRICAO,
            FN_LPAD(V.PRODUTO_ID, 7, '0')||' - '||CAST(V.PRODUTO_DESCRICAO||' '||V.TAM_DESCRICAO AS VARCHAR(200)) AS DESC_PRODUTO,
            V.COR_ID,
            V.COR_DESCRICAO,
            V.UM,
            V.NCM,
            V.EAN,
            V.EAN_2,
            V.TAMANHO,
            V.FRACIONAR,
            F.CEST,
            V.CFOP_CODIGO,
            V.OPERACAO_CODIGO,
            V.TABELA_PRECO_ID,
            V.TABELA_PRECO_ID_PROMOCIONAL,
            CAST(FN_ARRAY(V.VALOR_QUANTIDADE_PROMOCIONAL,1,'|') AS NUMERIC(15,2)) VALOR_UNITARIO_PROMOCIONAL,
            CAST(FN_ARRAY(V.VALOR_QUANTIDADE_PROMOCIONAL,2,'|') AS INTEGER) QUANTIDADE_MINIMA,
            V.TRIBUTACAO_ORIGEM,
            V.TRIBUTACAO_ICMS,
            V.ICMS_ALIQUOTA,
            V.TRIBUTACAO_PIS,
            V.PIS_ALIQUOTA,
            V.TRIBUTACAO_COFINS,
            V.COFINS_ALIQUOTA,
            V.REDUCAO_BASE_PISCOF,
            V.TIPO_DESCONTO,
            V.TAM_DESCRICAO,
            
            IIF(V.TAMANHO = 1 AND COALESCE(PP.PR_NF_01, 0) > 0, COALESCE(PP.PR_NF_01, 0),
            IIF(V.TAMANHO = 2 AND COALESCE(PP.PR_NF_02, 0) > 0, COALESCE(PP.PR_NF_02, 0),
            IIF(V.TAMANHO = 3 AND COALESCE(PP.PR_NF_03, 0) > 0, COALESCE(PP.PR_NF_03, 0),
            IIF(V.TAMANHO = 4 AND COALESCE(PP.PR_NF_04, 0) > 0, COALESCE(PP.PR_NF_04, 0),
            IIF(V.TAMANHO = 5 AND COALESCE(PP.PR_NF_05, 0) > 0, COALESCE(PP.PR_NF_05, 0),
            IIF(V.TAMANHO = 6 AND COALESCE(PP.PR_NF_06, 0) > 0, COALESCE(PP.PR_NF_06, 0),
            IIF(V.TAMANHO = 7 AND COALESCE(PP.PR_NF_07, 0) > 0, COALESCE(PP.PR_NF_07, 0),
            IIF(V.TAMANHO = 8 AND COALESCE(PP.PR_NF_08, 0) > 0, COALESCE(PP.PR_NF_08, 0),
            IIF(V.TAMANHO = 9 AND COALESCE(PP.PR_NF_09, 0) > 0, COALESCE(PP.PR_NF_09, 0),
            IIF(V.TAMANHO =10 AND COALESCE(PP.PR_NF_10, 0) > 0, COALESCE(PP.PR_NF_10, 0),
            IIF(V.TAMANHO =11 AND COALESCE(PP.PR_NF_11, 0) > 0, COALESCE(PP.PR_NF_11, 0),
            IIF(V.TAMANHO =12 AND COALESCE(PP.PR_NF_12, 0) > 0, COALESCE(PP.PR_NF_12, 0),
            IIF(V.TAMANHO =13 AND COALESCE(PP.PR_NF_13, 0) > 0, COALESCE(PP.PR_NF_13, 0),
            IIF(V.TAMANHO =14 AND COALESCE(PP.PR_NF_14, 0) > 0, COALESCE(PP.PR_NF_14, 0),
            IIF(V.TAMANHO =15 AND COALESCE(PP.PR_NF_15, 0) > 0, COALESCE(PP.PR_NF_15, 0),
            IIF(V.TAMANHO =16 AND COALESCE(PP.PR_NF_16, 0) > 0, COALESCE(PP.PR_NF_16, 0),
            IIF(V.TAMANHO =17 AND COALESCE(PP.PR_NF_17, 0) > 0, COALESCE(PP.PR_NF_17, 0),
            IIF(V.TAMANHO =18 AND COALESCE(PP.PR_NF_18, 0) > 0, COALESCE(PP.PR_NF_18, 0),
            IIF(V.TAMANHO =19 AND COALESCE(PP.PR_NF_19, 0) > 0, COALESCE(PP.PR_NF_19, 0),
            IIF(V.TAMANHO =20 AND COALESCE(PP.PR_NF_20, 0) > 0, COALESCE(PP.PR_NF_20, 0),
            IIF(COALESCE(PP.PRECO_VENDA, 0) > 0, COALESCE(PP.PRECO_VENDA, 0), V.VALOR_UNITARIO))))))))))))))))))))) AS VALOR_UNITARIO,

            IIF(V.TRIBUTACAO_ICMS IS NOT NULL AND V.TRIBUTACAO_ICMS <> '', (SELECT FIRST 1 I.BASECALCULO FROM TBTRIBUTACAO_ICMS I WHERE I.CODIGO = CAST(V.TRIBUTACAO_ICMS AS INTEGER)), 0) AS PERCENTUAL_BASECALCULO_ICMS,

            FN_LPAD(V.LOCALIZACAO_ID, 4, '0') AS DESC_LOCALIZACAO_ID,
            L.DESCRICAO AS LOCALIZACAO_DESCRICAO
            
            FROM (
                    SELECT 
                        B.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID,
                        IIF(COALESCE(TP.LOCALIZACAO_PDV, 0) > 0, TP.LOCALIZACAO_PDV, B.LOCALIZACAO_PDV) AS LOCALIZACAO_ID,
                        P.FAMILIA_INVENTARIO AS FAMILIA_ID,
                        M.CODIGO AS MODELO_ID,
                        P.CODIGO AS PRODUTO_ID,
                        COALESCE(UPPER(P.DESCRICAO),'') PRODUTO_DESCRICAO,
                        H.CODIGO AS COR_ID,
                        H.DESCRICAO AS COR_DESCRICAO,
                        P.UNIDADEMEDIDA_SIGLA AS UM,
                        P.NCM_CODIGO AS NCM,
                        E.EAN AS EAN,
                        E.EAN_2 AS EAN_2,
                        E.TAMANHO,
                       (SELECT U.PODE_FRACIONAR FROM TbUnidadeMedida U WHERE U.SIGLA = P.UNIDADEMEDIDA_SIGLA) FRACIONAR,
                        B.CFOP_CODIGO,
                        B.OPERACAO_PDV AS OPERACAO_CODIGO,
                        MP.TABELA_ID   AS TABELA_PRECO_ID,
                        TP.TABELA_PRECO_ID_PROMOCIONAL,
                        IIF(E.TAMANHO = 1 AND MP.PR_NF_01 > 0, MP.PR_NF_01,
                        IIF(E.TAMANHO = 2 AND MP.PR_NF_02 > 0, MP.PR_NF_02,
                        IIF(E.TAMANHO = 3 AND MP.PR_NF_03 > 0, MP.PR_NF_03,
                        IIF(E.TAMANHO = 4 AND MP.PR_NF_04 > 0, MP.PR_NF_04,
                        IIF(E.TAMANHO = 5 AND MP.PR_NF_05 > 0, MP.PR_NF_05,
                        IIF(E.TAMANHO = 6 AND MP.PR_NF_06 > 0, MP.PR_NF_06,
                        IIF(E.TAMANHO = 7 AND MP.PR_NF_07 > 0, MP.PR_NF_07,
                        IIF(E.TAMANHO = 8 AND MP.PR_NF_08 > 0, MP.PR_NF_08,
                        IIF(E.TAMANHO = 9 AND MP.PR_NF_09 > 0, MP.PR_NF_09,
                        IIF(E.TAMANHO =10 AND MP.PR_NF_10 > 0, MP.PR_NF_10,
                        IIF(E.TAMANHO =11 AND MP.PR_NF_11 > 0, MP.PR_NF_11,
                        IIF(E.TAMANHO =12 AND MP.PR_NF_12 > 0, MP.PR_NF_12,
                        IIF(E.TAMANHO =13 AND MP.PR_NF_13 > 0, MP.PR_NF_13,
                        IIF(E.TAMANHO =14 AND MP.PR_NF_14 > 0, MP.PR_NF_14,
                        IIF(E.TAMANHO =15 AND MP.PR_NF_15 > 0, MP.PR_NF_15,
                        IIF(E.TAMANHO =16 AND MP.PR_NF_16 > 0, MP.PR_NF_16,
                        IIF(E.TAMANHO =17 AND MP.PR_NF_17 > 0, MP.PR_NF_17,
                        IIF(E.TAMANHO =18 AND MP.PR_NF_18 > 0, MP.PR_NF_18,
                        IIF(E.TAMANHO =19 AND MP.PR_NF_19 > 0, MP.PR_NF_19,
                        IIF(E.TAMANHO =20 AND MP.PR_NF_20 > 0, MP.PR_NF_20,
                        MP.PRECO_VENDA)))))))))))))))))))) AS VALOR_UNITARIO,
        
                        IIF(TP.TABELA_PRECO_ID_PROMOCIONAL > 0,
                        COALESCE((SELECT
                            IIF(E.TAMANHO = 1 AND MPP.PR_NF_01 > 0, MPP.PR_NF_01,
                            IIF(E.TAMANHO = 2 AND MPP.PR_NF_02 > 0, MPP.PR_NF_02,
                            IIF(E.TAMANHO = 3 AND MPP.PR_NF_03 > 0, MPP.PR_NF_03,
                            IIF(E.TAMANHO = 4 AND MPP.PR_NF_04 > 0, MPP.PR_NF_04,
                            IIF(E.TAMANHO = 5 AND MPP.PR_NF_05 > 0, MPP.PR_NF_05,
                            IIF(E.TAMANHO = 6 AND MPP.PR_NF_06 > 0, MPP.PR_NF_06,
                            IIF(E.TAMANHO = 7 AND MPP.PR_NF_07 > 0, MPP.PR_NF_07,
                            IIF(E.TAMANHO = 8 AND MPP.PR_NF_08 > 0, MPP.PR_NF_08,
                            IIF(E.TAMANHO = 9 AND MPP.PR_NF_09 > 0, MPP.PR_NF_09,
                            IIF(E.TAMANHO =10 AND MPP.PR_NF_10 > 0, MPP.PR_NF_10,
                            IIF(E.TAMANHO =11 AND MPP.PR_NF_11 > 0, MPP.PR_NF_11,
                            IIF(E.TAMANHO =12 AND MPP.PR_NF_12 > 0, MPP.PR_NF_12,
                            IIF(E.TAMANHO =13 AND MPP.PR_NF_13 > 0, MPP.PR_NF_13,
                            IIF(E.TAMANHO =14 AND MPP.PR_NF_14 > 0, MPP.PR_NF_14,
                            IIF(E.TAMANHO =15 AND MPP.PR_NF_15 > 0, MPP.PR_NF_15,
                            IIF(E.TAMANHO =16 AND MPP.PR_NF_16 > 0, MPP.PR_NF_16,
                            IIF(E.TAMANHO =17 AND MPP.PR_NF_17 > 0, MPP.PR_NF_17,
                            IIF(E.TAMANHO =18 AND MPP.PR_NF_18 > 0, MPP.PR_NF_18,
                            IIF(E.TAMANHO =19 AND MPP.PR_NF_19 > 0, MPP.PR_NF_19,
                            IIF(E.TAMANHO =20 AND MPP.PR_NF_20 > 0, MPP.PR_NF_20,
                            MPP.PRECO_VENDA))))))))))))))))))))||'|'||COALESCE(MPP.QUANTIDADE_MINIMA,0)
        
                            FROM TBMODELO_PRECO MPP, TBTABELA_PRECO TPP
                            WHERE MPP.TABELA_ID = TPP.ID
                            AND MPP.MODELO_CODIGO = M.CODIGO
                            AND MPP.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO
                            AND TPP.HABILITA_PDV = '1'
                            AND CURRENT_DATE BETWEEN TPP.DATA_INICIAL AND TPP.DATA_FINAL
                            AND TPP.ID = TP.TABELA_PRECO_ID_PROMOCIONAL
                            AND TPP.STATUS = 1), '0|0'), '0|0') AS VALOR_QUANTIDADE_PROMOCIONAL,
        
                        B.CST_ORIGEM   AS TRIBUTACAO_ORIGEM,
                        B.CST          AS TRIBUTACAO_ICMS,
                        B.TAXA_ICMS    AS ICMS_ALIQUOTA,
                        COALESCE(B.CST_PISCOF,'')  AS TRIBUTACAO_PIS,
                        B.TAXA_PIS     AS PIS_ALIQUOTA,
                        COALESCE(B.CST_PISCOF,'')  AS TRIBUTACAO_COFINS,
                        B.TAXA_COFINS  AS COFINS_ALIQUOTA,
                        C.REDUCAO_BASE_PISCOF,
                        OP.TIPO_DESCONTO,
                        COALESCE(FN_TAMANHO_GRADE(P.GRADE_CODIGO, E.TAMANHO), '') AS TAM_DESCRICAO
        
                    FROM TBMODELO        M,
                         TBCOR           H,
                         TBFAMILIA_FICHA B,
                         TBMODELO_PRECO MP,
                         TBTABELA_PRECO TP,
                         TBCFOP          C,
                         TBOPERACAO     OP,
                         TBEAN           E,
                         TBPRODUTO       P
        
                    WHERE B.FAMILIA_CODIGO          = P.FAMILIA_INVENTARIO
                      AND E.MODELO_ID               = P.MODELO_CODIGO
                      AND M.CODIGO                  = P.MODELO_CODIGO
                      AND M.CODIGO                  = MP.MODELO_CODIGO
                      AND E.COR_ID                  = P.COR_CODIGO
                      AND H.CODIGO                  = P.COR_CODIGO
                      AND C.CODIGO                  = B.CFOP_CODIGO
                      AND OP.CODIGO                 = B.OPERACAO_PDV
                      AND MP.TABELA_ID              = TP.ID
                      AND IIF(MP.ESTABELECIMENTO_CODIGO > 0, MP.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO, MP.ESTABELECIMENTO_CODIGO = TP.ESTABELECIMENTO_ID)
                      AND P.STATUS                  = '1'  /* SOMENTE PRODUTOS ATIVOS */
                      AND M.STATUS                  = '1'  /* SOMENTE MODELOS  ATIVOS */
                      AND TP.HABILITA_PDV           = '1'  /* SOMENTE ITENS COM TABELA DE PRE??O HABILITADAS PARA PDV */
                      AND CURRENT_DATE BETWEEN TP.DATA_INICIAL AND TP.DATA_FINAL /* SOMENTE TABELAS DE PRE??OS VIGENTES NA DATA CORRENTE */
                      AND IIF(:ESTABELECIMENTO_ID_PARAM > 0, B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_ID_PARAM, TRUE)
                      AND IIF(:TABELA_PRECO_ID_PARAM > 0, MP.TABELA_ID = :TABELA_PRECO_ID_PARAM, TRUE)
                      AND IIF(:EAN_PARAM <> '', (E.EAN = :EAN_PARAM OR E.EAN_2 = :EAN_PARAM), TRUE)
                      AND IIF(:DESCRICAO_PRODUTO <> '', ((UPPER(P.DESCRICAO) LIKE '%'||UPPER(:DESCRICAO_PRODUTO)||'%')), TRUE)

        ) V
        INNER JOIN TBLOCALIZACAO L ON L.CODIGO = V.LOCALIZACAO_ID
        INNER JOIN TBFAMILIA F ON F.CODIGO = V.FAMILIA_ID
        LEFT JOIN TBPRODUTO_PRECO PP ON PP.PRODUTO_CODIGO = V.PRODUTO_ID AND PP.ESTABELECIMENTO_CODIGO = V.ESTABELECIMENTO_ID AND PP.TABELA_ID = V.TABELA_PRECO_ID_PROMOCIONAL
        AND COALESCE((SELECT FIRST 1 X.STATUS FROM TBTABELA_PRECO X WHERE X.ID = V.TABELA_PRECO_ID_PROMOCIONAL), 0) = 1
    INTO
        :ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :FAMILIA_ID, :FAMILIA_DESCRICAO, :MODELO_ID, :PRODUTO_ID, :PRODUTO_DESCRICAO, :DESC_PRODUTO, :COR_ID, :COR_DESCRICAO, :UM, :NCM, :EAN,
        :EAN_2, :TAMANHO, :FRACIONAR, :CEST, :CFOP_CODIGO, :OPERACAO_CODIGO, :TABELA_PRECO_ID, :TABELA_PRECO_ID_PROMOCIONAL,
        :VALOR_UNITARIO_PROMOCIONAL, :QUANTIDADE_MINIMA, :TRIBUTACAO_ORIGEM, :TRIBUTACAO_ICMS, :ICMS_ALIQUOTA, :TRIBUTACAO_PIS,
        :PIS_ALIQUOTA, :TRIBUTACAO_COFINS, :COFINS_ALIQUOTA, :REDUCAO_BASE_PISCOF, :TIPO_DESCONTO, :TAM_DESCRICAO, :VALOR_UNITARIO, :PERCENTUAL_BASECALCULO_ICMS,
        :DESC_LOCALIZACAO_ID, :LOCALIZACAO_DESCRICAO
    DO BEGIN
        SUSPEND;
    END
    

END
^

SET TERM ; ^

