SET TERM ^ ;

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 FLAG_ENVIO_EMAIL 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
        INNER JOIN TBPDV_CFE C ON C.ID = T.PDV_CFE_ID
        INNER JOIN TBPRODUTO P ON P.CODIGO = T.PRODUTO_ID
        INNER JOIN TBOPERACAO O ON O.CODIGO = T.OPERACAO_CODIGO
        WHERE 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(:ACAO = 1) THEN   /* INSERT - REALIZAR TRANSAÇÃO DE ESTOQUE */
            BEGIN
                
                IF(:CONTROLE_ESTOQUE = '1') THEN
                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
                            
                            INSERT INTO TBERROR_LOG_ESTOQUE (TABELA, TABELA_ID, MENSAGEM)
                                VALUES ('TBPDV_CFE_ITEM', :ID, 'ESTOQUE INDISPONIVEL PARA ESSE ITEM (PROCEDURE: SP_CFE_ESTOQUE)');
    
                           :EMAIL               = FN_PARAMETRO('SISTEMA.EMAIL_EST_PDV_INDISPONIVEL');
                           :FLAG_ENVIO_EMAIL    = CAST(FN_PARAMETRO('SISTEMA.FLAG_ESTOQUE_PDV') AS INTEGER);
    
                           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 AND :FLAG_ENVIO_EMAIL = 1)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
                                
                                INSERT INTO TBERROR_LOG_ESTOQUE (TABELA, TABELA_ID, MENSAGEM)
                                VALUES ('TBPDV_CFE_ITEM', :ID, 'ERRO NA ATUALIZACAO DE ESTOQUE (PROCEDURE: SP_CFE_ESTOQUE)');
    
                                :EMAIL = FN_PARAMETRO('SISTEMA.EMAIL_EST_PDV_INDISPONIVEL');
                                :FLAG_ENVIO_EMAIL    = CAST(FN_PARAMETRO('SISTEMA.FLAG_ESTOQUE_PDV') AS INTEGER);
    
                               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 AND :FLAG_ENVIO_EMAIL = 1)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
                 BEGIN
                    /* INSERIR TRANSACAO */
                    UPDATE TBPDV_CFE_ITEM SET ESTOQUE_ID = 1 WHERE ID = :ID;
    
                    /* ATUALIZAR TRATAMENTO DO ITEM */
                    UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 1 WHERE PDV_CFE_ITEM_ID = :ID;
                 END
            END ELSE
            IF(:ACAO = 2) THEN  /* EXCLUIR TRANSAÇÃO DE ESTOQUE */
            BEGIN
                IF(:CONTROLE_ESTOQUE = '1') THEN
                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
^

SET TERM ; ^

