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 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;
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
        FROM TBPDV_CFE_ITEM T
        INNER JOIN TBPRODUTO P ON P.CODIGO = T.PRODUTO_ID
        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
        
        DO BEGIN

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

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

                IF(:SALDO < :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;

                    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;