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 TAMANHO integer;
declare variable QUANTIDADE numeric(15,2);
declare variable SALDO numeric(15,2);
declare variable LOCALIZACAO_ID integer;
declare variable OPERACAO_CODIGO varchar(3);
declare variable ESTOQUE_ID integer;
declare variable SEQUENCIA integer;
declare variable EMAIL varchar(300);
declare variable CORPO varchar(1000);
declare variable TRANSACAO_ID integer;
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
        FROM TBPDV_CFE_ITEM T
        WHERE T.PDV_CFE_ID = :PDV_CFE_ID
        INTO :ID, :PRODUTO_ID, :PRODUTO_DESCRICAO, :LOCALIZACAO_ID,
            :OPERACAO_CODIGO, :TAMANHO, :QUANTIDADE, :ESTOQUE_ID, :SEQUENCIA
        
        DO BEGIN


            IF(:ACAO = 1) THEN   /* INSERT - REALIZAR TRANSAÇÃO DE ESTOQUE */
            BEGIN
                :SALDO = FN_ARRAY(COALESCE((SELECT
                    S.T01_SALDO||'|'||S.T02_SALDO||'|'||S.T03_SALDO||'|'||S.T04_SALDO||'|'||S.T05_SALDO||'|'||
                    S.T06_SALDO||'|'||S.T07_SALDO||'|'||S.T08_SALDO||'|'||S.T09_SALDO||'|'||S.T10_SALDO||'|'||
                    S.T11_SALDO||'|'||S.T12_SALDO||'|'||S.T13_SALDO||'|'||S.T14_SALDO||'|'||S.T15_SALDO||'|'||
                    S.T16_SALDO||'|'||S.T17_SALDO||'|'||S.T18_SALDO||'|'||S.T19_SALDO||'|'||S.T20_SALDO
                    FROM TBESTOQUE_SALDO S
                    WHERE S.LOCALIZACAO_CODIGO = :LOCALIZACAO_ID
                    AND S.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_ID
                    AND S.PRODUTO_CODIGO = :PRODUTO_ID),'0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0'), :TAMANHO,'|');
        
                IF(:SALDO < :QUANTIDADE) THEN
                    BEGIN
                       :EMAIL = FN_PARAMETRO('SISTEMA.EMAIL_EST_PDV_INDISPONIVEL');
        
                       CORPO = 'ESTOQUE INDISPONIVEL PARA IMPORTACAO DE ITENS DO MFE: '||:NUMERO_CFE||'-'||:SERIE_CFE||'<BR>';
                            CORPO = CORPO||'ESTABELECIMENTO: '||:ESTABELECIMENTO_ID||'<BR>';
                            CORPO = CORPO||'LOCALIZACAO: '||:LOCALIZACAO_ID||'<BR>';
                            CORPO = CORPO||'PRODUTO: '||:PRODUTO_ID||' - '||:PRODUTO_DESCRICAO||'<BR>';
                            CORPO = CORPO||'TAMANHO: '||: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 = 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, :ID, 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;