SET TERM ^ ;

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 FLAG_ENVIO_EMAIL 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
        INNER JOIN TBPRODUTO P ON P.CODIGO = T.PRODUTO_ID
        INNER JOIN TBOPERACAO O ON O.CODIGO = T.OPERACAO_CODIGO
        WHERE 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(:ACAO = 1) THEN   /* INSERT - REALIZAR TRANSAÇÃO DE ESTOQUE */
            BEGIN
                IF(:CONTROLE_ESTOQUE = '1') THEN
                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

                            INSERT INTO TBERROR_LOG_ESTOQUE (TABELA, TABELA_ID, MENSAGEM)
                                VALUES ('TBPDV_CFE_ITEM', :ID, 'ESTOQUE INDISPONIVEL PARA ESSE ITEM (PROCEDURE: SP_CFE_ITEM_ESTOQUE)');

                           :EMAIL                = FN_PARAMETRO('SISTEMA.EMAIL_EST_PDV_INDISPONIVEL');
                           :FLAG_ENVIO_EMAIL    = CAST(FN_PARAMETRO('SISTEMA.FLAG_ESTOQUE_PDV') AS INTEGER);
    
                           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 AND :FLAG_ENVIO_EMAIL = 1)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
    
                                INSERT INTO TBERROR_LOG_ESTOQUE (TABELA, TABELA_ID, MENSAGEM)
                                VALUES ('TBPDV_CFE_ITEM', :ID, 'ERRO NA ATUALIZACAO DE ESTOQUE (PROCEDURE: SP_CFE_ITEM_ESTOQUE)');
    
                                :EMAIL = FN_PARAMETRO('SISTEMA.EMAIL_EST_PDV_INDISPONIVEL');
                                :FLAG_ENVIO_EMAIL    = CAST(FN_PARAMETRO('SISTEMA.FLAG_ESTOQUE_PDV') AS INTEGER);
    
                               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 AND :FLAG_ENVIO_EMAIL = 1)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
                BEGIN

                    /* INSERIR TRANSACAO */
                    UPDATE TBPDV_CFE_ITEM SET ESTOQUE_ID = 1 WHERE ID = :ID;

                    /* ATUALIZAR TRATAMENTO DO ITEM */
                    UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 1 WHERE PDV_CFE_ITEM_ID = :ID;

                END


            END ELSE
            IF(:ACAO = 2) THEN  /* EXCLUIR TRANSAÇÃO DE ESTOQUE */
            BEGIN
                IF(:CONTROLE_ESTOQUE = '1') THEN
                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
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_CFE_ITEM_PEDIDO (
    PDV_CFE_ID integer,
    PDV_CFE_ITEM_ID integer,
    ACAO integer,
    OFFLINE integer = 0)
