CREATE OR ALTER procedure SP_CFE_ESTOQUE (
    PDV_CFE_ID integer,
    ESTABELECIMENTO_ID integer,
    CLIENTE_ID integer,
    CAIXA_ID integer,
    NUMERO_CFE integer,
    SERIE_CFE varchar(3),
    DATA_EMISSAO date,
    ACAO integer,
    TRAVAR_SE_FALHAR char(1) = '1')
as
declare variable ID integer;
declare variable PRODUTO_ID integer;
declare variable PRODUTO_DESCRICAO varchar(200);
declare variable DESC_ESTABELECIMENTO varchar(500);
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(15,2);
declare variable SALDO numeric(15,2);
declare variable SALDO_HOJE numeric(15,2);
declare variable LOCALIZACAO_ID integer;
declare variable DESC_LOCALIZACAO varchar(500);
declare variable DESC_TAMANHO varchar(500);
declare variable OPERACAO_CODIGO varchar(3);
declare variable ESTOQUE_ID integer;
declare variable SEQUENCIA integer;
declare variable GRADE_CODIGO integer;
declare variable EMAIL varchar(300);
declare variable CORPO varchar(1000);
declare variable TRANSACAO_ID integer;
declare variable CHECK_ESTOQUE integer;
declare variable CONTROLE_ESTOQUE CHAR(1);
BEGIN

    FOR SELECT
            T.ID,
            T.PRODUTO_ID,
            T.PRODUTO_DESCRICAO,
            T.LOCALIZACAO_ID,
            T.OPERACAO_CODIGO,
            T.TAMANHO,
            T.QUANTIDADE,
            T.ESTOQUE_ID,
            T.SEQUENCIA,
            P.GRADE_CODIGO,
            O.CONTROLE_ESTOQUE
        FROM TBPDV_CFE_ITEM T, TBPDV_CFE C, TBPRODUTO P, TBOPERACAO O
        WHERE C.ID = T.PDV_CFE_ID
        AND P.CODIGO = T.PRODUTO_ID
        AND O.CODIGO = T.OPERACAO_CODIGO
        AND T.PDV_CFE_ID = :PDV_CFE_ID
        AND C.IMPORTACAO = 0
        INTO :ID, :PRODUTO_ID, :PRODUTO_DESCRICAO, :LOCALIZACAO_ID,
            :OPERACAO_CODIGO, :TAMANHO, :QUANTIDADE, :ESTOQUE_ID, :SEQUENCIA, :GRADE_CODIGO, :CONTROLE_ESTOQUE
        
        DO BEGIN

            :CHECK_ESTOQUE = CAST(FN_PARAMETRO('TBPDV.CHECK_ESTOQUE') AS INTEGER);

            IF(:CONTROLE_ESTOQUE = '1')THEN
            BEGIN

                IF(:ACAO = 1) THEN   /* INSERT - REALIZAR TRANSAÇÃO DE ESTOQUE */
                BEGIN
                    :SALDO = FN_ESTOQUE_SALDO_DIARIO_DISP(:ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :PRODUTO_ID, :TAMANHO, :DATA_EMISSAO);
    
                    :SALDO_HOJE = FN_ESTOQUE_SALDO(:ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :PRODUTO_ID, :TAMANHO);
    
                    IF((:SALDO < :QUANTIDADE) or (:SALDO_HOJE < :QUANTIDADE)) THEN
                        BEGIN
    
                           :EMAIL = FN_PARAMETRO('SISTEMA.EMAIL_EST_PDV_INDISPONIVEL');
    
                           SELECT FIRST 1 FN_LPAD(K.CODIGO, 4, '0')||' - '||K.NOMEFANTASIA FROM TBESTABELECIMENTO K WHERE K.CODIGO = :ESTABELECIMENTO_ID
                                INTO :DESC_ESTABELECIMENTO;
    
                           SELECT FIRST 1 FN_LPAD(K.CODIGO, 4, '0')||' - '||K.DESCRICAO FROM TBLOCALIZACAO K WHERE K.CODIGO = :LOCALIZACAO_ID
                                INTO :DESC_LOCALIZACAO;
    
                           :DESC_TAMANHO = FN_TAMANHO_GRADE(:GRADE_CODIGO, :TAMANHO);
    
                           CORPO = 'ESTOQUE INDISPONIVEL PARA IMPORTACAO DE ITENS DO MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||'<BR>';
                                CORPO = CORPO||'ESTABELECIMENTO: '||:DESC_ESTABELECIMENTO||'<BR>';
                                CORPO = CORPO||'LOCALIZACAO: '||:DESC_LOCALIZACAO||'<BR>';
                                CORPO = CORPO||'PRODUTO: '||:PRODUTO_ID||' - '||:PRODUTO_DESCRICAO||'<BR>';
                                CORPO = CORPO||'TAMANHO: '||:DESC_TAMANHO||'<BR>';
        
                           IF(CHAR_LENGTH(:EMAIL) > 0)THEN
                           BEGIN
                                IN AUTONOMOUS TRANSACTION DO
                                BEGIN
                                    EXECUTE PROCEDURE SPI_EMAIL(:EMAIL, 'ERRO DE ESTOQUE NO PDV. MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||' ITEM: '||:SEQUENCIA, :CORPO, 1);
                                END
                           END
    
                           UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 0 WHERE PDV_CFE_ITEM_ID = :ID;
            
                           IF(:TRAVAR_SE_FALHAR = '0' AND :CHECK_ESTOQUE = 1) THEN
                           BEGIN
                               EXCEPTION "..." 'ERRO DE ESTOQUE NO PDV. MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||' ITEM: '||:SEQUENCIA;
                           END
                           
            
                        END ELSE
                        BEGIN
    
    
                            :TRANSACAO_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
    
                            EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO('TBPDV_CFE_ITEM', 0, :ID,
                                :ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :DATA_EMISSAO, :PRODUTO_ID,
                                :TAMANHO, :QUANTIDADE, 'S', :OPERACAO_CODIGO, 0, '', 'BAIXA AUTOMATICA DE ESTOQUE',
                                :TRANSACAO_ID, :NUMERO_CFE, NULL, NULL, 0, 0, :ID, 0);
    
                            /* INSERIR TRANSACAO */
                            UPDATE TBPDV_CFE_ITEM SET ESTOQUE_ID = :TRANSACAO_ID WHERE ID = :ID;
    
                            /* ATUALIZAR TRATAMENTO DO ITEM */
                            UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 1 WHERE PDV_CFE_ITEM_ID = :ID;
    
                            WHEN ANY DO
                            BEGIN
                                :EMAIL = FN_PARAMETRO('SISTEMA.EMAIL_EST_PDV_INDISPONIVEL');
    
                               SELECT FIRST 1 FN_LPAD(K.CODIGO, 4, '0')||' - '||K.NOMEFANTASIA FROM TBESTABELECIMENTO K WHERE K.CODIGO = :ESTABELECIMENTO_ID
                                    INTO :DESC_ESTABELECIMENTO;
        
                               SELECT FIRST 1 FN_LPAD(K.CODIGO, 4, '0')||' - '||K.DESCRICAO FROM TBLOCALIZACAO K WHERE K.CODIGO = :LOCALIZACAO_ID
                                    INTO :DESC_LOCALIZACAO;
        
                               :DESC_TAMANHO = FN_TAMANHO_GRADE(:GRADE_CODIGO, :TAMANHO);
        
                               CORPO = 'ESTOQUE INDISPONIVEL PARA IMPORTACAO DE ITENS DO MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||'<BR>';
                                    CORPO = CORPO||'ESTABELECIMENTO: '||:DESC_ESTABELECIMENTO||'<BR>';
                                    CORPO = CORPO||'LOCALIZACAO: '||:DESC_LOCALIZACAO||'<BR>';
                                    CORPO = CORPO||'PRODUTO: '||:PRODUTO_ID||' - '||:PRODUTO_DESCRICAO||'<BR>';
                                    CORPO = CORPO||'TAMANHO: '||:DESC_TAMANHO||'<BR>';
            
                               IF(CHAR_LENGTH(:EMAIL) > 0)THEN
                               BEGIN
                                    IN AUTONOMOUS TRANSACTION DO
                                    BEGIN
                                        EXECUTE PROCEDURE SPI_EMAIL(:EMAIL, 'ERRO DE ESTOQUE NO PDV. MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||' ITEM: '||:SEQUENCIA, :CORPO, 1);
                                    END
                               END
        
                               UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 0 WHERE PDV_CFE_ITEM_ID = :ID;
                
                               IF(:TRAVAR_SE_FALHAR = '0' AND :CHECK_ESTOQUE = 1) THEN
                               BEGIN
                                   EXCEPTION "..." 'ERRO DE ESTOQUE NO PDV. MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||' ITEM: '||:SEQUENCIA;
                               END
                                    
    
                            END
    
    
    
    
    
    
                        END
                END ELSE
                IF(:ACAO = 2) THEN  /* EXCLUIR TRANSAÇÃO DE ESTOQUE */
                BEGIN
                    :TRANSACAO_ID = 0;
                    DELETE FROM TBESTOQUE_TRANSACAO_ITEM I WHERE I.CONTROLE = :ESTOQUE_ID;
                    
                    /* EXCLUIR TRANSACAO */
                    UPDATE TBPDV_CFE_ITEM SET ESTOQUE_ID = :TRANSACAO_ID WHERE ID = :ID;
    
                    /* ATUALIZAR TRATAMENTO DO ITEM */
                    UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 0 WHERE PDV_CFE_ITEM_ID = :ID;
                END

             END

        END


END;


CREATE OR ALTER procedure SP_CFE_ITEM_ESTOQUE (
    PDV_CFE_ID integer,
    PDV_CFE_ITEM_ID integer,
    ESTABELECIMENTO_ID integer,
    CLIENTE_ID integer,
    CAIXA_ID integer,
    NUMERO_CFE integer,
    SERIE_CFE varchar(3),
    DATA_EMISSAO date,
    ACAO integer,
    TRAVAR_SE_FALHAR char(1) = '1')
as
declare variable ID integer;
declare variable PRODUTO_ID integer;
declare variable PRODUTO_DESCRICAO varchar(200);
declare variable DESC_ESTABELECIMENTO varchar(500);
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(15,2);
declare variable SALDO numeric(15,2);
declare variable SALDO_HOJE numeric(15,2);
declare variable LOCALIZACAO_ID integer;
declare variable DESC_LOCALIZACAO varchar(500);
declare variable DESC_TAMANHO varchar(500);
declare variable OPERACAO_CODIGO varchar(3);
declare variable ESTOQUE_ID integer;
declare variable SEQUENCIA integer;
declare variable GRADE_CODIGO integer;
declare variable EMAIL varchar(300);
declare variable CORPO varchar(1000);
declare variable TRANSACAO_ID integer;
declare variable CHECK_ESTOQUE integer;
declare variable CONTROLE_ESTOQUE CHAR(1);
BEGIN

    FOR SELECT FIRST 1
            T.ID,
            T.PRODUTO_ID,
            T.PRODUTO_DESCRICAO,
            T.LOCALIZACAO_ID,
            T.OPERACAO_CODIGO,
            T.TAMANHO,
            T.QUANTIDADE,
            T.ESTOQUE_ID,
            T.SEQUENCIA,
            P.GRADE_CODIGO,
            O.CONTROLE_ESTOQUE
        FROM TBPDV_CFE_ITEM T, TBPRODUTO P, TBOPERACAO O
        WHERE P.CODIGO = T.PRODUTO_ID
        AND O.CODIGO = T.OPERACAO_CODIGO
        AND T.PDV_CFE_ID = :PDV_CFE_ID
        AND T.ID = :PDV_CFE_ITEM_ID
        INTO :ID, :PRODUTO_ID, :PRODUTO_DESCRICAO, :LOCALIZACAO_ID,
            :OPERACAO_CODIGO, :TAMANHO, :QUANTIDADE, :ESTOQUE_ID, :SEQUENCIA, :GRADE_CODIGO, :CONTROLE_ESTOQUE
        
        DO BEGIN

            :CHECK_ESTOQUE = CAST(FN_PARAMETRO('TBPDV.CHECK_ESTOQUE') AS INTEGER);

            IF(:CONTROLE_ESTOQUE = '1')THEN
            BEGIN

                IF(:ACAO = 1) THEN   /* INSERT - REALIZAR TRANSAÇÃO DE ESTOQUE */
                BEGIN
                    :SALDO = FN_ESTOQUE_SALDO_DIARIO_DISP(:ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :PRODUTO_ID, :TAMANHO, :DATA_EMISSAO);
    
                    :SALDO_HOJE = FN_ESTOQUE_SALDO(:ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :PRODUTO_ID, :TAMANHO);
    
                    IF((:SALDO < :QUANTIDADE) OR (:SALDO_HOJE < :QUANTIDADE)) THEN
                        BEGIN
                           :EMAIL = FN_PARAMETRO('SISTEMA.EMAIL_EST_PDV_INDISPONIVEL');
    
                           SELECT FIRST 1 FN_LPAD(K.CODIGO, 4, '0')||' - '||K.NOMEFANTASIA FROM TBESTABELECIMENTO K WHERE K.CODIGO = :ESTABELECIMENTO_ID
                                INTO :DESC_ESTABELECIMENTO;
    
                           SELECT FIRST 1 FN_LPAD(K.CODIGO, 4, '0')||' - '||K.DESCRICAO FROM TBLOCALIZACAO K WHERE K.CODIGO = :LOCALIZACAO_ID
                                INTO :DESC_LOCALIZACAO;
    
                           :DESC_TAMANHO = FN_TAMANHO_GRADE(:GRADE_CODIGO, :TAMANHO);
    
                           CORPO = 'ESTOQUE INDISPONIVEL NO DIA '||FORMATDATE(:DATA_EMISSAO)||' PARA IMPORTACAO DE ITENS DO MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||'<BR>';
                                CORPO = CORPO||'ESTABELECIMENTO: '||:DESC_ESTABELECIMENTO||'<BR>';
                                CORPO = CORPO||'LOCALIZACAO: '||:DESC_LOCALIZACAO||'<BR>';
                                CORPO = CORPO||'PRODUTO: '||:PRODUTO_ID||' - '||:PRODUTO_DESCRICAO||'<BR>';
                                CORPO = CORPO||'TAMANHO: '||:DESC_TAMANHO||'<BR>';
        
                           IF(CHAR_LENGTH(:EMAIL) > 0)THEN
                           BEGIN
                                IN AUTONOMOUS TRANSACTION DO
                                BEGIN
                                    EXECUTE PROCEDURE SPI_EMAIL(:EMAIL, 'ERRO DE ESTOQUE NO PDV. MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||' ITEM: '||:SEQUENCIA, :CORPO, 1);
                                END
                           END
    
                           UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 0 WHERE PDV_CFE_ITEM_ID = :ID;
            
                           IF(:TRAVAR_SE_FALHAR = '0' AND :CHECK_ESTOQUE = 1) THEN
                           BEGIN
                               EXCEPTION "..." 'ERRO DE ESTOQUE NO PDV. MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||' ITEM: '||:SEQUENCIA;
                           END
                           
            
                        END ELSE
                        BEGIN
    
    
                            :TRANSACAO_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
                            EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO('TBPDV_CFE_ITEM', 0, :ID,
                                :ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :DATA_EMISSAO, :PRODUTO_ID,
                                :TAMANHO, :QUANTIDADE, 'S', :OPERACAO_CODIGO, 0, '', 'BAIXA AUTOMATICA DE ESTOQUE',
                                :TRANSACAO_ID, :NUMERO_CFE, NULL, NULL, 0, 0, :ID, 0);
    
                            /* INSERIR TRANSACAO */
                            UPDATE TBPDV_CFE_ITEM SET ESTOQUE_ID = :TRANSACAO_ID WHERE ID = :ID;
    
                            /* ATUALIZAR TRATAMENTO DO ITEM */
                            UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 1 WHERE PDV_CFE_ITEM_ID = :ID;
    
                            WHEN ANY DO
                            BEGIN
                                :EMAIL = FN_PARAMETRO('SISTEMA.EMAIL_EST_PDV_INDISPONIVEL');
    
                               SELECT FIRST 1 FN_LPAD(K.CODIGO, 4, '0')||' - '||K.NOMEFANTASIA FROM TBESTABELECIMENTO K WHERE K.CODIGO = :ESTABELECIMENTO_ID
                                    INTO :DESC_ESTABELECIMENTO;
        
                               SELECT FIRST 1 FN_LPAD(K.CODIGO, 4, '0')||' - '||K.DESCRICAO FROM TBLOCALIZACAO K WHERE K.CODIGO = :LOCALIZACAO_ID
                                    INTO :DESC_LOCALIZACAO;
        
                               :DESC_TAMANHO = FN_TAMANHO_GRADE(:GRADE_CODIGO, :TAMANHO);
        
                               CORPO = 'ESTOQUE INDISPONIVEL PARA IMPORTACAO DE ITENS DO MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||'<BR>';
                                    CORPO = CORPO||'ESTABELECIMENTO: '||:DESC_ESTABELECIMENTO||'<BR>';
                                    CORPO = CORPO||'LOCALIZACAO: '||:DESC_LOCALIZACAO||'<BR>';
                                    CORPO = CORPO||'PRODUTO: '||:PRODUTO_ID||' - '||:PRODUTO_DESCRICAO||'<BR>';
                                    CORPO = CORPO||'TAMANHO: '||:DESC_TAMANHO||'<BR>';
            
                               IF(CHAR_LENGTH(:EMAIL) > 0)THEN
                               BEGIN
                                    IN AUTONOMOUS TRANSACTION DO
                                    BEGIN
                                        EXECUTE PROCEDURE SPI_EMAIL(:EMAIL, 'ERRO DE ESTOQUE NO PDV. MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||' ITEM: '||:SEQUENCIA, :CORPO, 1);
                                    END
                               END
        
                               UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 0 WHERE PDV_CFE_ITEM_ID = :ID;
                
                               IF(:TRAVAR_SE_FALHAR = '0' AND :CHECK_ESTOQUE = 1) THEN
                               BEGIN
                                   EXCEPTION "..." 'ERRO DE ESTOQUE NO PDV. MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||' ITEM: '||:SEQUENCIA;
                               END
                                    
    
                            END
                         END
    
    
                END ELSE
                IF(:ACAO = 2) THEN  /* EXCLUIR TRANSAÇÃO DE ESTOQUE */
                BEGIN
                    :TRANSACAO_ID = 0;
                    DELETE FROM TBESTOQUE_TRANSACAO_ITEM I WHERE I.CONTROLE = :ESTOQUE_ID;
                    
                    /* EXCLUIR TRANSACAO */
                    UPDATE TBPDV_CFE_ITEM SET ESTOQUE_ID = :TRANSACAO_ID WHERE ID = :ID;
    
                    /* ATUALIZAR TRATAMENTO DO ITEM */
                    UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 0 WHERE PDV_CFE_ITEM_ID = :ID;
                END
            END

        END


END;

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(200);
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;

CREATE OR ALTER VIEW VWPDV_PRODUTOS(
    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)
AS
SELECT
ESTABELECIMENTO_ID,
LOCALIZACAO_ID,
FAMILIA_ID,
MODELO_ID,
PRODUTO_ID,
CAST(PRODUTO_DESCRICAO||' '||TAM_DESCRICAO AS VARCHAR(200)) AS PRODUTO_DESCRICAO,
COR_DESCRICAO,
UM,
NCM,
EAN,
TAMANHO,
FRACIONAR,
CEST,
CFOP_CODIGO,
OPERACAO_CODIGO,
TABELA_PRECO_ID,
VALOR_UNITARIO,
CAST(FN_ARRAY(VALOR_QUANTIDADE_PROMOCIONAL,1,'|') AS NUMERIC(15,2)) VALOR_UNITARIO_PROMOCIONAL,
CAST(FN_ARRAY(VALOR_QUANTIDADE_PROMOCIONAL,2,'|') AS INTEGER) QUANTIDADE_MINIMA,
TRIBUTACAO_ORIGEM,
TRIBUTACAO_ICMS,
ICMS_ALIQUOTA,
TRIBUTACAO_PIS,
PIS_ALIQUOTA,
TRIBUTACAO_COFINS,
COFINS_ALIQUOTA,
REDUCAO_BASE_PISCOF,
TIPO_DESCONTO,
TAM_DESCRICAO

FROM (
            SELECT 
                B.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID,
                B.LOCALIZACAO_PDV AS LOCALIZACAO_ID,
                P.FAMILIA_INVENTARIO AS FAMILIA_ID,
                M.CODIGO AS MODELO_ID,
                P.CODIGO AS PRODUTO_ID,
                IIF(COALESCE(N.DESCRICAO_PDV,'') <> '' AND N.DESCRICAO_PDV <> '0', COALESCE(N.DESCRICAO_PDV,''),
                   IIF(COALESCE(M.DESCRICAO_COMERCIAL,'') <> '' AND M.DESCRICAO_COMERCIAL <> '0',
                       COALESCE(UPPER(M.DESCRICAO_COMERCIAL),'')||' '||COALESCE(UPPER(H.DESCRICAO),''),
                          COALESCE(UPPER(P.DESCRICAO),'')/*||' '||COALESCE(UPPER(H.DESCRICAO),'')*/)) PRODUTO_DESCRICAO,
                H.DESCRICAO AS COR_DESCRICAO,
                P.UNIDADEMEDIDA_SIGLA AS UM,
                P.NCM_CODIGO AS NCM,
                E.PREFIXO||E.CODIGO||COALESCE((SELECT DIGITO FROM DIGITOEAN(E.PREFIXO||E.CODIGO)),'') AS EAN,
                E.TAMANHO,

               (SELECT U.PODE_FRACIONAR FROM TbUnidadeMedida U WHERE U.SIGLA = P.UNIDADEMEDIDA_SIGLA) FRACIONAR,
               (SELECT CEST FROM TBFAMILIA F WHERE F.CODIGO = P.FAMILIA_INVENTARIO) CEST,
                B.CFOP_CODIGO,
                B.OPERACAO_PDV AS OPERACAO_CODIGO,
                MP.TABELA_ID   AS TABELA_PRECO_ID,
                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), '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,
                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
                 LEFT JOIN TBPRODUTO_FICHA N ON N.PRODUTO_CODIGO = P.CODIGO 

            WHERE MP.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO
              AND 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 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 */
);