CREATE OR ALTER procedure SPUI_PDV_PRODUTOS
as
declare variable ESTABELECIMENTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable FAMILIA_ID integer;
declare variable MODELO_ID integer;
declare variable PRODUTO_ID integer;
declare variable PRODUTO_DESCRICAO varchar(172);
declare variable COR_DESCRICAO varchar(20);
declare variable UM varchar(3);
declare variable NCM varchar(10);
declare variable EAN varchar(32);
declare variable TAMANHO integer;
declare variable FRACIONAR char(1);
declare variable CEST varchar(10);
declare variable CFOP_CODIGO varchar(5);
declare variable OPERACAO_CODIGO varchar(3);
declare variable TABELA_PRECO_ID integer;
declare variable VALOR_UNITARIO numeric(18,5);
declare variable VALOR_UNITARIO_PROMOCIONAL numeric(18,2);
declare variable QUANTIDADE_MINIMA integer;
declare variable TRIBUTACAO_ORIGEM char(1);
declare variable TRIBUTACAO_ICMS char(3);
declare variable PERCENTUAL_BASECALCULO_ICMS numeric(10,5);
declare variable ICMS_ALIQUOTA numeric(18,4);
declare variable TRIBUTACAO_PIS char(3);
declare variable PIS_ALIQUOTA numeric(18,4);
declare variable TRIBUTACAO_COFINS char(3);
declare variable COFINS_ALIQUOTA numeric(18,4);
declare variable REDUCAO_BASE_PISCOF char(1);
declare variable TIPO_DESCONTO varchar(1);
declare variable TAM_DESCRICAO varchar(50);
BEGIN
        /* ALIMENTAR TABELA DE PRODUTOS DO PDV */
        FOR

            SELECT
                T.*,
                IIF(T.TRIBUTACAO_ICMS IS NOT NULL AND T.TRIBUTACAO_ICMS <> '', (SELECT FIRST 1 I.BASECALCULO FROM TBTRIBUTACAO_ICMS I WHERE I.CODIGO = CAST(T.TRIBUTACAO_ICMS AS INTEGER)), 0) AS PERCENTUAL_BASECALCULO_ICMS
    
            FROM VWPDV_PRODUTOS T
            INTO :ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :FAMILIA_ID, :MODELO_ID, :PRODUTO_ID, :PRODUTO_DESCRICAO, :COR_DESCRICAO, :UM, :NCM,
         :EAN, :TAMANHO, :FRACIONAR, :CEST, :CFOP_CODIGO, :OPERACAO_CODIGO, :TABELA_PRECO_ID, :VALOR_UNITARIO,
         :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, :PERCENTUAL_BASECALCULO_ICMS

        DO BEGIN

            UPDATE OR INSERT INTO TBPDV_PRODUTOS (ESTABELECIMENTO_ID, LOCALIZACAO_ID, FAMILIA_ID, MODELO_ID, PRODUTO_ID,
                PRODUTO_DESCRICAO, COR_DESCRICAO, UM, NCM, EAN, TAMANHO, TAM_DESCRICAO, FRACIONAR, CEST,
                CFOP_CODIGO, OPERACAO_CODIGO, TABELA_PRECO_ID, VALOR_UNITARIO,
                VALOR_UNITARIO_PROMOCIONAL, QUANTIDADE_MINIMA, TRIBUTACAO_ORIGEM, TRIBUTACAO_ICMS,
                PERCENTUAL_BASECALCULO_ICMS, ICMS_ALIQUOTA, TRIBUTACAO_PIS, PIS_ALIQUOTA,
                TRIBUTACAO_COFINS, COFINS_ALIQUOTA, REDUCAO_BASE_PISCOF, TIPO_DESCONTO)
            VALUES (:ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :FAMILIA_ID, :MODELO_ID, :PRODUTO_ID, :PRODUTO_DESCRICAO, :COR_DESCRICAO, :UM, :NCM,
                    :EAN, :TAMANHO, :TAM_DESCRICAO, :FRACIONAR, :CEST, :CFOP_CODIGO, :OPERACAO_CODIGO, :TABELA_PRECO_ID,
                    :VALOR_UNITARIO, :VALOR_UNITARIO_PROMOCIONAL, :QUANTIDADE_MINIMA, :TRIBUTACAO_ORIGEM, :TRIBUTACAO_ICMS,
                    :PERCENTUAL_BASECALCULO_ICMS, :ICMS_ALIQUOTA, :TRIBUTACAO_PIS, :PIS_ALIQUOTA, :TRIBUTACAO_COFINS,
                    :COFINS_ALIQUOTA, :REDUCAO_BASE_PISCOF, :TIPO_DESCONTO)
            MATCHING (ESTABELECIMENTO_ID, TABELA_PRECO_ID, PRODUTO_ID, TAMANHO);


        END

        :ESTABELECIMENTO_ID     = 0;
        :TABELA_PRECO_ID        = 0;
        :PRODUTO_ID             = 0;
        :TAMANHO                = 0;

        /* DELETAR PRODUTOS QUE FORAM ALTERADOS NA VIEW */
        FOR

            SELECT
                T.ESTABELECIMENTO_ID,
                T.TABELA_PRECO_ID,
                T.PRODUTO_ID,
                T.TAMANHO

            FROM TBPDV_PRODUTOS T
            LEFT JOIN VWPDV_PRODUTOS VW ON VW.ESTABELECIMENTO_ID = T.ESTABELECIMENTO_ID
            AND VW.TABELA_PRECO_ID = T.TABELA_PRECO_ID AND VW.PRODUTO_ID = T.PRODUTO_ID
            AND VW.TAMANHO = T.TAMANHO
            WHERE VW.ESTABELECIMENTO_ID IS NULL
            INTO :ESTABELECIMENTO_ID, :TABELA_PRECO_ID, :PRODUTO_ID, :TAMANHO

        DO BEGIN

            IF(:ESTABELECIMENTO_ID > 0) THEN
            BEGIN
                DELETE FROM TBPDV_PRODUTOS T WHERE T.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                AND T.TABELA_PRECO_ID = :TABELA_PRECO_ID
                AND T.PRODUTO_ID = :PRODUTO_ID
                AND T.TAMANHO = :TAMANHO;

            END


        END
END;