as
declare variable PEDIDO_ITEM_ID integer;
declare variable QUANTIDADE numeric(10,5);
declare variable TAMANHO integer;
declare variable SITUACAO_PEDIDO_ITEM integer;
declare variable T01 numeric(10,5);
declare variable T02 numeric(10,5);
declare variable T03 numeric(10,5);
declare variable T04 numeric(10,5);
declare variable T05 numeric(10,5);
declare variable T06 numeric(10,5);
declare variable T07 numeric(10,5);
declare variable T08 numeric(10,5);
declare variable T09 numeric(10,5);
declare variable T10 numeric(10,5);
declare variable T11 numeric(10,5);
declare variable T12 numeric(10,5);
declare variable T13 numeric(10,5);
declare variable T14 numeric(10,5);
declare variable T15 numeric(10,5);
declare variable T16 numeric(10,5);
declare variable T17 numeric(10,5);
declare variable T18 numeric(10,5);
declare variable T19 numeric(10,5);
declare variable T20 numeric(10,5);
BEGIN

    FOR SELECT
        A.ID,
        A.PEDIDO_ITEM_ID,
        A.QUANTIDADE,
        A.TAMANHO
    FROM TBPDV_CFE_ITEM A
    WHERE A.PEDIDO_ITEM_ID > 0
      AND A.PDV_CFE_ID = :PDV_CFE_ID
      AND A.ID = :PDV_CFE_ITEM_ID
    INTO
    :PDV_CFE_ITEM_ID, :PEDIDO_ITEM_ID, :QUANTIDADE, :TAMANHO
    DO BEGIN

        :T01 = 0;
        :T02 = 0;
        :T03 = 0;
        :T04 = 0;
        :T05 = 0;
        :T06 = 0;
        :T07 = 0;
        :T08 = 0;
        :T09 = 0;
        :T10 = 0;
        :T11 = 0;
        :T12 = 0;
        :T13 = 0;
        :T14 = 0;
        :T15 = 0;
        :T16 = 0;
        :T17 = 0;
        :T18 = 0;
        :T19 = 0;
        :T20 = 0;


        IF(:TAMANHO = 1) THEN :T01 = :QUANTIDADE;
        IF(:TAMANHO = 2) THEN :T02 = :QUANTIDADE;
        IF(:TAMANHO = 3) THEN :T03 = :QUANTIDADE;
        IF(:TAMANHO = 4) THEN :T04 = :QUANTIDADE;
        IF(:TAMANHO = 5) THEN :T05 = :QUANTIDADE;
        IF(:TAMANHO = 6) THEN :T06 = :QUANTIDADE;
        IF(:TAMANHO = 7) THEN :T07 = :QUANTIDADE;
        IF(:TAMANHO = 8) THEN :T08 = :QUANTIDADE;
        IF(:TAMANHO = 9) THEN :T09 = :QUANTIDADE;
        IF(:TAMANHO = 10) THEN :T10 = :QUANTIDADE;
        IF(:TAMANHO = 11) THEN :T11 = :QUANTIDADE;
        IF(:TAMANHO = 12) THEN :T12 = :QUANTIDADE;
        IF(:TAMANHO = 13) THEN :T13 = :QUANTIDADE;
        IF(:TAMANHO = 14) THEN :T14 = :QUANTIDADE;
        IF(:TAMANHO = 15) THEN :T15 = :QUANTIDADE;
        IF(:TAMANHO = 16) THEN :T16 = :QUANTIDADE;
        IF(:TAMANHO = 17) THEN :T17 = :QUANTIDADE;
        IF(:TAMANHO = 18) THEN :T18 = :QUANTIDADE;
        IF(:TAMANHO = 19) THEN :T19 = :QUANTIDADE;
        IF(:TAMANHO = 20) THEN :T20 = :QUANTIDADE;


        /* REALIZAR BAIXA DE PEDIDO */
        IF (:ACAO = 1) THEN
           BEGIN

               UPDATE TBPEDIDO_ITEM_SALDO SET
               QUANTIDADE = QUANTIDADE - :QUANTIDADE,
               T01 = T01 - :T01,   T02 = T02 - :T02,   T03 = T03 - :T03,
               T04 = T04 - :T04,   T05 = T05 - :T05,   T06 = T06 - :T06,
               T07 = T07 - :T07,   T08 = T08 - :T08,   T09 = T09 - :T09,
               T10 = T10 - :T10,   T11 = T11 - :T11,   T12 = T12 - :T12,
               T13 = T13 - :T13,   T14 = T14 - :T14,   T15 = T15 - :T15,
               T16 = T16 - :T16,   T17 = T17 - :T17,   T18 = T18 - :T18,
               T19 = T19 - :T19,   T20 = T20 - :T20
               WHERE PEDIDO_ITEM_CONTROLE = :PEDIDO_ITEM_ID;
               
               UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET PEDIDO = 1 WHERE PDV_CFE_ITEM_ID = :PDV_CFE_ITEM_ID;

               IF(:OFFLINE = 1) THEN
               BEGIN
                  UPDATE TBPEDIDO_ITEM SET SITUACAO = 2 WHERE CONTROLE = :PEDIDO_ITEM_ID;
               END

               WHEN ANY DO
               BEGIN
                
                    INSERT INTO TBERROR_LOG_ESTOQUE (TABELA, TABELA_ID, MENSAGEM)
                    VALUES ('TBPDV_CFE_ITEM', :PDV_CFE_ITEM_ID, 'ERRO NA ATUALIZACAO DE SALDO DO ITEM DE PEDIDO (PROCEDURE: SP_CFE_ITEM_PEDIDO)');

                    SELECT FIRST 1 T.SITUACAO FROM TBPEDIDO_ITEM T WHERE T.controle = :PEDIDO_ITEM_ID INTO :SITUACAO_PEDIDO_ITEM;

                    IF(COALESCE(SITUACAO_PEDIDO_ITEM, 0) = 1) THEN
                    BEGIN
                        UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET PEDIDO = 0 WHERE PDV_CFE_ITEM_ID = :PDV_CFE_ITEM_ID;
                    END ELSE
                    BEGIN
                        UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET PEDIDO = 1 WHERE PDV_CFE_ITEM_ID = :PDV_CFE_ITEM_ID;
                    END
               END

           END
           /* DESFAZ BAIXA DE PEDIDO */
           ELSE IF(:ACAO = 2) THEN
           BEGIN

               UPDATE TBPEDIDO_ITEM_SALDO SET
                   QUANTIDADE = QUANTIDADE + :QUANTIDADE,
                   T01 = T01 + :T01,   T02 = T02 + :T02,   T03 = T03 + :T03,
                   T04 = T04 + :T04,   T05 = T05 + :T05,   T06 = T06 + :T06,
                   T07 = T07 + :T07,   T08 = T08 + :T08,   T09 = T09 + :T09,
                   T10 = T10 + :T10,   T11 = T11 + :T11,   T12 = T12 + :T12,
                   T13 = T13 + :T13,   T14 = T14 + :T14,   T15 = T15 + :T15,
                   T16 = T16 + :T16,   T17 = T17 + :T17,   T18 = T18 + :T18,
                   T19 = T19 + :T19,   T20 = T20 + :T20
               WHERE PEDIDO_ITEM_CONTROLE = :PEDIDO_ITEM_ID;


               UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET PEDIDO = 0 WHERE PDV_CFE_ITEM_ID = :PDV_CFE_ITEM_ID;

               IF(:OFFLINE = 1) THEN
               BEGIN
                  UPDATE TBPEDIDO_ITEM SET SITUACAO = 1 WHERE CONTROLE = :PEDIDO_ITEM_ID;
               END


           END

       END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_CFE_PEDIDO (
    PDV_CFE_ID integer,
    ACAO integer,
    OFFLINE integer = 0)
as
declare variable PDV_CFE_ITEM_ID integer;
declare variable PEDIDO_ITEM_ID integer;
declare variable QUANTIDADE numeric(10,5);
declare variable TAMANHO integer;
declare variable SITUACAO_PEDIDO_ITEM integer;
declare variable T01 numeric(10,5);
declare variable T02 numeric(10,5);
declare variable T03 numeric(10,5);
declare variable T04 numeric(10,5);
declare variable T05 numeric(10,5);
declare variable T06 numeric(10,5);
declare variable T07 numeric(10,5);
declare variable T08 numeric(10,5);
declare variable T09 numeric(10,5);
declare variable T10 numeric(10,5);
declare variable T11 numeric(10,5);
declare variable T12 numeric(10,5);
declare variable T13 numeric(10,5);
declare variable T14 numeric(10,5);
declare variable T15 numeric(10,5);
declare variable T16 numeric(10,5);
declare variable T17 numeric(10,5);
declare variable T18 numeric(10,5);
declare variable T19 numeric(10,5);
declare variable T20 numeric(10,5);
BEGIN

    FOR SELECT
        A.ID,
        A.PEDIDO_ITEM_ID,
        A.QUANTIDADE,
        A.TAMANHO
    FROM TBPDV_CFE_ITEM A
    WHERE A.PEDIDO_ITEM_ID > 0
      AND A.PDV_CFE_ID = :PDV_CFE_ID
    INTO
    :PDV_CFE_ITEM_ID, :PEDIDO_ITEM_ID, :QUANTIDADE, :TAMANHO
    DO BEGIN

        :T01 = 0;
        :T02 = 0;
        :T03 = 0;
        :T04 = 0;
        :T05 = 0;
        :T06 = 0;
        :T07 = 0;
        :T08 = 0;
        :T09 = 0;
        :T10 = 0;
        :T11 = 0;
        :T12 = 0;
        :T13 = 0;
        :T14 = 0;
        :T15 = 0;
        :T16 = 0;
        :T17 = 0;
        :T18 = 0;
        :T19 = 0;
        :T20 = 0;


        IF(:TAMANHO = 1) THEN :T01 = :QUANTIDADE;
        IF(:TAMANHO = 2) THEN :T02 = :QUANTIDADE;
        IF(:TAMANHO = 3) THEN :T03 = :QUANTIDADE;
        IF(:TAMANHO = 4) THEN :T04 = :QUANTIDADE;
        IF(:TAMANHO = 5) THEN :T05 = :QUANTIDADE;
        IF(:TAMANHO = 6) THEN :T06 = :QUANTIDADE;
        IF(:TAMANHO = 7) THEN :T07 = :QUANTIDADE;
        IF(:TAMANHO = 8) THEN :T08 = :QUANTIDADE;
        IF(:TAMANHO = 9) THEN :T09 = :QUANTIDADE;
        IF(:TAMANHO = 10) THEN :T10 = :QUANTIDADE;
        IF(:TAMANHO = 11) THEN :T11 = :QUANTIDADE;
        IF(:TAMANHO = 12) THEN :T12 = :QUANTIDADE;
        IF(:TAMANHO = 13) THEN :T13 = :QUANTIDADE;
        IF(:TAMANHO = 14) THEN :T14 = :QUANTIDADE;
        IF(:TAMANHO = 15) THEN :T15 = :QUANTIDADE;
        IF(:TAMANHO = 16) THEN :T16 = :QUANTIDADE;
        IF(:TAMANHO = 17) THEN :T17 = :QUANTIDADE;
        IF(:TAMANHO = 18) THEN :T18 = :QUANTIDADE;
        IF(:TAMANHO = 19) THEN :T19 = :QUANTIDADE;
        IF(:TAMANHO = 20) THEN :T20 = :QUANTIDADE;


        /* REALIZAR BAIXA DE PEDIDO */
        IF (:ACAO = 1) THEN
           BEGIN

               UPDATE TBPEDIDO_ITEM_SALDO SET
               QUANTIDADE = QUANTIDADE - :QUANTIDADE,
               T01 = T01 - :T01,   T02 = T02 - :T02,   T03 = T03 - :T03,
               T04 = T04 - :T04,   T05 = T05 - :T05,   T06 = T06 - :T06,
               T07 = T07 - :T07,   T08 = T08 - :T08,   T09 = T09 - :T09,
               T10 = T10 - :T10,   T11 = T11 - :T11,   T12 = T12 - :T12,
               T13 = T13 - :T13,   T14 = T14 - :T14,   T15 = T15 - :T15,
               T16 = T16 - :T16,   T17 = T17 - :T17,   T18 = T18 - :T18,
               T19 = T19 - :T19,   T20 = T20 - :T20
               WHERE PEDIDO_ITEM_CONTROLE = :PEDIDO_ITEM_ID;
               


               UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET PEDIDO = 1 WHERE PDV_CFE_ITEM_ID = :PDV_CFE_ITEM_ID;

               IF(:OFFLINE = 1) THEN
               BEGIN
                  UPDATE TBPEDIDO_ITEM SET SITUACAO = 2 WHERE CONTROLE = :PEDIDO_ITEM_ID;
               END


               WHEN ANY DO
               BEGIN
                    
                    INSERT INTO TBERROR_LOG_ESTOQUE (TABELA, TABELA_ID, MENSAGEM)
                    VALUES ('TBPDV_CFE_ITEM', :PDV_CFE_ITEM_ID, 'ERRO NA ATUALIZACAO DE SALDO DO ITEM DE PEDIDO (PROCEDURE: SP_CFE_PEDIDO)');
                
                    SELECT FIRST 1 T.SITUACAO FROM TBPEDIDO_ITEM T WHERE T.controle = :PEDIDO_ITEM_ID INTO :SITUACAO_PEDIDO_ITEM;

                    IF(COALESCE(SITUACAO_PEDIDO_ITEM, 0) = 1) THEN
                    BEGIN
                        UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET PEDIDO = 0 WHERE PDV_CFE_ITEM_ID = :PDV_CFE_ITEM_ID;
                    END ELSE
                    BEGIN
                        UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET PEDIDO = 1 WHERE PDV_CFE_ITEM_ID = :PDV_CFE_ITEM_ID;
                    END
               END

           END
           /* DESFAZ BAIXA DE PEDIDO */
           ELSE IF(:ACAO = 2) THEN
           BEGIN

               UPDATE TBPEDIDO_ITEM_SALDO SET
                   QUANTIDADE = QUANTIDADE + :QUANTIDADE,
                   T01 = T01 + :T01,   T02 = T02 + :T02,   T03 = T03 + :T03,
                   T04 = T04 + :T04,   T05 = T05 + :T05,   T06 = T06 + :T06,
                   T07 = T07 + :T07,   T08 = T08 + :T08,   T09 = T09 + :T09,
                   T10 = T10 + :T10,   T11 = T11 + :T11,   T12 = T12 + :T12,
                   T13 = T13 + :T13,   T14 = T14 + :T14,   T15 = T15 + :T15,
                   T16 = T16 + :T16,   T17 = T17 + :T17,   T18 = T18 + :T18,
                   T19 = T19 + :T19,   T20 = T20 + :T20
               WHERE PEDIDO_ITEM_CONTROLE = :PEDIDO_ITEM_ID;


               UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET PEDIDO = 0 WHERE PDV_CFE_ITEM_ID = :PDV_CFE_ITEM_ID;

               IF(:OFFLINE = 1) THEN
               BEGIN
                  UPDATE TBPEDIDO_ITEM SET SITUACAO = 1 WHERE CONTROLE = :PEDIDO_ITEM_ID;
               END

               WHEN ANY DO
               BEGIN
                    UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET PEDIDO = 0 WHERE PDV_CFE_ITEM_ID = :PDV_CFE_ITEM_ID;
    
               END


           END

       END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_CFE_CONFERENCIA (
    PDV_CFE_ID integer,
    ACAO integer)
as
declare variable PDV_CFE_ITEM_ID integer;
declare variable CONFERENCIA_ITEM_ID integer;
declare variable QUANTIDADE numeric(10,5);
declare variable TAMANHO integer;
declare variable CONFERENCIA_ID integer;
BEGIN
      IF (:ACAO = 1) THEN
      BEGIN
        FOR SELECT
            A.conferencia_id
        FROM TBPDV_CFE_ITEM A
        WHERE A.CONFERENCIA_ITEM_ID > 0
          AND A.PDV_CFE_ID = :PDV_CFE_ID
          GROUP BY A.conferencia_id
        INTO :CONFERENCIA_ID
        DO BEGIN
            /* DESFAZ BAIXA DE CR??DITO DO COLABORADOR*/
              EXECUTE PROCEDURE SP_SALDO_COLAB_PRE_PEDIDO(:CONFERENCIA_ID,2);
           END
       END


        FOR SELECT
            A.ID,
            A.CONFERENCIA_ITEM_ID,
            A.QUANTIDADE,
            A.TAMANHO
        FROM TBPDV_CFE_ITEM A
        WHERE A.CONFERENCIA_ITEM_ID > 0
          AND A.PDV_CFE_ID = :PDV_CFE_ID
        INTO
        :PDV_CFE_ITEM_ID, :CONFERENCIA_ITEM_ID, :QUANTIDADE, :TAMANHO
        DO BEGIN

        /* REALIZAR BAIXA DE CONFERENCIA */
        IF (:ACAO = 1) THEN
           BEGIN
                UPDATE TBPDV_CONFERENCIA_ITEM_SALDO T
                    SET T.QUANTIDADE = IIF(QUANTIDADE = 0, 0, QUANTIDADE - :QUANTIDADE)
                WHERE T.PDV_CONFERENCIA_ITEM_ID = :CONFERENCIA_ITEM_ID
                AND T.TAMANHO = :TAMANHO;

                UPDATE TBPDV_CONFERENCIA_ITEM T SET T.SITUACAO = 3 WHERE T.ID = :CONFERENCIA_ITEM_ID;

                WHEN ANY DO
                BEGIN
                    INSERT INTO TBERROR_LOG_ESTOQUE (TABELA, TABELA_ID, MENSAGEM)
                    VALUES ('TBPDV_CFE_ITEM', :PDV_CFE_ITEM_ID, 'ERRO NA ATUALIZACAO DE SALDO DO ITEM DE PRE PEDIDO (PROCEDURE: SP_CFE_CONFERENCIA)');
                END

           END
           /* DESFAZ BAIXA DE CONFERENCIA */
           ELSE IF(:ACAO = 2) THEN
           BEGIN
                UPDATE TBPDV_CONFERENCIA_ITEM_SALDO T
                    SET T.QUANTIDADE = QUANTIDADE + :QUANTIDADE
                WHERE T.PDV_CONFERENCIA_ITEM_ID = :CONFERENCIA_ITEM_ID
                AND T.TAMANHO = :TAMANHO;

                UPDATE TBPDV_CONFERENCIA_ITEM T SET T.SITUACAO = 0 WHERE T.ID = :CONFERENCIA_ITEM_ID;

           END

       END


     IF(:ACAO = 2) THEN
     BEGIN
        FOR SELECT
            A.conferencia_id
        FROM TBPDV_CFE_ITEM A
        WHERE A.CONFERENCIA_ITEM_ID > 0
          AND A.PDV_CFE_ID = :PDV_CFE_ID
          GROUP BY A.conferencia_id
        INTO :CONFERENCIA_ID
        DO BEGIN
            /* REALIZAR BAIXA DE CR??DITO DO COLABORADOR*/
              EXECUTE PROCEDURE SP_SALDO_COLAB_PRE_PEDIDO(:CONFERENCIA_ID,1);
           END
       END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_CFE_ITEM_CONFERENCIA (
    PDV_CFE_ID integer,
    PDV_CFE_ITEM_ID integer,
    ACAO integer)
as
declare variable ITEM_ID integer;
declare variable CONFERENCIA_ITEM_ID integer;
declare variable QUANTIDADE numeric(10,5);
declare variable TAMANHO integer;
BEGIN

    FOR SELECT
        A.ID,
        A.CONFERENCIA_ITEM_ID,
        A.QUANTIDADE,
        A.TAMANHO
    FROM TBPDV_CFE_ITEM A
    WHERE A.CONFERENCIA_ITEM_ID > 0
      AND A.PDV_CFE_ID = :PDV_CFE_ID
      AND A.ID = :PDV_CFE_ITEM_ID
    INTO
    :ITEM_ID, :CONFERENCIA_ITEM_ID, :QUANTIDADE, :TAMANHO
    DO BEGIN

        /* REALIZAR BAIXA DE CONFERENCIA */
        IF (:ACAO = 1) THEN
           BEGIN
                UPDATE TBPDV_CONFERENCIA_ITEM_SALDO T
                    SET T.QUANTIDADE = IIF(QUANTIDADE = 0, 0, QUANTIDADE - :QUANTIDADE)
                WHERE T.PDV_CONFERENCIA_ITEM_ID = :CONFERENCIA_ITEM_ID
                AND T.TAMANHO = :TAMANHO;

                UPDATE TBPDV_CONFERENCIA_ITEM T SET T.SITUACAO = 3 WHERE T.ID = :CONFERENCIA_ITEM_ID;

                WHEN ANY DO
                BEGIN
                    INSERT INTO TBERROR_LOG_ESTOQUE (TABELA, TABELA_ID, MENSAGEM)
                    VALUES ('TBPDV_CFE_ITEM', :PDV_CFE_ITEM_ID, 'ERRO NA ATUALIZACAO DE SALDO DO ITEM DE PRE PEDIDO (PROCEDURE: SP_CFE_ITEM_CONFERENCIA)');
                END

           END
           /* DESFAZ BAIXA DE CONFERENCIA */
           ELSE IF(:ACAO = 2) THEN
           BEGIN
                UPDATE TBPDV_CONFERENCIA_ITEM_SALDO T
                    SET T.QUANTIDADE = QUANTIDADE + :QUANTIDADE
                WHERE T.PDV_CONFERENCIA_ITEM_ID = :CONFERENCIA_ITEM_ID
                AND T.TAMANHO = :TAMANHO;

                UPDATE TBPDV_CONFERENCIA_ITEM T SET T.SITUACAO = 0 WHERE T.ID = :CONFERENCIA_ITEM_ID;

           END

       END

END
^

SET TERM ; ^

